diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 50fa001df5..419e88052a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -13,11 +13,13 @@ assignees: '' **Issue**: *Explain your issue in detail.* -**Steps to reproduce**: *How you happened across the issue, and what you were doing at the time.* +**Steps to reproduce**: *How you happened across the issue, and what exactly you did to make the bug happen.* -**Link to mod(s) used, if applicable**: *The mod repositories or zip files that are related to the issue.* +**Link(s) to mod(s) used**: *The mod repositories or zip files that are related to the issue, if applicable.* -**Crash report, if applicable**: *The contents of relevant crash report files.* +**Save file**: *The save file you were playing on when the bug happened, if applicable.* + +**Crash report**: *The contents of relevant crash report files. REQUIRED if you are reporting a crash.* --- diff --git a/.gitignore b/.gitignore index 1a50ef27f2..543197c2f8 100644 --- a/.gitignore +++ b/.gitignore @@ -79,9 +79,11 @@ com_crashlytics_export_strings.xml /android/bin/ /core/bin/ /desktop/bin/ -/html/bin/ /ios/bin/ -/ios-moe/bin/ +/annotations/bin/ +/server/bin/ +/tests/bin/ +/tools/bin/ *.tmp *.bak *.swp diff --git a/.travis.yml b/.travis.yml index ef04618dc9..ca66d67e1e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ jdk: -- openjdk8 +- openjdk14 dist: xenial android: components: @@ -26,6 +26,7 @@ script: - cp -a Mindustry/core/build/docs/javadoc/. docs/ - cd docs - if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git add .; git commit -m "Update ${TRAVIS_BUILD_NUMBER}"; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/MindustryGame/docs; fi +- cd ../Mindustry deploy: - provider: releases skip_cleanup: true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fe38a3a925..58eed0c4fd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,3 +68,6 @@ If something needs to be encapsulated in the future, IntelliJ can handle it with #### 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 +If you would like your name to appear in the game's credits, add it to the [list of contributors](https://github.com/Anuken/Mindustry/blob/master/core/assets/contributors) as part of your PR. diff --git a/README.md b/README.md index 7f0e6208bc..8006e6e11a 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ See [CONTRIBUTING](CONTRIBUTING.md). ### Building -Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Old builds might still be on [jenkins](https://jenkins.hellomouse.net/job/mindustry/). +Bleeding-edge builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). If you'd rather compile on your own, follow these instructions. First, make sure you have [JDK 14](https://adoptopenjdk.net/) installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands: @@ -39,9 +39,10 @@ Server builds are bundled with each released build (in Releases). If you'd rathe #### Android 1. Install the Android SDK [here.](https://developer.android.com/studio#downloads) Make sure you're downloading the "Command line tools only", as Android Studio is not required. -2. Create a file named `local.properties` inside the Mindustry directory, with its contents looking like this: `sdk.dir=`. For example, if you're on Windows and installed the tools to C:\\tools, your local.properties would contain `sdk.dir=C:\\tools` (*note the double backslashes are required instead of single ones!*). +2. Set the `ANDROID_HOME` environment variable to point to your unzipped Android SDK directory. 3. Run `gradlew android:assembleDebug` (or `./gradlew` if on linux/mac). This will create an unsigned APK in `android/build/outputs/apk`. -4. (Optional) To debug the application on a connected phone, do `gradlew android:installDebug android:run`. It is **highly recommended** to use IntelliJ for this instead. + +To debug the application on a connected phone, run `gradlew android:installDebug android:run`. ##### Troubleshooting diff --git a/android/build.gradle b/android/build.gradle index ef1791a9b6..2f040cc07c 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -34,7 +34,8 @@ dependencies{ natives "com.github.Anuken.Arc:natives-freetype-android:${getArcHash()}" natives "com.github.Anuken.Arc:natives-box2d-android:${getArcHash()}" - if(localArc()) compileOnly fileTree(dir: '../../Arc/backends/backend-android/libs', include: ['*.jar']) + //android dependencies magically disappear during compilation, thanks gradle! + if(new File(projectDir.parent, '../Arc').exists()) compileOnly fileTree(dir: '../../Arc/backends/backend-android/libs', include: ['*.jar']) } task deploy(type: Copy){ diff --git a/android/src/mindustry/android/AndroidRhinoContext.java b/android/src/mindustry/android/AndroidRhinoContext.java index c4468ecead..d3e80c7427 100644 --- a/android/src/mindustry/android/AndroidRhinoContext.java +++ b/android/src/mindustry/android/AndroidRhinoContext.java @@ -41,6 +41,11 @@ public class AndroidRhinoContext{ public Object getDynamicSecurityDomain(Object o){ return null; } + + @Override + public Object callWithDomain(Object o, Context context, Callable callable, Scriptable scriptable, Scriptable scriptable1, Object[] objects){ + return null; + } }); AndroidContextFactory factory; diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java index 341b26df3a..05872c155b 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java @@ -147,6 +147,12 @@ public class EntityIO{ io(field.type, ""); + //just assign the two values so jumping does not occur on de-possession + if(sf){ + st(field.name + lastSuf + " = this." + field.name); + st(field.name + targetSuf + " = this." + field.name); + } + econt(); } } diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index 4de2254f7f..8516e03b05 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -468,6 +468,17 @@ public class EntityProcess extends BaseProcessor{ mbuilder.addStatement("$L = $L", field.name(), field.name() + EntityIO.targetSuf); } } + + //SPECIAL CASE: method to snap to current position so interpolation doesn't go wild + if(first.name().equals("snapInterpolation")){ + mbuilder.addStatement("updateSpacing = 16"); + mbuilder.addStatement("lastUpdated = $T.millis()", Time.class); + for(Svar field : syncedFields){ + //reset last+current state to target position + mbuilder.addStatement("$L = $L", field.name() + EntityIO.lastSuf, field.name()); + mbuilder.addStatement("$L = $L", field.name() + EntityIO.targetSuf, field.name()); + } + } } for(Smethod elem : entry.value){ @@ -631,10 +642,10 @@ public class EntityProcess extends BaseProcessor{ //build mapping class for sync IDs TypeSpec.Builder idBuilder = TypeSpec.classBuilder("EntityMapping").addModifiers(Modifier.PUBLIC) - .addField(FieldSpec.builder(TypeName.get(Prov[].class), "idMap", Modifier.PRIVATE, Modifier.STATIC).initializer("new Prov[256]").build()) + .addField(FieldSpec.builder(TypeName.get(Prov[].class), "idMap", Modifier.PUBLIC, Modifier.STATIC).initializer("new Prov[256]").build()) .addField(FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(ObjectMap.class), tname(String.class), tname(Prov.class)), - "nameMap", Modifier.PRIVATE, Modifier.STATIC).initializer("new ObjectMap<>()").build()) + "nameMap", Modifier.PUBLIC, Modifier.STATIC).initializer("new ObjectMap<>()").build()) .addMethod(MethodSpec.methodBuilder("map").addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(TypeName.get(Prov.class)).addParameter(int.class, "id").addStatement("return idMap[id]").build()) .addMethod(MethodSpec.methodBuilder("map").addModifiers(Modifier.PUBLIC, Modifier.STATIC) diff --git a/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java b/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java index b43a2d3eef..e28ecf13a0 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java @@ -68,9 +68,9 @@ public class CallSuperProcess extends AbstractProcessor{ } static class CodeAnalyzerTreeScanner extends TreePathScanner{ - private String methodName; - private MethodTree method; - private boolean callSuperUsed; + String methodName; + MethodTree method; + boolean callSuperUsed; @Override public Object visitClass(ClassTree classTree, Trees trees){ @@ -83,6 +83,9 @@ public class CallSuperProcess extends AbstractProcessor{ if(extendTree instanceof JCIdent){ JCIdent tree = (JCIdent)extendTree; + + if(tree == null || tree.sym == null) return super.visitClass(classTree, trees); + com.sun.tools.javac.code.Scope members = tree.sym.members(); if(checkScope(members)) diff --git a/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java b/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java index 2a7f7034e1..eca5d84387 100644 --- a/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java @@ -71,22 +71,17 @@ public class LogicStatementProcessor extends BaseProcessor{ writer.addStatement("out.append(\" \")"); writer.addStatement("out.append((($T)obj).$L$L)", c.mirror(), field.name(), - field.mirror().toString().equals("java.lang.String") ? - ".replace(\"\\n\", \"\\\\n\")" : - Seq.with(typeu.directSupertypes(field.mirror())).contains(t -> t.toString().contains("java.lang.Enum")) ? ".name()" : - ""); + Seq.with(typeu.directSupertypes(field.mirror())).contains(t -> t.toString().contains("java.lang.Enum")) ? ".name()" : + ""); //reading primitives, strings and enums is supported; nothing else is - reader.addStatement("if(tokens.length > $L) result.$L = $L(tokens[$L])$L", + reader.addStatement("if(tokens.length > $L) result.$L = $L(tokens[$L])", index + 1, field.name(), field.mirror().toString().equals("java.lang.String") ? "" : (field.tname().isPrimitive() ? field.tname().box().toString() : field.mirror().toString()) + ".valueOf", //if it's not a string, it must have a valueOf method - index + 1, - field.mirror().toString().equals("java.lang.String") ? - ".replace(\"\\\\n\", \"\\n\")" : - "" + index + 1 ); index ++; diff --git a/annotations/src/main/resources/classids.properties b/annotations/src/main/resources/classids.properties index 288f09bdbe..11943b3c8e 100644 --- a/annotations/src/main/resources/classids.properties +++ b/annotations/src/main/resources/classids.properties @@ -16,6 +16,7 @@ mindustry.entities.comp.PlayerComp=12 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 poly=18 diff --git a/annotations/src/main/resources/revisions/Bullet/0.json b/annotations/src/main/resources/revisions/Bullet/0.json index f9e8a830d5..df860d9a0f 100644 --- a/annotations/src/main/resources/revisions/Bullet/0.json +++ b/annotations/src/main/resources/revisions/Bullet/0.json @@ -1 +1 @@ -{fields:[{name:collided,type:arc.struct.IntSeq,size:-1},{name:damage,type:float,size:4},{name:data,type:java.lang.Object,size:-1},{name:lifetime,type:float,size:4},{name:owner,type:mindustry.gen.Entityc,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:type,type:mindustry.entities.bullet.BulletType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file +{fields:[{name:collided,type:arc.struct.IntSeq,size:-1},{name:damage,type:float,size:4},{name:data,type:java.lang.Object,size:-1},{name:fdata,type:float,size:4},{name:lifetime,type:float,size:4},{name:owner,type:mindustry.gen.Entityc,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:type,type:mindustry.entities.bullet.BulletType,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/Bullet/1.json b/annotations/src/main/resources/revisions/Bullet/1.json deleted file mode 100644 index bdb86498f2..0000000000 --- a/annotations/src/main/resources/revisions/Bullet/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:collided,type:arc.struct.IntSeq,size:-1},{name:damage,type:float,size:4},{name:data,type:java.lang.Object,size:-1},{name:lifetime,type:float,size:4},{name:owner,type:Entityc,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:type,type:mindustry.entities.bullet.BulletType,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/Bullet/2.json b/annotations/src/main/resources/revisions/Bullet/2.json deleted file mode 100644 index b28c91f9a7..0000000000 --- a/annotations/src/main/resources/revisions/Bullet/2.json +++ /dev/null @@ -1 +0,0 @@ -{version:2,fields:[{name:collided,type:arc.struct.IntSeq,size:-1},{name:damage,type:float,size:4},{name:data,type:java.lang.Object,size:-1},{name:lifetime,type:float,size:4},{name:owner,type:mindustry.gen.Entityc,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:type,type:mindustry.entities.bullet.BulletType,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/Bullet/3.json b/annotations/src/main/resources/revisions/Bullet/3.json deleted file mode 100644 index 012dbdff7e..0000000000 --- a/annotations/src/main/resources/revisions/Bullet/3.json +++ /dev/null @@ -1 +0,0 @@ -{version:3,fields:[{name:collided,type:arc.struct.IntSeq,size:-1},{name:damage,type:float,size:4},{name:data,type:java.lang.Object,size:-1},{name:lifetime,type:float,size:4},{name:owner,type:Entityc,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:type,type:mindustry.entities.bullet.BulletType,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/Bullet/4.json b/annotations/src/main/resources/revisions/Bullet/4.json deleted file mode 100644 index 9f4b9aa7fa..0000000000 --- a/annotations/src/main/resources/revisions/Bullet/4.json +++ /dev/null @@ -1 +0,0 @@ -{version:4,fields:[{name:collided,type:arc.struct.IntSeq,size:-1},{name:damage,type:float,size:4},{name:data,type:java.lang.Object,size:-1},{name:lifetime,type:float,size:4},{name:owner,type:Entityc,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:type,type:mindustry.entities.bullet.BulletType,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/Bullet/5.json b/annotations/src/main/resources/revisions/Bullet/5.json deleted file mode 100644 index f6224ade39..0000000000 --- a/annotations/src/main/resources/revisions/Bullet/5.json +++ /dev/null @@ -1 +0,0 @@ -{version:5,fields:[{name:collided,type:arc.struct.IntSeq,size:-1},{name:damage,type:float,size:4},{name:data,type:java.lang.Object,size:-1},{name:lifetime,type:float,size:4},{name:owner,type:Entityc,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:time,type:float,size:4},{name:type,type:mindustry.entities.bullet.BulletType,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/Fire/1.json b/annotations/src/main/resources/revisions/Fire/1.json new file mode 100644 index 0000000000..b410469512 --- /dev/null +++ b/annotations/src/main/resources/revisions/Fire/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:lifetime,type:float,size:4},{name:tile,type:mindustry.world.Tile,size:-1},{name:time,type:float,size:4},{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/ForceDraw/0.json b/annotations/src/main/resources/revisions/ForceDraw/0.json new file mode 100644 index 0000000000..9a76fbe28e --- /dev/null +++ b/annotations/src/main/resources/revisions/ForceDraw/0.json @@ -0,0 +1 @@ +{fields:[{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/WeatherState/2.json b/annotations/src/main/resources/revisions/WeatherState/2.json new file mode 100644 index 0000000000..d085d4d22f --- /dev/null +++ b/annotations/src/main/resources/revisions/WeatherState/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:effectTimer,type:float,size:4},{name:intensity,type:float,size:4},{name:life,type:float,size:4},{name:opacity,type:float,size:4},{name:weather,type:mindustry.type.Weather,size:-1},{name:windVector,type:arc.math.geom.Vec2,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 86f06caef2..7a9ebbbe7c 100644 --- a/build.gradle +++ b/build.gradle @@ -32,11 +32,11 @@ allprojects{ ext{ versionNumber = '6' - if(!project.hasProperty("versionModifier")) versionModifier = 'pre-alpha' + if(!project.hasProperty("versionModifier")) versionModifier = 'alpha' if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' - rhinoVersion = 'eeb327d141146663ff3924bd20d2a5da8a6439cc' + rhinoVersion = '8437435dab9993769d72739608580d40c5343285' loadVersionProps = { return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } @@ -187,6 +187,10 @@ configure(subprojects - project(":annotations")){ options.compilerArgs.addAll(['--release', '8']) } } + + tasks.withType(Javadoc){ + options.addStringOption('Xdoclint:none', '-quiet') + } } project(":desktop"){ @@ -257,7 +261,6 @@ project(":core"){ doLast{ def props = loadVersionProps() def androidVersion = props['androidBuildCode'].toInteger() - 2 - def buildVersion = props["build"] def loglines = file("../changelog").text.split("\n") def maxLength = 460 @@ -269,7 +272,6 @@ project(":core"){ } } def changelogs = file("../fastlane/metadata/android/en-US/changelogs/") - new File(changelogs, buildVersion + ".txt").text = (result) new File(changelogs, androidVersion + ".txt").text = (result) } } diff --git a/core/assets-raw/sprites/blocks/defense/overdrive-dome.png b/core/assets-raw/sprites/blocks/defense/overdrive-dome.png index 61515689d0..6bf8371b21 100644 Binary files a/core/assets-raw/sprites/blocks/defense/overdrive-dome.png and b/core/assets-raw/sprites/blocks/defense/overdrive-dome.png differ diff --git a/core/assets-raw/sprites/blocks/environment/ignarock1.png b/core/assets-raw/sprites/blocks/environment/basalt1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/ignarock1.png rename to core/assets-raw/sprites/blocks/environment/basalt1.png diff --git a/core/assets-raw/sprites/blocks/environment/ignarock2.png b/core/assets-raw/sprites/blocks/environment/basalt2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/ignarock2.png rename to core/assets-raw/sprites/blocks/environment/basalt2.png diff --git a/core/assets-raw/sprites/blocks/environment/ignarock3.png b/core/assets-raw/sprites/blocks/environment/basalt3.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/ignarock3.png rename to core/assets-raw/sprites/blocks/environment/basalt3.png diff --git a/core/assets-raw/sprites/blocks/environment/cliffs1.png b/core/assets-raw/sprites/blocks/environment/cliffs1.png deleted file mode 100644 index eb60a159df..0000000000 Binary files a/core/assets-raw/sprites/blocks/environment/cliffs1.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite-wall-large.png b/core/assets-raw/sprites/blocks/environment/dacite-wall-large.png new file mode 100644 index 0000000000..93e88e2888 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite-wall1.png b/core/assets-raw/sprites/blocks/environment/dacite-wall1.png new file mode 100644 index 0000000000..3f0f70e0a2 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite-wall1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite-wall2.png b/core/assets-raw/sprites/blocks/environment/dacite-wall2.png new file mode 100644 index 0000000000..07dd33ae40 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite-wall2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite1.png b/core/assets-raw/sprites/blocks/environment/dacite1.png new file mode 100644 index 0000000000..07a7a19ece Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite2.png b/core/assets-raw/sprites/blocks/environment/dacite2.png new file mode 100644 index 0000000000..f4e2ebe0d9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dacite3.png b/core/assets-raw/sprites/blocks/environment/dacite3.png new file mode 100644 index 0000000000..1580a22f07 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dacite3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt-wall-large.png b/core/assets-raw/sprites/blocks/environment/dirt-wall-large.png new file mode 100644 index 0000000000..649410e18a Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt-wall1.png b/core/assets-raw/sprites/blocks/environment/dirt-wall1.png new file mode 100644 index 0000000000..6250affd44 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt-wall1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt-wall2.png b/core/assets-raw/sprites/blocks/environment/dirt-wall2.png new file mode 100644 index 0000000000..4840a10535 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt-wall2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt1.png b/core/assets-raw/sprites/blocks/environment/dirt1.png new file mode 100644 index 0000000000..1f2b788140 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt2.png b/core/assets-raw/sprites/blocks/environment/dirt2.png new file mode 100644 index 0000000000..40e84864b8 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dirt3.png b/core/assets-raw/sprites/blocks/environment/dirt3.png new file mode 100644 index 0000000000..0bf0e1c7e8 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/dirt3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/dunerocks-large.png b/core/assets-raw/sprites/blocks/environment/dune-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/dunerocks-large.png rename to core/assets-raw/sprites/blocks/environment/dune-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/dunerocks1.png b/core/assets-raw/sprites/blocks/environment/dune-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/dunerocks1.png rename to core/assets-raw/sprites/blocks/environment/dune-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/dunerocks2.png b/core/assets-raw/sprites/blocks/environment/dune-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/dunerocks2.png rename to core/assets-raw/sprites/blocks/environment/dune-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/holostone1.png b/core/assets-raw/sprites/blocks/environment/holostone1.png deleted file mode 100644 index 4f25d079a3..0000000000 Binary files a/core/assets-raw/sprites/blocks/environment/holostone1.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/environment/holostone2.png b/core/assets-raw/sprites/blocks/environment/holostone2.png deleted file mode 100644 index e226a0497b..0000000000 Binary files a/core/assets-raw/sprites/blocks/environment/holostone2.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/environment/holostone3.png b/core/assets-raw/sprites/blocks/environment/holostone3.png deleted file mode 100644 index c11a6ce03e..0000000000 Binary files a/core/assets-raw/sprites/blocks/environment/holostone3.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/environment/icerocks-large.png b/core/assets-raw/sprites/blocks/environment/ice-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/icerocks-large.png rename to core/assets-raw/sprites/blocks/environment/ice-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/icerocks1.png b/core/assets-raw/sprites/blocks/environment/ice-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/icerocks1.png rename to core/assets-raw/sprites/blocks/environment/ice-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/icerocks2.png b/core/assets-raw/sprites/blocks/environment/ice-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/icerocks2.png rename to core/assets-raw/sprites/blocks/environment/ice-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/saltrocks-large.png b/core/assets-raw/sprites/blocks/environment/salt-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/saltrocks-large.png rename to core/assets-raw/sprites/blocks/environment/salt-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/saltrocks1.png b/core/assets-raw/sprites/blocks/environment/salt-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/saltrocks1.png rename to core/assets-raw/sprites/blocks/environment/salt-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/saltrocks2.png b/core/assets-raw/sprites/blocks/environment/salt-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/saltrocks2.png rename to core/assets-raw/sprites/blocks/environment/salt-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/sandrocks-large.png b/core/assets-raw/sprites/blocks/environment/sand-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sandrocks-large.png rename to core/assets-raw/sprites/blocks/environment/sand-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/sandrocks1.png b/core/assets-raw/sprites/blocks/environment/sand-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sandrocks1.png rename to core/assets-raw/sprites/blocks/environment/sand-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/sandrocks2.png b/core/assets-raw/sprites/blocks/environment/sand-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sandrocks2.png rename to core/assets-raw/sprites/blocks/environment/sand-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/shalerocks-large.png b/core/assets-raw/sprites/blocks/environment/shale-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/shalerocks-large.png rename to core/assets-raw/sprites/blocks/environment/shale-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/shalerocks1.png b/core/assets-raw/sprites/blocks/environment/shale-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/shalerocks1.png rename to core/assets-raw/sprites/blocks/environment/shale-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/shalerocks2.png b/core/assets-raw/sprites/blocks/environment/shale-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/shalerocks2.png rename to core/assets-raw/sprites/blocks/environment/shale-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/snowrocks-large.png b/core/assets-raw/sprites/blocks/environment/snow-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/snowrocks-large.png rename to core/assets-raw/sprites/blocks/environment/snow-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/snowrocks1.png b/core/assets-raw/sprites/blocks/environment/snow-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/snowrocks1.png rename to core/assets-raw/sprites/blocks/environment/snow-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/snowrocks2.png b/core/assets-raw/sprites/blocks/environment/snow-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/snowrocks2.png rename to core/assets-raw/sprites/blocks/environment/snow-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/sporerocks-large.png b/core/assets-raw/sprites/blocks/environment/spore-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sporerocks-large.png rename to core/assets-raw/sprites/blocks/environment/spore-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/sporerocks1.png b/core/assets-raw/sprites/blocks/environment/spore-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sporerocks1.png rename to core/assets-raw/sprites/blocks/environment/spore-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/sporerocks2.png b/core/assets-raw/sprites/blocks/environment/spore-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sporerocks2.png rename to core/assets-raw/sprites/blocks/environment/spore-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/rocks-large.png b/core/assets-raw/sprites/blocks/environment/stone-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/rocks-large.png rename to core/assets-raw/sprites/blocks/environment/stone-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/rocks1.png b/core/assets-raw/sprites/blocks/environment/stone-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/rocks1.png rename to core/assets-raw/sprites/blocks/environment/stone-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/rocks2.png b/core/assets-raw/sprites/blocks/environment/stone-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/rocks2.png rename to core/assets-raw/sprites/blocks/environment/stone-wall2.png diff --git a/core/assets-raw/sprites/blocks/logic/data-processor-top.png b/core/assets-raw/sprites/blocks/logic/data-processor-top.png deleted file mode 100644 index 2596221950..0000000000 Binary files a/core/assets-raw/sprites/blocks/logic/data-processor-top.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/logic/hyper-processor.png b/core/assets-raw/sprites/blocks/logic/hyper-processor.png new file mode 100644 index 0000000000..74dc55f3ea Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/hyper-processor.png differ diff --git a/core/assets-raw/sprites/blocks/logic/large-logic-display.png b/core/assets-raw/sprites/blocks/logic/large-logic-display.png new file mode 100644 index 0000000000..fb10d438bb Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/large-logic-display.png differ diff --git a/core/assets-raw/sprites/blocks/logic/logic-processor-3.png b/core/assets-raw/sprites/blocks/logic/logic-processor-3.png deleted file mode 100644 index 92bbec2528..0000000000 Binary files a/core/assets-raw/sprites/blocks/logic/logic-processor-3.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-cap.png b/core/assets-raw/sprites/blocks/power/steam-generator-cap.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-cap.png rename to core/assets-raw/sprites/blocks/power/steam-generator-cap.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-liquid.png b/core/assets-raw/sprites/blocks/power/steam-generator-liquid.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-liquid.png rename to core/assets-raw/sprites/blocks/power/steam-generator-liquid.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-top.png b/core/assets-raw/sprites/blocks/power/steam-generator-top.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-top.png rename to core/assets-raw/sprites/blocks/power/steam-generator-top.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-turbine0.png b/core/assets-raw/sprites/blocks/power/steam-generator-turbine0.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-turbine0.png rename to core/assets-raw/sprites/blocks/power/steam-generator-turbine0.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-turbine1.png b/core/assets-raw/sprites/blocks/power/steam-generator-turbine1.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-turbine1.png rename to core/assets-raw/sprites/blocks/power/steam-generator-turbine1.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator.png b/core/assets-raw/sprites/blocks/power/steam-generator.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator.png rename to core/assets-raw/sprites/blocks/power/steam-generator.png diff --git a/core/assets-raw/sprites/blocks/props/rock1.png b/core/assets-raw/sprites/blocks/props/boulder1.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/rock1.png rename to core/assets-raw/sprites/blocks/props/boulder1.png diff --git a/core/assets-raw/sprites/blocks/props/rock2.png b/core/assets-raw/sprites/blocks/props/boulder2.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/rock2.png rename to core/assets-raw/sprites/blocks/props/boulder2.png diff --git a/core/assets-raw/sprites/blocks/props/dacite-boulder1.png b/core/assets-raw/sprites/blocks/props/dacite-boulder1.png new file mode 100644 index 0000000000..ffddeef34b Binary files /dev/null and b/core/assets-raw/sprites/blocks/props/dacite-boulder1.png differ diff --git a/core/assets-raw/sprites/blocks/props/dacite-boulder2.png b/core/assets-raw/sprites/blocks/props/dacite-boulder2.png new file mode 100644 index 0000000000..aa258941cd Binary files /dev/null and b/core/assets-raw/sprites/blocks/props/dacite-boulder2.png differ diff --git a/core/assets-raw/sprites/blocks/props/snowrock1.png b/core/assets-raw/sprites/blocks/props/snow-boulder1.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/snowrock1.png rename to core/assets-raw/sprites/blocks/props/snow-boulder1.png diff --git a/core/assets-raw/sprites/blocks/props/snowrock2.png b/core/assets-raw/sprites/blocks/props/snow-boulder2.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/snowrock2.png rename to core/assets-raw/sprites/blocks/props/snow-boulder2.png diff --git a/core/assets-raw/sprites/blocks/units/command-center.png b/core/assets-raw/sprites/blocks/units/command-center.png index 1a829c1cfd..ac9aa45594 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/ui/button-right-disabled.9.png b/core/assets-raw/sprites/ui/button-right-disabled.9.png new file mode 100644 index 0000000000..4201ec590a Binary files /dev/null and b/core/assets-raw/sprites/ui/button-right-disabled.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right-down.9.png b/core/assets-raw/sprites/ui/button-right-down.9.png index 00b41dabe4..e0f26e84af 100644 Binary files a/core/assets-raw/sprites/ui/button-right-down.9.png and b/core/assets-raw/sprites/ui/button-right-down.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right-over.9.png b/core/assets-raw/sprites/ui/button-right-over.9.png index a8f83eee16..af7f6d1d6d 100644 Binary files a/core/assets-raw/sprites/ui/button-right-over.9.png and b/core/assets-raw/sprites/ui/button-right-over.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right.9.png b/core/assets-raw/sprites/ui/button-right.9.png index e43fe0c11c..2fd7ee856d 100644 Binary files a/core/assets-raw/sprites/ui/button-right.9.png and b/core/assets-raw/sprites/ui/button-right.9.png differ diff --git a/core/assets-raw/sprites/ui/pack.json b/core/assets-raw/sprites/ui/pack.json index fcd452dd9f..01f4ffedac 100644 --- a/core/assets-raw/sprites/ui/pack.json +++ b/core/assets-raw/sprites/ui/pack.json @@ -4,5 +4,6 @@ flattenPaths: true, maxWidth: 4096, maxHeight: 4096, + minHeight: 2048, fast: true } diff --git a/core/assets-raw/sprites/ui/wavepane.9.png b/core/assets-raw/sprites/ui/wavepane.9.png new file mode 100644 index 0000000000..29ae8b9852 Binary files /dev/null and b/core/assets-raw/sprites/ui/wavepane.9.png differ diff --git a/core/assets-raw/sprites/units/arkyid-cell.png b/core/assets-raw/sprites/units/arkyid-cell.png index 0806581f78..2cfccc7afb 100644 Binary files a/core/assets-raw/sprites/units/arkyid-cell.png and b/core/assets-raw/sprites/units/arkyid-cell.png differ diff --git a/core/assets-raw/sprites/units/arkyid-leg-base.png b/core/assets-raw/sprites/units/arkyid-leg-base.png index 5586043b4a..114665d7a1 100644 Binary files a/core/assets-raw/sprites/units/arkyid-leg-base.png and b/core/assets-raw/sprites/units/arkyid-leg-base.png differ diff --git a/core/assets-raw/sprites/units/arkyid.png b/core/assets-raw/sprites/units/arkyid.png index 78c84e44c6..184ea910ae 100644 Binary files a/core/assets-raw/sprites/units/arkyid.png and b/core/assets-raw/sprites/units/arkyid.png differ diff --git a/core/assets-raw/sprites/units/bryde.png b/core/assets-raw/sprites/units/bryde.png index b362cb5f17..5191b39b4a 100644 Binary files a/core/assets-raw/sprites/units/bryde.png and b/core/assets-raw/sprites/units/bryde.png differ diff --git a/core/assets-raw/sprites/units/chaos-array-cell.png b/core/assets-raw/sprites/units/chaos-array-cell.png deleted file mode 100644 index 2b55fff00e..0000000000 Binary files a/core/assets-raw/sprites/units/chaos-array-cell.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/chaos-array-leg.png b/core/assets-raw/sprites/units/chaos-array-leg.png deleted file mode 100644 index a7df74e158..0000000000 Binary files a/core/assets-raw/sprites/units/chaos-array-leg.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/chaos-array.png b/core/assets-raw/sprites/units/chaos-array.png deleted file mode 100644 index 78c84e44c6..0000000000 Binary files a/core/assets-raw/sprites/units/chaos-array.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/dagger-leg.png b/core/assets-raw/sprites/units/dagger-leg.png index f67d4257cf..d27c010dbc 100644 Binary files a/core/assets-raw/sprites/units/dagger-leg.png and b/core/assets-raw/sprites/units/dagger-leg.png differ diff --git a/core/assets-raw/sprites/units/eradicator-base.png b/core/assets-raw/sprites/units/eradicator-base.png deleted file mode 100644 index 57b1c796ba..0000000000 Binary files a/core/assets-raw/sprites/units/eradicator-base.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/eradicator-cell.png b/core/assets-raw/sprites/units/eradicator-cell.png deleted file mode 100644 index c527cdd01a..0000000000 Binary files a/core/assets-raw/sprites/units/eradicator-cell.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/eradicator-leg.png b/core/assets-raw/sprites/units/eradicator-leg.png deleted file mode 100644 index aeeaaf98f3..0000000000 Binary files a/core/assets-raw/sprites/units/eradicator-leg.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/eradicator.png b/core/assets-raw/sprites/units/eradicator.png deleted file mode 100644 index 1203ed33b3..0000000000 Binary files a/core/assets-raw/sprites/units/eradicator.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/mace-leg.png b/core/assets-raw/sprites/units/mace-leg.png index 82aba38b82..bb1b501dfa 100644 Binary files a/core/assets-raw/sprites/units/mace-leg.png and b/core/assets-raw/sprites/units/mace-leg.png differ diff --git a/core/assets-raw/sprites/units/minke.png b/core/assets-raw/sprites/units/minke.png index 99079defd5..32ec1fadfe 100644 Binary files a/core/assets-raw/sprites/units/minke.png and b/core/assets-raw/sprites/units/minke.png differ diff --git a/core/assets-raw/sprites/units/reign-base.png b/core/assets-raw/sprites/units/reign-base.png new file mode 100644 index 0000000000..6d47effdc9 Binary files /dev/null and b/core/assets-raw/sprites/units/reign-base.png differ diff --git a/core/assets-raw/sprites/units/reign-cell.png b/core/assets-raw/sprites/units/reign-cell.png new file mode 100644 index 0000000000..28aea20f24 Binary files /dev/null and b/core/assets-raw/sprites/units/reign-cell.png differ diff --git a/core/assets-raw/sprites/units/reign-leg.png b/core/assets-raw/sprites/units/reign-leg.png new file mode 100644 index 0000000000..1bf212125e Binary files /dev/null and b/core/assets-raw/sprites/units/reign-leg.png differ diff --git a/core/assets-raw/sprites/units/reign.png b/core/assets-raw/sprites/units/reign.png new file mode 100644 index 0000000000..6a3d838582 Binary files /dev/null and b/core/assets-raw/sprites/units/reign.png differ diff --git a/core/assets-raw/sprites/units/risso.png b/core/assets-raw/sprites/units/risso.png index e063474798..6cee60313b 100644 Binary files a/core/assets-raw/sprites/units/risso.png and b/core/assets-raw/sprites/units/risso.png differ diff --git a/core/assets-raw/sprites/units/chaos-array-base.png b/core/assets-raw/sprites/units/scepter-base.png similarity index 100% rename from core/assets-raw/sprites/units/chaos-array-base.png rename to core/assets-raw/sprites/units/scepter-base.png diff --git a/core/assets-raw/sprites/units/scepter-cell.png b/core/assets-raw/sprites/units/scepter-cell.png new file mode 100644 index 0000000000..86aec9412d Binary files /dev/null and b/core/assets-raw/sprites/units/scepter-cell.png differ diff --git a/core/assets-raw/sprites/units/scepter-leg.png b/core/assets-raw/sprites/units/scepter-leg.png new file mode 100644 index 0000000000..80e25079bf Binary files /dev/null and b/core/assets-raw/sprites/units/scepter-leg.png differ diff --git a/core/assets-raw/sprites/units/scepter.png b/core/assets-raw/sprites/units/scepter.png new file mode 100644 index 0000000000..5d1ae6f59b Binary files /dev/null and b/core/assets-raw/sprites/units/scepter.png differ diff --git a/core/assets-raw/sprites/units/toxopid-cannon.png b/core/assets-raw/sprites/units/toxopid-cannon.png new file mode 100644 index 0000000000..535ef3b5d7 Binary files /dev/null and b/core/assets-raw/sprites/units/toxopid-cannon.png differ diff --git a/core/assets-raw/sprites/units/toxopid-cell.png b/core/assets-raw/sprites/units/toxopid-cell.png new file mode 100644 index 0000000000..b58dba388d Binary files /dev/null and b/core/assets-raw/sprites/units/toxopid-cell.png differ diff --git a/core/assets-raw/sprites/units/toxopid-foot.png b/core/assets-raw/sprites/units/toxopid-foot.png new file mode 100644 index 0000000000..fffa78f2a6 Binary files /dev/null and b/core/assets-raw/sprites/units/toxopid-foot.png differ diff --git a/core/assets-raw/sprites/units/toxopid-joint-base.png b/core/assets-raw/sprites/units/toxopid-joint-base.png new file mode 100644 index 0000000000..921a27e55c Binary files /dev/null and b/core/assets-raw/sprites/units/toxopid-joint-base.png differ diff --git a/core/assets-raw/sprites/units/toxopid-leg-base.png b/core/assets-raw/sprites/units/toxopid-leg-base.png new file mode 100644 index 0000000000..8684da9f26 Binary files /dev/null and b/core/assets-raw/sprites/units/toxopid-leg-base.png differ diff --git a/core/assets-raw/sprites/units/toxopid-leg.png b/core/assets-raw/sprites/units/toxopid-leg.png new file mode 100644 index 0000000000..c8b18eb794 Binary files /dev/null and b/core/assets-raw/sprites/units/toxopid-leg.png differ diff --git a/core/assets-raw/sprites/units/toxopid.png b/core/assets-raw/sprites/units/toxopid.png new file mode 100644 index 0000000000..a84e453f40 Binary files /dev/null and b/core/assets-raw/sprites/units/toxopid.png differ diff --git a/core/assets-raw/sprites/units/weapons/antumbra-missiles.png b/core/assets-raw/sprites/units/weapons/antumbra-missiles.png deleted file mode 100644 index a37cbfa449..0000000000 Binary files a/core/assets-raw/sprites/units/weapons/antumbra-missiles.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/weapons/chaos.png b/core/assets-raw/sprites/units/weapons/chaos.png deleted file mode 100644 index 442d5b0417..0000000000 Binary files a/core/assets-raw/sprites/units/weapons/chaos.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/weapons/eradication.png b/core/assets-raw/sprites/units/weapons/eradication.png deleted file mode 100644 index 231158b058..0000000000 Binary files a/core/assets-raw/sprites/units/weapons/eradication.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/weapons/large-purple-mount.png b/core/assets-raw/sprites/units/weapons/large-purple-mount.png new file mode 100644 index 0000000000..4940a5b049 Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/large-purple-mount.png differ diff --git a/core/assets-raw/sprites/units/weapons/reign-weapon.png b/core/assets-raw/sprites/units/weapons/reign-weapon.png new file mode 100644 index 0000000000..bfe5c921fd Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/reign-weapon.png differ diff --git a/core/assets-raw/sprites/units/weapons/scepter-weapon.png b/core/assets-raw/sprites/units/weapons/scepter-weapon.png new file mode 100644 index 0000000000..07ff2b1629 Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/scepter-weapon.png differ diff --git a/core/assets/baseparts/1591385575600.msch b/core/assets/baseparts/1591385575600.msch index a086e7d8a2..597351c682 100644 Binary files a/core/assets/baseparts/1591385575600.msch and b/core/assets/baseparts/1591385575600.msch differ diff --git a/core/assets/baseparts/1599594352859.msch b/core/assets/baseparts/1599594352859.msch new file mode 100644 index 0000000000..3b73103fa9 Binary files /dev/null and b/core/assets/baseparts/1599594352859.msch differ diff --git a/core/assets/baseparts/4125616123544.msch b/core/assets/baseparts/4125616123544.msch new file mode 100644 index 0000000000..7e1ee81811 Binary files /dev/null and b/core/assets/baseparts/4125616123544.msch differ diff --git a/core/assets/baseparts/752911659508695080.msch b/core/assets/baseparts/752911659508695080.msch new file mode 100644 index 0000000000..9f1e10578e --- /dev/null +++ b/core/assets/baseparts/752911659508695080.msch @@ -0,0 +1,2 @@ +mschxE}r@ ŵ|.0%޺Llpא4iz47C[eaZ==iedxN>|Z5N20}N^cm!֬GӔqJq៩\KYZך .{~[:d9Sje+Wx DѻhwU-Y-:Gt:)h.28XoDtE6ϚT:A\8`#` \ No newline at end of file diff --git a/core/assets/baseparts/752926963076694047.msch b/core/assets/baseparts/752926963076694047.msch new file mode 100644 index 0000000000..6e26296729 Binary files /dev/null and b/core/assets/baseparts/752926963076694047.msch differ diff --git a/core/assets/baseparts/752927009641857205.msch b/core/assets/baseparts/752927009641857205.msch new file mode 100644 index 0000000000..7943fb1481 Binary files /dev/null and b/core/assets/baseparts/752927009641857205.msch differ diff --git a/core/assets/baseparts/752930133874049034.msch b/core/assets/baseparts/752930133874049034.msch new file mode 100644 index 0000000000..93941bdff3 Binary files /dev/null and b/core/assets/baseparts/752930133874049034.msch differ diff --git a/core/assets/baseparts/752930845685448825.msch b/core/assets/baseparts/752930845685448825.msch new file mode 100644 index 0000000000..594f46b9ee --- /dev/null +++ b/core/assets/baseparts/752930845685448825.msch @@ -0,0 +1,4 @@ +mschx-Mn `bt5I\$# j?~q32Mt31}p垗TVqؖ;W +8k~t|nIzR$4_iAbjGIu~ M6 C~d΂SF0AX422p +FD<"F8e^H^ AG +ؠSkAS8+Adˌ})*o \ No newline at end of file diff --git a/core/assets/baseparts/752932257538506823.msch b/core/assets/baseparts/752932257538506823.msch new file mode 100644 index 0000000000..097246d11c Binary files /dev/null and b/core/assets/baseparts/752932257538506823.msch differ diff --git a/core/assets/baseparts/752937073991745554.msch b/core/assets/baseparts/752937073991745554.msch new file mode 100644 index 0000000000..fe8d7ccc9c --- /dev/null +++ b/core/assets/baseparts/752937073991745554.msch @@ -0,0 +1 @@ +mschx-k )[SPHI$mBw5L70_"=Zc¶g+-1\RhA9Q)R˴oG #Eģ$8AжIhN8 p5\r;K % \ No newline at end of file diff --git a/core/assets/baseparts/752937145978716332.msch b/core/assets/baseparts/752937145978716332.msch new file mode 100644 index 0000000000..c3b5dbb923 Binary files /dev/null and b/core/assets/baseparts/752937145978716332.msch differ diff --git a/core/assets/baseparts/752937230456193185.msch b/core/assets/baseparts/752937230456193185.msch new file mode 100644 index 0000000000..558a0a3c63 --- /dev/null +++ b/core/assets/baseparts/752937230456193185.msch @@ -0,0 +1 @@ +mschxMI0 "qh,8ϯӃǣYlL˜OX5G<,*1!xi%Wإ9+pMY8}b)avA-S%/7ރo­r m;s &.^' \ No newline at end of file diff --git a/core/assets/baseparts/752939992300388483.msch b/core/assets/baseparts/752939992300388483.msch new file mode 100644 index 0000000000..6d4d56c904 --- /dev/null +++ b/core/assets/baseparts/752939992300388483.msch @@ -0,0 +1 @@ +mschx= n0E} !]UMJn×@_~瑁)K(5jouz?ڭ2f?}+oulQq&O:=>n6WeL]3 Gonq_jv5,+}$>!I*%!#a«xیx͜v"K4%t =Lg\H(1v=CϡKL/W+4+`z zf v\b{==}9H|XF'Fψ+GAxt/t#?1"V9 \ No newline at end of file diff --git a/core/assets/baseparts/752941306489077823.msch b/core/assets/baseparts/752941306489077823.msch new file mode 100644 index 0000000000..d98f3b2a11 --- /dev/null +++ b/core/assets/baseparts/752941306489077823.msch @@ -0,0 +1 @@ +mschx-K0 D'Ю]ElB@D_!cW|$N㺜,c]w63ϋ‘LĂvHao6JBA׆5ЊN[Ua- xۇo]& \ No newline at end of file diff --git a/core/assets/baseparts/752942460573057196.msch b/core/assets/baseparts/752942460573057196.msch new file mode 100644 index 0000000000..6f81df2b4e Binary files /dev/null and b/core/assets/baseparts/752942460573057196.msch differ diff --git a/core/assets/baseparts/752944648628076745.msch b/core/assets/baseparts/752944648628076745.msch new file mode 100644 index 0000000000..090ffe0155 --- /dev/null +++ b/core/assets/baseparts/752944648628076745.msch @@ -0,0 +1,2 @@ +mschxMan mMtC`{]:& =zh`WiSOa!w)(A/zcyw6͢`^)HE']j!L7{4Q;6xE?ܡ>L{y_̇Ȗ$ʎj7Cn6ѳ!Ot-G+ĉ o.?d ̏kr/8N4@Ϩd41SqÂc% +ɏM \ No newline at end of file diff --git a/core/assets/baseparts/752955880965799966.msch b/core/assets/baseparts/752955880965799966.msch new file mode 100644 index 0000000000..4cda9322ea Binary files /dev/null and b/core/assets/baseparts/752955880965799966.msch differ diff --git a/core/assets/baseparts/752961534690328648.msch b/core/assets/baseparts/752961534690328648.msch new file mode 100644 index 0000000000..15dbc9618c Binary files /dev/null and b/core/assets/baseparts/752961534690328648.msch differ diff --git a/core/assets/baseparts/752961607314702336.msch b/core/assets/baseparts/752961607314702336.msch new file mode 100644 index 0000000000..f7ea7664db Binary files /dev/null and b/core/assets/baseparts/752961607314702336.msch differ diff --git a/core/assets/baseparts/752965444419453010.msch b/core/assets/baseparts/752965444419453010.msch new file mode 100644 index 0000000000..008b1f015b Binary files /dev/null and b/core/assets/baseparts/752965444419453010.msch differ diff --git a/core/assets/baseparts/752967201597947924.msch b/core/assets/baseparts/752967201597947924.msch new file mode 100644 index 0000000000..76607f758f Binary files /dev/null and b/core/assets/baseparts/752967201597947924.msch differ diff --git a/core/assets/baseparts/752980871690059906.msch b/core/assets/baseparts/752980871690059906.msch new file mode 100644 index 0000000000..360d04733b Binary files /dev/null and b/core/assets/baseparts/752980871690059906.msch differ diff --git a/core/assets/baseparts/752982341865046126.msch b/core/assets/baseparts/752982341865046126.msch new file mode 100644 index 0000000000..360d04733b Binary files /dev/null and b/core/assets/baseparts/752982341865046126.msch differ diff --git a/core/assets/baseparts/752995421667721307.msch b/core/assets/baseparts/752995421667721307.msch new file mode 100644 index 0000000000..bd3313b2c3 Binary files /dev/null and b/core/assets/baseparts/752995421667721307.msch differ diff --git a/core/assets/baseparts/753005578997071974.msch b/core/assets/baseparts/753005578997071974.msch new file mode 100644 index 0000000000..747c61f453 Binary files /dev/null and b/core/assets/baseparts/753005578997071974.msch differ diff --git a/core/assets/baseparts/753035709576642631.msch b/core/assets/baseparts/753035709576642631.msch new file mode 100644 index 0000000000..c1955436b5 Binary files /dev/null and b/core/assets/baseparts/753035709576642631.msch differ diff --git a/core/assets/baseparts/753035713162903572.msch b/core/assets/baseparts/753035713162903572.msch new file mode 100644 index 0000000000..4d262d3fa3 --- /dev/null +++ b/core/assets/baseparts/753035713162903572.msch @@ -0,0 +1,2 @@ +mschx%Q + DguBIz^C-fiMD|̃7#!Y3 KLC,=՘ޱkjP*eƗx=Ed{L<5p \ No newline at end of file diff --git a/core/assets/baseparts/753043453876895784.msch b/core/assets/baseparts/753043453876895784.msch new file mode 100644 index 0000000000..013e2b4e23 Binary files /dev/null and b/core/assets/baseparts/753043453876895784.msch differ diff --git a/core/assets/baseparts/753059583450415175.msch b/core/assets/baseparts/753059583450415175.msch new file mode 100644 index 0000000000..a3ed4cf154 --- /dev/null +++ b/core/assets/baseparts/753059583450415175.msch @@ -0,0 +1,5 @@ +mschx%Ar0E?<5Yy9Yplrت)l\B) O/Cݿ%>C~^bXχ>3>t,xݗ E^' +RDWQU$A>L* )AMHQ+N'E|Qm=;),<<f ~ l (A{i [G8?{ݻ+n)p8ehߞVgy+N\.<oF^8QpF.d2hJT:Q ]˓RZR& d +e \ No newline at end of file diff --git a/core/assets/baseparts/753938078997151744.msch b/core/assets/baseparts/753938078997151744.msch new file mode 100644 index 0000000000..6a666a246c Binary files /dev/null and b/core/assets/baseparts/753938078997151744.msch differ diff --git a/core/assets/baseparts/core1.msch b/core/assets/baseparts/core1.msch index 43439698d7..a9df583d3b 100644 Binary files a/core/assets/baseparts/core1.msch and b/core/assets/baseparts/core1.msch differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 499933f037..c9f0b660e3 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -20,6 +20,7 @@ gameover = Game Over gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]New highscore! copied = Copied. +indevpopup = [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[]. load.sound = Sounds load.map = Maps @@ -113,6 +114,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. @@ -136,6 +138,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 @@ -170,7 +174,7 @@ host.info = The [accent]host[] button hosts a server on port [scarlet]6567[]. \n join.info = Here, you can enter a [accent]server IP[] to connect to, or discover [accent]local network[] or [accent]global[] servers to connect to.\nBoth LAN and WAN multiplayer is supported.\n\n[lightgray]If you want to connect to someone by IP, you would need to ask the host for their IP, which can be found by googling "my ip" from their device. hostserver = Host Multiplayer Game invitefriends = Invite Friends -hostserver.mobile = Host\nGame +hostserver.mobile = Host Game host = Host hosting = [accent]Opening server... hosts.refresh = Refresh @@ -505,6 +509,18 @@ 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 + #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 @@ -573,8 +589,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 @@ -638,7 +657,9 @@ 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.items = items @@ -727,6 +748,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 @@ -739,6 +761,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 @@ -800,6 +823,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 @@ -821,8 +845,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 @@ -874,6 +902,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 @@ -888,28 +917,31 @@ unit.bryde.name = Bryde unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +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 @@ -937,13 +969,16 @@ 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.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -959,7 +994,7 @@ 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 @@ -1011,7 +1046,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Steam Generator +block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1073,6 +1108,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 @@ -1089,7 +1125,9 @@ 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 @@ -1217,7 +1255,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_be.properties b/core/assets/bundles/bundle_be.properties index 906aa492cd..9545684502 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -993,7 +993,7 @@ block.diode.name = Дыёд block.battery.name = Акумулятар block.battery-large.name = Вялікі акумулятар block.combustion-generator.name = Генератар ўнутранага згарання -block.turbine-generator.name = Паравы генератар +block.steam-generator.name = Паравы генератар block.differential-generator.name = Дыферэнцыяльны генератар block.impact-reactor.name = Імпульсны рэактар block.mechanical-drill.name = Механічны бур @@ -1192,7 +1192,7 @@ block.battery.description = Назапашвае энергію як буфер block.battery-large.description = Захоўвае значна больш энергіі, чым звычайны акумулятар. block.combustion-generator.description = вырабленай энергіі шляхам спальвання лёгкаўзгаральных матэрыялаў, такіх як вугаль. block.thermal-generator.description = Генеруе энергію, калі знаходзіцца ў гарачых месцах. -block.turbine-generator.description = Удасканалены генератар згарання. Больш эфектыўны, але дадаткова патрабуе ваду для выпрацоўкі пары. +block.steam-generator.description = Удасканалены генератар згарання. Больш эфектыўны, але дадаткова патрабуе ваду для выпрацоўкі пары. block.differential-generator.description = Генеруе вялікая колькасць энергіі. Выкарыстоўвае розніцу тэмператур паміж крыягеннай вадкасцю і падпаленым пиротитом. block.rtg-generator.description = Просты, надзейны генератар. Выкарыстоўвае цяпло распадаюцца радыеактыўных злучэнняў для вытворчасці энергіі з нізкай хуткасцю. block.solar-panel.description = Забяспечвае невялікая колькасць энергіі ад сонца. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index df7caeebc5..e8036557e0 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -1011,7 +1011,7 @@ block.diode.name = Bateriová dioda block.battery.name = Baterie block.battery-large.name = Velká baterie block.combustion-generator.name = Spalovací generátor -block.turbine-generator.name = Turbínový generátor +block.steam-generator.name = Turbínový generátor block.differential-generator.name = Rozdílový Generator block.impact-reactor.name = Rázový reaktor block.mechanical-drill.name = Mechanický vrt @@ -1217,7 +1217,7 @@ block.battery.description = Ukládá energii v případě nadbytku v síti a pos block.battery-large.description = Ukládá více energie, než základní baterie. block.combustion-generator.description = Generuje energii spalováním hořlaných materiálů, jako je například uhlí. block.thermal-generator.description = Pokud je umístěn na teplotně aktivní místo (jako je magmatický kámen), dokáže z tepla generovat energii. -block.turbine-generator.description = Pokročilý spalovací generátor. Efektivnější, ale vyžaduje dodatečný přísun vody pro produkci páry. +block.steam-generator.description = Pokročilý spalovací generátor. Efektivnější, ale vyžaduje dodatečný přísun vody pro produkci páry. block.differential-generator.description = Generuje velké množství energie. Využívá teplotního rozdílu mezi chladící kapalinou a hořícím pyratitem. block.rtg-generator.description = Radioizotopní termoenergetický generátor (RTG) je jednoduchý, spolehlivý generátor. Využívá tepla z rozpadu radioaktivních složek ke generování menších dávek energie. block.solar-panel.description = Základní solární panel pro generování malého množství energie ze Slunce. diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index f448bcafaf..e563cba321 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -993,7 +993,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Steam Generator +block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1192,7 +1192,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 881ffe40be..96b20f1b85 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -993,7 +993,7 @@ block.diode.name = Batterie-Diode block.battery.name = Batterie block.battery-large.name = Große Batterie block.combustion-generator.name = Verbrennungsgenerator -block.turbine-generator.name = Turbinengenerator +block.steam-generator.name = Turbinengenerator block.differential-generator.name = Differentialgenerator block.impact-reactor.name = Schlaggenerator block.mechanical-drill.name = Mechanischer Bohrer @@ -1192,7 +1192,7 @@ block.battery.description = Speichert Strom, solange ein Überschuss besteht, un block.battery-large.description = Speichert sehr viel mehr Strom als eine normale Batterie. block.combustion-generator.description = Generiert Strom, indem Öl oder entzündliche Materialien verbrannt werden. block.thermal-generator.description = Erzeugt große Mengen Strom aus Lava. -block.turbine-generator.description = Effizienter als ein Verbrennungsgenerator, benötigt jedoch zusätzlich Wasser. +block.steam-generator.description = Effizienter als ein Verbrennungsgenerator, benötigt jedoch zusätzlich Wasser. block.differential-generator.description = Erzeugt große Mengen an Energie. Nutzt den Temperaturunterschied zwischen Kryofluid und brennendem Pyratit. block.rtg-generator.description = Ein Radioisotopengenerator, der keine Kühlung benötigt, aber weniger Strom als ein Thorium-Reaktor liefert. block.solar-panel.description = Erzeugt kleine Mengen an Strom aus Sonnenenergie. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 9fad522899..b173b210a5 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -993,7 +993,7 @@ block.diode.name = Diodo de batería block.battery.name = Batería block.battery-large.name = Batería Grande block.combustion-generator.name = Generador de Combustión -block.turbine-generator.name = Turbina +block.steam-generator.name = Turbina block.differential-generator.name = Generador Diferencial block.impact-reactor.name = Reactor de Impacto block.mechanical-drill.name = Taladro mecánico @@ -1192,7 +1192,7 @@ block.battery.description = Guarda energía cuando hay abundancia y proporciona block.battery-large.description = Almacena mucha más energía que una batería normal. block.combustion-generator.description = Genera energía quemando aceite o materiales inflamables. block.thermal-generator.description = Genera una gran cantidad de energía con la lava. -block.turbine-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional. +block.steam-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional. block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de piratita. block.rtg-generator.description = Un generador radioisótropo termoeléctrico que no necesita enfriamiento, pero proporciona menos energía que un reactor de torio. block.solar-panel.description = Proporciona una pequeña cantidad de energía procedente del sol. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index ea08f62c6d..2a4cdf1727 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -993,7 +993,7 @@ block.diode.name = Battery Diode block.battery.name = Aku block.battery-large.name = Suur aku block.combustion-generator.name = Põlemisgeneraator -block.turbine-generator.name = Aurugeneraator +block.steam-generator.name = Aurugeneraator block.differential-generator.name = Diferentseeriv generaator block.impact-reactor.name = Impulssreaktor block.mechanical-drill.name = Harilik puur @@ -1192,7 +1192,7 @@ block.battery.description = Salvestab energiat puhvrina positiivse energiabilans block.battery-large.description = Salvestab rohkem energiat kui tavaline aku. block.combustion-generator.description = Toodab energiat süttivate materjalide, näiteks söe, põletamisel. block.thermal-generator.description = Toodab energiat kuumades piirkondades. -block.turbine-generator.description = Täiustatud põlemisgeneraator. Tõhusam kui põlemisgeneraator, kuid vajab auru tootmiseks lisanduvat vett. +block.steam-generator.description = Täiustatud põlemisgeneraator. Tõhusam kui põlemisgeneraator, kuid vajab auru tootmiseks lisanduvat vett. block.differential-generator.description = Tekitab suurel hulgal energiat. Kasutab ära krüovedeliku ja põleva püratiidi temperatuuride erinevust. block.rtg-generator.description = Töökindel generaator, mis kasutab radioaktiivsete ühendite lagunemisel eralduvat soojust, et toota sellest aeglasel kiirusel energiat. block.solar-panel.description = Toodab vähesel määral energiat päikesekiirgusest. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 1c115f90ad..4d14fb5eb9 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -993,7 +993,7 @@ block.diode.name = Battery Diode block.battery.name = Bateria block.battery-large.name = Bateria handia block.combustion-generator.name = Errekuntza sorgailua -block.turbine-generator.name = Lurrin sorgailua +block.steam-generator.name = Lurrin sorgailua block.differential-generator.name = Sorgailu diferentziala block.impact-reactor.name = Talkazko erreaktorea block.mechanical-drill.name = Zulagailu mekanikoa @@ -1192,7 +1192,7 @@ block.battery.description = Energia biltegiratu dezake gehiegi dagoenean tarteka block.battery-large.description = Bateria arrunt batek baino energia gehiago biltegiratu dezake. block.combustion-generator.description = Energia sortzen du gai erregarriak errez, esaterako ikatza. block.thermal-generator.description = Energia sortzen du toki beroetan jarrita. -block.turbine-generator.description = Errekuntza sorgailu aurreratu bat. Eraginkorragoa. baina ur gehiago behar du lurrina sortzeko. +block.steam-generator.description = Errekuntza sorgailu aurreratu bat. Eraginkorragoa. baina ur gehiago behar du lurrina sortzeko. block.differential-generator.description = Energia kopuru handia sortzen du. Krio-isurkaria eta piratita goriaren arteko tenperatura diferentzia erabiltzen du. block.rtg-generator.description = Sorgailu sinple eta fidagarria. Konposatu erradioaktiboen hirotzearen beroa erabiltzen du geldiro energia sortzeko. block.solar-panel.description = Eguzkiaren energia kopuru txiki bat ematen du. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 93cf3feaaf..cd63bdf61f 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -993,7 +993,7 @@ block.diode.name = Battery Diode block.battery.name = Akku block.battery-large.name = Suuri akku block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Höyrygeneraattori +block.steam-generator.name = Höyrygeneraattori block.differential-generator.name = Differential Generator block.impact-reactor.name = Törmäysreaktori block.mechanical-drill.name = Mechanical Drill @@ -1192,7 +1192,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index a07e8ebf76..03fa670b73 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -1007,7 +1007,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Steam Generator +block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1206,7 +1206,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index cd79e0ab9c..e6fef061b4 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -993,7 +993,7 @@ block.diode.name = Diode block.battery.name = Batterie block.battery-large.name = Grande Batterie block.combustion-generator.name = Générateur à Combustion -block.turbine-generator.name = Générateur à Turbine +block.steam-generator.name = Générateur à Turbine block.differential-generator.name = Générateur Différentiel block.impact-reactor.name = Réacteur à Impact block.mechanical-drill.name = Foreuse Mécanique @@ -1192,7 +1192,7 @@ block.battery.description = Stocke le surplus d'énergie et le redistribue en ca block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale. block.combustion-generator.description = Génère de l'énergie en brûlant du charbon ou d'autres matériaux inflammables. block.thermal-generator.description = Génère une grande quantité d'énergie à partir de zones de chaleur. -block.turbine-generator.description = Plus efficace qu'un générateur à combustion, mais requiert de l'eau. +block.steam-generator.description = Plus efficace qu'un générateur à combustion, mais requiert de l'eau. block.differential-generator.description = Génère de grandes quantités d'énergie en utilisant la différence de température entre le liquide cryogénique et la pyratite brûlante. block.rtg-generator.description = Un générateur thermo-électrique à radioisotope qui ne demande pas de refroidissement mais produit moins d'énergie qu'un réacteur à Thorium. block.solar-panel.description = Génère une faible quantité d'énergie grâce aux rayons du soleil. diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index aeff0d5cb8..254437cdc8 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -993,7 +993,7 @@ block.diode.name = Battery Diode block.battery.name = Batterie block.battery-large.name = Batterie large block.combustion-generator.name = Générateur à combustion -block.turbine-generator.name = Générateur à turbine +block.steam-generator.name = Générateur à turbine block.differential-generator.name = Générateur différentiel block.impact-reactor.name = Réacteur à impact block.mechanical-drill.name = Foreuse mécanique @@ -1192,7 +1192,7 @@ block.battery.description = Stocke l’énergie chaque fois qu’il ya abondance block.battery-large.description = Stocke beaucoup plus d'énergie qu'une batterie ordinaire. block.combustion-generator.description = Génère de l'énergie en brûlant du pétrole ou des matériaux inflammables. block.thermal-generator.description = Génère une grande quantité d'énergie grâce à la lave. -block.turbine-generator.description = Plus efficace qu'un générateur de combustion, mais nécessite de l'eau supplémentaire. +block.steam-generator.description = Plus efficace qu'un générateur de combustion, mais nécessite de l'eau supplémentaire. block.differential-generator.description = Génère de grandes quantités d'énergie. Utilise la différence de température entre le cryofluide et la pyratite en combustion. block.rtg-generator.description = Générateur thermoélectrique à radio-isotopes ne nécessitant pas de refroidissement mais fournissant moins d'énergie qu'un réacteur à thorium. block.solar-panel.description = Fournit une petite quantité d'énergie grâce au soleil. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 6c8e0bd47d..160ed3b0f8 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -993,7 +993,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Steam Generator +block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1192,7 +1192,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 5868526b85..0ed35ef42c 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -993,7 +993,7 @@ block.diode.name = Dioda Baterai block.battery.name = Baterai block.battery-large.name = Baterai Besar block.combustion-generator.name = Generator Pembakar -block.turbine-generator.name = Generator Turbin +block.steam-generator.name = Generator Turbin block.differential-generator.name = Generator Majemuk block.impact-reactor.name = Reaktor Tumbukan block.mechanical-drill.name = Bor Mekanik @@ -1192,7 +1192,7 @@ block.battery.description = Menyimpan tenaga jika ada kelimpahan dan memberikan block.battery-large.description = Menyimpan lebih banyak tenaga daripada baterai biasa. block.combustion-generator.description = Menghasilkan tenaga dengan membakar minyak atau bahan bakar. block.thermal-generator.description = Menghasilkan tenaga disaat ditaruh di lokasi yang panas. -block.turbine-generator.description = Lebih efisien daripada generator pembakar, tetapi membutuhkan tambahan air. +block.steam-generator.description = Lebih efisien daripada generator pembakar, tetapi membutuhkan tambahan air. block.differential-generator.description = Menghasilkan banyak sekali tenaga. Memanfaatkan perbedaan suhu dingin cairan pendingin dan suhu panas pyratite. block.rtg-generator.description = Generator yang tidak membutuhkan pendiginan tetapi lebih memberi sedikit tenaga daripada reaktor thorium. block.solar-panel.description = Menghasilkan jumlah tenaga kecil dari matahari. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 93e2de29d2..01e9038170 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -993,7 +993,7 @@ block.diode.name = Diodo block.battery.name = Batteria block.battery-large.name = Batteria Grande block.combustion-generator.name = Generatore a Combustibile -block.turbine-generator.name = Turbina a Vapore +block.steam-generator.name = Turbina a Vapore block.differential-generator.name = Generatore Differenziale block.impact-reactor.name = Reattore ad Impatto block.mechanical-drill.name = Trivella Meccanica @@ -1192,7 +1192,7 @@ block.battery.description = Accumula energia ogni volta che c'è abbondanza e fo block.battery-large.description = Immagazzina molta più energia di una normale batteria. block.combustion-generator.description = Genera energia bruciando combustibile. block.thermal-generator.description = Genera una grande quantità di energia dalla lava. -block.turbine-generator.description = Più efficiente di un generatore a combustione, ma richiede l'aggiunta di acqua. +block.steam-generator.description = Più efficiente di un generatore a combustione, ma richiede l'aggiunta di acqua. block.differential-generator.description = Genera grandi quantità di energia. Utilizza la differenza di temperatura tra criofluido e pirite in combustione. block.rtg-generator.description = Un generatore che sfrutta il calore del decadimento di materiale radioattivo per produrre energia.\nNon richiede raffreddamento ma fornisce meno energia di un reattore al torio. block.solar-panel.description = Fornisce una piccola quantità di energia dal sole. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 933ae1992a..a73493be30 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -993,7 +993,7 @@ block.diode.name = バッテリーダイオード block.battery.name = バッテリー block.battery-large.name = 大型バッテリー block.combustion-generator.name = 火力発電機 -block.turbine-generator.name = タービン発電機 +block.steam-generator.name = タービン発電機 block.differential-generator.name = 差動発電機 block.impact-reactor.name = インパクトリアクター block.mechanical-drill.name = 機械ドリル @@ -1192,7 +1192,7 @@ block.battery.description = 余分な電力の充電して、貯めておくこ block.battery-large.description = 通常のバッテリーよりもたくさんの電力を溜めておくことができます。 block.combustion-generator.description = 石油や可燃性の物質を燃やして発電します。 block.thermal-generator.description = 溶岩から大量の電力を発電します。 -block.turbine-generator.description = 水を使って火力発電機より効率的に発電します。 +block.steam-generator.description = 水を使って火力発電機より効率的に発電します。 block.differential-generator.description = 大量の電力を生成します。冷却水と燃焼したピラタイトの温度差を利用します。 block.rtg-generator.description = トリウムリアクターよりも発電量は少ないですが、冷却を必要としない放射性同位体熱発電機(RTG)です。 block.solar-panel.description = 太陽光から少量の電力を発電します。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index cedeaaf039..a1ef32b7c1 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -126,7 +126,7 @@ mod.import = 모드 가져오기 mod.import.file = 파일 가져오기 mod.import.github = Github 에서 모드 가져오기 mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 소스에서 얻은 모드만을 사용해야 합니다! -mod.item.remove = 이 아이템은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요. +mod.item.remove = 이 자원은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요. mod.remove.confirm = 이 모드가 삭제될 것입니다. mod.author = [lightgray]제작자:[] {0} mod.missing = 이 저장 파일에는 최근에 업데이트되었거나 더 이상 설치되지 않은 모드가 포함되어 있습니다. 저장 파일이 손상될 수 있습니다. 정말로 불러 오시겠습니까?\n[lighthray]모드들:\n{0} @@ -541,7 +541,7 @@ no = 아니오 info.title = 정보 error.title = [scarlet]오류가 발생했습니다. error.crashtitle = 오류가 발생했습니다 -unit.nobuild = [scarlet]유닛을 만들 수 없습니다 +unit.nobuild = [scarlet]이 유닛은 건설할 수 없습니다. blocks.input = 입력 blocks.output = 출력 blocks.booster = 가속 @@ -554,7 +554,7 @@ blocks.damage = 공격력 blocks.targetsair = 공중 공격 blocks.targetsground = 지상 공격 blocks.itemsmoved = 이동 속도 -blocks.launchtime = 출격 사이의 시간 +blocks.launchtime = 출격 간격 blocks.shootrange = 사거리 blocks.size = 크기 blocks.liquidcapacity = 액체 용량 @@ -580,7 +580,7 @@ blocks.shots = 공격 속도 blocks.reload = 발/초 blocks.ammo = 탄약 -bar.drilltierreq = 더 좋은 드릴이 요구됨 +bar.drilltierreq = 더 좋은 드릴이 필요 bar.noresources = 자원 부족 bar.corereq = 코어 기지 필요 bar.drillspeed = 드릴 속도: {0}/s @@ -593,7 +593,7 @@ bar.poweroutput = 전력 출력: {0} bar.items = 자원량: {0} bar.capacity = 용량: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] +bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[장비를 정지합니다] bar.liquid = 액체 bar.heat = 발열 bar.power = 전력 @@ -607,7 +607,7 @@ bullet.incendiary = [stat]방화 bullet.homing = [stat]유도 bullet.shock = [stat]전격 bullet.frag = [stat]파편 -bullet.knockback = [stat]{0}[lightgray] 밀어내기 +bullet.knockback = [stat]{0}[lightgray] 밀침 bullet.freezing = [stat]빙결 bullet.tarred = [stat]타르 bullet.multiplier = [stat]{0}[lightgray]x 탄약 배수 @@ -630,10 +630,10 @@ unit.millions = 백만 category.general = 일반 category.power = 전력 category.liquids = 액체 -category.items = 아이템 +category.items = 자원 category.crafting = 입력/출력 category.shooting = 사격 -category.optional = 보조 아이템 +category.optional = 보조 자원 setting.landscape.name = 가로화면 잠금 setting.shadows.name = 그림자 setting.blockreplace.name = 자동 블록 제안 @@ -679,7 +679,7 @@ setting.blockselectkeys.name = 블록 선택 키 표시 setting.vsync.name = 수직 동기화 setting.pixelate.name = 픽셀화 setting.minimap.name = 미니맵 표시 -setting.coreitems.name = 코어에 있는 아이템 표시 +setting.coreitems.name = 코어에 있는 자원 표시 setting.position.name = 플레이어 위치 표시 setting.musicvol.name = 음악 크기 setting.atmosphere.name = 행성 배경화면 표시 @@ -699,7 +699,7 @@ public.confirm = 게임을 모두에게 공개하시겠습니까?\n[accent]모 public.beta = 베타 버전의 게임은 공개 서버를 만들 수 없습니다. uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 저장하세요.\n[accent] {0}[][scarlet]초 후에 예전 설정으로 되돌리고 게임을 종료합니다... uiscale.cancel = 취소 후 나가기 -setting.bloom.name = 블룸 +setting.bloom.name = 화려한 효과 keybind.title = 조작키 설정 keybinds.mobile = [scarlet]대부분의 키 맵핑은 모바일에서 작동하지 않습니다. 기본 이동만 지원됩니다. category.general.name = 일반 @@ -806,7 +806,7 @@ rules.lighting = 조명 rules.ambientlight = 주변 조명 rules.solarpowermultiplier = 태양광 발전 배수 -content.item.name = 아이템 +content.item.name = 자원 content.liquid.name = 액체 content.unit.name = 유닛 content.block.name = 블록 @@ -820,58 +820,58 @@ item.silicon.name = 실리콘 item.plastanium.name = 플라스터늄 item.phase-fabric.name = 메타 item.surge-alloy.name = 설금 -item.spore-pod.name = 포자 포드 +item.spore-pod.name = 포자 버섯 item.sand.name = 모래 -item.blast-compound.name = 화합물 +item.blast-compound.name = 폭발물 item.pyratite.name = 파이라타이트 -item.metaglass.name = 금속유리 +item.metaglass.name = 강화 유리 item.scrap.name = 고철 liquid.water.name = 물 liquid.slag.name = 광재 liquid.oil.name = 기름 -liquid.cryofluid.name = 냉각 +liquid.cryofluid.name = 냉각수 item.explosiveness = [lightgray]폭발성: {0} item.flammability = [lightgray]인화성: {0} item.radioactivity = [lightgray]방사능: {0} unit.health = [lightgray]체력: {0} unit.speed = [lightgray]속도: {0} unit.weapon = [lightgray]무기: {0} -unit.itemcapacity = [lightgray]아이템 수용량: {0} +unit.itemcapacity = [lightgray]자원 수용량: {0} unit.minespeed = [lightgray]채광 속도: {0}% unit.minepower = [lightgray]채광 레벨: {0} unit.ability = [lightgray]능력: {0} unit.buildspeed = [lightgray]건설 속도: {0}% -liquid.heatcapacity = [lightgray]발열 용량: {0} +liquid.heatcapacity = [lightgray]비열: {0} liquid.viscosity = [lightgray]점도: {0} liquid.temperature = [lightgray]온도: {0} -unit.dagger.name = Dagger -unit.mace.name = Mace -unit.fortress.name = Fortress -unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar -unit.crawler.name = Crawler -unit.atrax.name = Atrax -unit.spiroct.name = Spiroct -unit.arkyid.name = Arkyid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith -unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse -unit.mono.name = Mono -unit.poly.name = Poly -unit.mega.name = Mega -unit.risso.name = Risso -unit.minke.name = Minke -unit.bryde.name = Bryde -unit.alpha.name = Alpha -unit.beta.name = Beta -unit.gamma.name = Gamma +unit.dagger.name = 대거 +unit.mace.name = 메이스 +unit.fortress.name = 포트리스 +unit.nova.name = 노바 +unit.pulsar.name = 펄서 +unit.quasar.name = 퀘이사 +unit.crawler.name = 크롤러 +unit.atrax.name = 아트락스 +unit.spiroct.name = 스피록트 +unit.arkyid.name = 아키드 +unit.flare.name = 화염 +unit.horizon.name = 수평선 +unit.zenith.name = 천정 +unit.antumbra.name = 그림자 +unit.eclipse.name = 일식 +unit.mono.name = 모노 +unit.poly.name = 폴리 +unit.mega.name = 메가 +unit.risso.name = 리소 +unit.minke.name = 민케 +unit.bryde.name = 브리드 +unit.alpha.name = 알파 +unit.beta.name = 베타 +unit.gamma.name = 감마 -block.parallax.name = Parallax +block.parallax.name = 시차 block.cliff.name = 낭떠러지 block.sand-boulder.name = 사암 block.grass.name = 잔디 @@ -956,7 +956,7 @@ block.phase-wall-large.name = 대형 메타 벽 block.thorium-wall.name = 토륨 벽 block.thorium-wall-large.name = 대형 토륨 벽 block.door.name = 문 -block.door-large.name = 대형문 +block.door-large.name = 대형 문 block.duo.name = 듀오 block.scorch.name = 스코치 block.scatter.name = 스캐터 @@ -966,7 +966,7 @@ block.conveyor.name = 컨베이어 block.titanium-conveyor.name = 티타늄 컨베이어 block.plastanium-conveyor.name = 플라스터늄 컨베이어 block.armored-conveyor.name = 장갑 컨베이어 -block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 아이템을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 아이템을 받을 수 없습니다. +block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 자원을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 자원을 받을 수 없습니다. block.junction.name = 교차기 block.router.name = 분배기 block.distributor.name = 대형 분배기 @@ -975,12 +975,12 @@ block.inverted-sorter.name = 반전 필터 block.message.name = 메모 블록 block.illuminator.name = 조명 block.illuminator.description = 작고, 간단하고, 설정 가능한 광원입니다. 작동하려면 전력이 필요합니다. -block.overflow-gate.name = 오버플로 게이트 -block.underflow-gate.name = 언더플로 게이트 +block.overflow-gate.name = 포화 필터 +block.underflow-gate.name = 불포화 필터 block.silicon-smelter.name = 실리콘 제련소 block.phase-weaver.name = 메타 합성기 block.pulverizer.name = 분쇄기 -block.cryofluidmixer.name = 냉각 유체 제조기 +block.cryofluidmixer.name = 냉각수 제조기 block.melter.name = 융해기 block.incinerator.name = 소각로 block.spore-press.name = 포자 압축기 @@ -993,14 +993,14 @@ block.diode.name = 배터리 다이오드 block.battery.name = 배터리 block.battery-large.name = 대형 배터리 block.combustion-generator.name = 연소 발전기 -block.turbine-generator.name = 증기 발전기 +block.steam-generator.name = 증기 발전기 block.differential-generator.name = 차동 발잔기 -block.impact-reactor.name = 임팩트 원자로 +block.impact-reactor.name = 핵융합 원자로 block.mechanical-drill.name = 기계식 드릴 block.pneumatic-drill.name = 공압 드릴 block.laser-drill.name = 레이저 드릴 block.water-extractor.name = 물 추출기 -block.cultivator.name = 제초기 +block.cultivator.name = 온실 block.conduit.name = 파이프 block.mechanical-pump.name = 기계식 펌프 block.item-source.name = 자원 공급기 @@ -1018,7 +1018,7 @@ block.ripple.name = 립플 block.phase-conveyor.name = 메타 컨베이어 block.bridge-conveyor.name = 다리 컨베이어 block.plastanium-compressor.name = 플라스터늄 압축기 -block.pyratite-mixer.name = 라타이트 혼합기 +block.pyratite-mixer.name = 파이라타이트 혼합기 block.blast-mixer.name = 화합물 혼합기 block.solar-panel.name = 태양 전지판 block.solar-panel-large.name = 대형 태양 전지판 @@ -1039,7 +1039,7 @@ block.thermal-pump.name = 화력 펌프 block.thermal-generator.name = 화력 생성기 block.alloy-smelter.name = 설금 제련소 block.mender.name = 멘더 -block.mend-projector.name = 대형 수리 프로젝터 +block.mend-projector.name = 수리 프로젝터 block.surge-wall.name = 설금 벽 block.surge-wall-large.name = 큰 설금 벽 block.cyclone.name = 사이클론 @@ -1057,7 +1057,7 @@ block.launch-pad-large.name = 대형 출격 패드 block.segment.name = 세그먼트 block.ground-factory.name = 지상 공장 block.air-factory.name = 항공 공장 -block.naval-factory.name = 해군 공장 +block.naval-factory.name = 해양 공장 block.additive-reconstructor.name = 첨가물 재구성기 block.multiplicative-reconstructor.name = 다중 재구성기 block.exponential-reconstructor.name = 지수 재구성기 @@ -1081,18 +1081,18 @@ tutorial.intro.mobile = [scarlet]Mindustry 튜토리얼[]을 시작하겠습니 tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로 아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n마우스 오른쪽 버튼으로 취소가 가능합니다. tutorial.drill.mobile = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 밑에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n취소 버튼을 눌러 건축하기 전의 설계를 취소할 수 있습니다. tutorial.blockinfo = 각 블록마다 다른 특성을 가지고 있으며, 각 드릴은 특정 광석만 채굴할 수 있습니다.\n블록의 정보와 특성을 확인하려면, [accent]건설 메뉴에서 "?" 버튼을 선택하세요.[]\n\n[accent]지금 기계식 드릴의 정보를 보세요. -tutorial.conveyor = [accent]컨베이어[]는 아이템을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]마우스를 길게 눌러 경로에 놓습니다.\n대각선으로 배치할 경로를 선택하는 동안 [accent]CTRL[] 키를 누른 상태로 유지하세요.\n스크롤 휠을 사용하여 블록을 배치하기 전에 블록을 회전시킬 수 있습니다.\n[accent]선 도구를 사용하여 컨베이어 2개를 놓은 다음, 아이템을 코어로 넣으세요. -tutorial.conveyor.mobile = [accent]컨베이어[]는 아이템을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]몇 초 동안 손가락을 누른 상태에서 드래그 하여 경로를 그립니다.\n\n[accent]선 도구로 컨베이어 2개를 놓은 다음 아이템을 코어에 넣으세요. -tutorial.turret = 아이템이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 아이템이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 아이템(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\n기지 근처에 [accent]듀오 포탑[]을 건설하세요. +tutorial.conveyor = [accent]컨베이어[]는 자원을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]마우스를 길게 눌러 경로에 놓습니다.\n대각선으로 배치할 경로를 선택하는 동안 [accent]CTRL[] 키를 누른 상태로 유지하세요.\n스크롤 휠을 사용하여 블록을 배치하기 전에 블록을 회전시킬 수 있습니다.\n[accent]선 도구를 사용하여 컨베이어 2개를 놓은 다음, 자원을 코어로 넣으세요. +tutorial.conveyor.mobile = [accent]컨베이어[]는 자원을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]몇 초 동안 손가락을 누른 상태에서 드래그 하여 경로를 그립니다.\n\n[accent]선 도구로 컨베이어 2개를 놓은 다음 자원을 코어에 넣으세요. +tutorial.turret = 자원이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 자원이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 자원(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\n기지 근처에 [accent]듀오 포탑[]을 건설하세요. tutorial.drillturret = 듀오 포탑은 사격하는데 [accent]구리 탄약[]이 필요합니다.\n포탑 근처에 드릴을 설치하세요.\n구리를 공급하기 위해 컨베이어를 포탑으로 가도록 건설하세요.\n\n[accnet]탄약 운반: 0/1 tutorial.pause = 전투 중에는 게임을 [accent]일시정지[] 할 수 있습니다.\n일시정지 되는 동안 건설을 대기시킬 수 있습니다.\n\n[accent]일시정지하려면 스페이스 키를 누르세요. tutorial.pause.mobile = 싱글 플레이에서는 게임을 [accent]일시정지[]할 수 있습니다.\n일시정지하면 교전과 더불어 건설까지 일시정지됩니다.\n\n[accent]일시정지하려면 왼쪽 상단에 있는 이 버튼을 누르세요. tutorial.unpause = 이제 스페이스를 누르면 일시정지가 해제됩니다. tutorial.unpause.mobile = 이제 다시 누르면 일시정지가 해제됩니다. tutorial.breaking = 블록은 종종 파괴 되어야 합니다.\n선택한 모든 블록을 파괴하려면 [accent]마우스 오른쪽 클릭을 길게 누르세요[].\n\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각벽을 파괴하세요. -tutorial.breaking.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블럭을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요. -tutorial.withdraw = 경우에 따라 블록에서 아이템을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]아이템이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]아이템[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요. -tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 아이템을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[]. +tutorial.breaking.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블록을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요. +tutorial.withdraw = 경우에 따라 블록에서 자원을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]자원이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]자원[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요. +tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 자원을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[]. tutorial.waves = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. [accent]클릭[]하여 사격할 수 있습니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요. tutorial.waves.mobile = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. 당신의 기체는 자동으로 적을 향해 사격합니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요. tutorial.launch = 특정 웨이브에 도달하면 [accent]코어로 출격[] 을 할 수 있습니다.\n\n이렇게 얻은 자원을 사용하여 새로운 기술을 연구 할 수 있습니다.\n\n[accent]출격 버튼을 누르세요. @@ -1110,15 +1110,15 @@ item.silicon.description = 매우 유용한 반도체. 복잡한 전자 장치 item.plastanium.description = 고급 기체 및 파편화 탄약에 사용되는 가볍고 연성이 있는 재료입니다. item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다. item.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금. -item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 합성 포자 포드. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다. -item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 포드 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다. +item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 포자 버섯. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다. +item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 버섯 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다. item.pyratite.description = 소이 무기에서 사용되는 매우 높은 가연성 물질. liquid.water.description = 가장 유용한 액체. 냉각기 및 폐기물 처리에 일반적으로 사용됩니다. liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아있습니다. 분리기를 이용해 다른 광물들로 분리하거나 탄약으로 사용해 적 부대를 향해 살포할 수 있습니다. liquid.oil.description = 고급 재료 생산에 사용되는 액체. 석탄으로 전환하거나 무기로 뿌려서 불을 지를 수 있습니다. liquid.cryofluid.description = 물과 티타늄으로 만든 비 부식성 액체. 열 용량이 매우 높으며 냉각수로 광범위하게 사용됩니다. -block.message.description = 메세지를 남깁니다. 같은 팀 간의 소통에 사용됩니다. +block.message.description = 메시지를 남깁니다. 같은 팀 간의 소통에 사용됩니다. block.graphite-press.description = 석탄 덩어리를 순수한 흑연으로 압축합니다. block.multi-press.description = 흑연 압축기의 강화 버전. 석탄을 빠르고 효율적으로 처리하기 위해 물과 전력을 사용합니다. block.silicon-smelter.description = 순수한 석탄과 모래로 실리콘을 생산합니다. @@ -1131,14 +1131,14 @@ block.blast-mixer.description = 포자 클러스터를 파이라타이트와 분 block.pyratite-mixer.description = 석탄, 납, 모래를 가연성이 높은 파이라타이트로 만듭니다. block.melter.description = 웨이브 포탑에서 추가 처리 또는 사용을 위해 고철을 광재로 녹입니다. block.separator.description = 광재를 미네랄 성분으로 분리합니다. 그리고 냉각된 결과를 출력합니다. -block.spore-press.description = 포자 포드를 극압으로 압축하여 기름을 합성합니다. +block.spore-press.description = 포자 버섯을 극압으로 압축하여 기름을 합성합니다. block.pulverizer.description = 고철을 뭉개서 고운 모래로 만듭니다. block.coal-centrifuge.description = 기름에서 석탄 덩어리를 추출합니다. -block.incinerator.description = 넘치는 아이템이나 액체를 증발시킵니다. +block.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다. block.power-void.description = 입력된 모든 전력을 무효화합니다. 샌드박스 전용. block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용. -block.item-source.description = 아이템을 무한대로 출력합니다. 샌드박스 전용. -block.item-void.description = 모든 아이템을 파괴합니다. 샌드박스 전용. +block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용. +block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용. block.liquid-source.description = 액체를 무한히 출력합니다. 샌드박스 전용. block.liquid-void.description = 액체를 제거합니다. 샌드박스 전용. block.copper-wall.description = 저렴한 수비 블록.\n처음 몇 웨이브에서 코어와 포탑을 보호하는데 유용합니다. @@ -1162,17 +1162,17 @@ block.force-projector.description = 건물과 내부의 유닛을 공격으로 block.shock-mine.description = 지뢰를 밟고 있는 적에게 피해를 입힙니다. 적에게는 거의 보이지 않습니다. block.conveyor.description = 기본 자원 수송 레일. 자원을 배치된 방향을 따라 이동시켜 자동으로 건물에 넣어줍니다. 회전식. block.titanium-conveyor.description = 고급 자원 수송 레일. 기본 컨베이어보다 자원을 더 빨리 이동시킵니다. -block.plastanium-conveyor.description = 아이템을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 아이템을 받고 앞쪽에 세 방향으로 내보냅니다. +block.plastanium-conveyor.description = 자원을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 자원을 받고 앞쪽에 세 방향으로 내보냅니다. block.junction.description = 2개의 컨베이어 벨트를 교차시키는 다리 역할을 합니다. 서로 다른 재료를 다른 장소로 운반하는 두 개의 다른 컨베이어의 상황에서 유용합니다. block.bridge-conveyor.description = 고급 자원 운송 블록. 지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다. -block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 아이템을 순간이동 시킵니다. -block.sorter.description = 아이템을 정렬합니다. 아이템이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다. -block.inverted-sorter.description = 표준 분류기와 같은 아이템을 처리하지만, 대신 선택된 아이템을 측면으로 출력합니다. -block.router.description = 아이템을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오. -block.distributor.description = 고급 분배기. 아이템을 최대 7개의 다른 방향으로 동일하게 분할합니다. +block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 자원을 순간이동 시킵니다. +block.sorter.description = 자원을 정렬합니다. 자원이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다. +block.inverted-sorter.description = 표준 분류기와 같은 자원을 처리하지만, 대신 선택된 자원을 측면으로 출력합니다. +block.router.description = 자원을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오. +block.distributor.description = 고급 분배기. 자원을 최대 7개의 다른 방향으로 동일하게 분할합니다. block.overflow-gate.description = 전면 경로가 차단 된 경우에만 왼쪽과 오른쪽으로 출력됩니다. block.underflow-gate.description = 오버플로 게이트의 반대. 왼쪽 및 오른쪽 경로가 차단되면 전면으로 출력됩니다. -block.mass-driver.description = 최고의 아이템 운송 블록. 여러 아이템을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다. +block.mass-driver.description = 최고의 자원 운송 블록. 여러 자원을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다. block.mechanical-pump.description = 느린 속도로 액체를 퍼올리지만, 전력를 사용하지 않는 펌프입니다. block.rotary-pump.description = 고급 펌프. 더 많은 액체를 퍼올리지만, 전력이 필요합니다. block.thermal-pump.description = 가장 강력한 펌프. @@ -1192,27 +1192,27 @@ block.battery.description = 에너지가 넘쳐날 때 완충재로 전력을 block.battery-large.description = 일반 배터리보다 훨씬 더 많은 전력을 저장합니다. block.combustion-generator.description = 석탄과 같은 가연성 물질을 연소시켜 전력을 생산합니다. block.thermal-generator.description = 열이 있는 곳에 설치하면 전력이 생성됩니다. -block.turbine-generator.description = 고급 연소 발전기. 더 효율적이지만 증기를 생성하기 위해 물이 필요합니다. +block.steam-generator.description = 고급 연소 발전기. 더 효율적이지만 증기를 생성하기 위해 물이 필요합니다. block.differential-generator.description = 많은 양의 전력을 생성합니다. 냉각수와 불타는 파이라타이트의 온도 차이를 이용합니다. block.rtg-generator.description = 간단하고 안정적인 발전기. 붕괴하는 방사성 화합물의 열을 이용하여 느린 속도로 전력을 생성합니다. block.solar-panel.description = 태양으로부터 소량의 전력을 생성합니다. block.solar-panel-large.description = 표준 태양 전지판보다 훨씬 더 효율적인 버전. block.thorium-reactor.description = 토륨으로부터 상당한 양의 전력을 생산합니다. 지속적인 냉각이 필요하며, 충분한 양의 냉각수가 공급되지 않으면 크게 폭발합니다. 전력 출력은 토륨의 양에 따라 달라집니다. block.impact-reactor.description = 최고 효율로 대량의 전력을 생산할 수 있는 고급 발전기. 프로세스를 시작하려면 상당한 전력 공급이 필요합니다. -block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 아이템을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다. +block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 자원을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다. block.pneumatic-drill.description = 티타늄을 채광할 수 있는 향상된 드릴. 기계식 드릴보다 더 빠른 속도로 채굴합니다. block.laser-drill.description = 레이저 기술을 통해 더욱 빠르게 드릴링 할 수 있지만 전력이 필요합니다. 토륨 채굴 가능. block.blast-drill.description = 최상위 드릴. 많은 양의 전력이 필요합니다. block.water-extractor.description = 지하수를 추출합니다. 지표수가 없는 곳에서 사용합니다. -block.cultivator.description = 대기 중의 작은 농도의 포자를 배양 가능한 포드로 배양합니다. +block.cultivator.description = 대기 중의 작은 농도의 포자를 산업용 버섯으로 배양합니다. block.oil-extractor.description = 석유를 추출하기 위해 많은 양의 전력과 모래 및 물을 사용합니다. block.core-shard.description = 코어 캡슐의 첫 번째 형태. 파괴되면 해당 지역과의 모든 연결이 끊어집니다. 이런 일이 일어나지 않도록 하십시오. block.core-foundation.description = 코어의 두 번째 버전. 더 나은 방어력과 자원을 저장합니다. block.core-nucleus.description = 코어 캡슐의 세 번째이자 마지막 형태입니다. 방어력이 매우 높고 대량의 자원을 저장할 수 있습니다. -block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 아이템을 빼낼 수 있습니다. -block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 아이템을 빼낼 수 있습니다. -block.unloader.description = 근처의 비 수송 블록에서 아이템을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다. -block.launch-pad.description = 코어 출격 없이도 아이템을 묶어 출격시킬 수 있습니다. +block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 자원을 빼낼 수 있습니다. +block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 자원을 빼낼 수 있습니다. +block.unloader.description = 근처의 비 수송 블록에서 자원을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다. +block.launch-pad.description = 코어 출격 없이도 자원을 묶어 출격시킬 수 있습니다. block.launch-pad-large.description = 출격 패드의 개선된 버전. 더 많은 자원을 저장하며 더 자주 출격합니다. block.duo.description = 작고 저렴한 포탑. 지상 유닛에 유용합니다. block.scatter.description = 필수 대공 포탑. 적군에게 납 덩어리, 고철, 또는 강화 유리 조각 덩어리를 뿌립니다. diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 8316b54c06..5541eadcbf 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -993,7 +993,7 @@ block.diode.name = Baterijos Diodas block.battery.name = Baterija block.battery-large.name = Didelė Baterija block.combustion-generator.name = Vidaus Degimo Generatorius -block.turbine-generator.name = Garų Generatorius +block.steam-generator.name = Garų Generatorius block.differential-generator.name = Diferencialinis Generatorius block.impact-reactor.name = Smūginis Reaktorius block.mechanical-drill.name = Mechaninis Grąžtas @@ -1192,7 +1192,7 @@ block.battery.description = Laiko enegiją kaip buferis, kai reikalinga papildom block.battery-large.description = Laiko daugiau energijos negu paprasta baterija. block.combustion-generator.description = Gamina energiją degindamas degias medžiagas kaip anglis. block.thermal-generator.description = Gamina energiją, kai pastatytas karštose vietose. -block.turbine-generator.description = Pažangesnis vidaus degimo generatorius. Efektyvesnis, bet papildomai reikalauja vandens sukurti garams. +block.steam-generator.description = Pažangesnis vidaus degimo generatorius. Efektyvesnis, bet papildomai reikalauja vandens sukurti garams. block.differential-generator.description = Gamina didelį kiekį energijos. Pasitelkia temperatūrų skirtumą tarp krio skysčio ir degančio piratito. block.rtg-generator.description = Paprastas, patikimas generatorius. Naudoja yrančių junginių karštį energijos gamybai. block.solar-panel.description = Suteikia mažą kiekį energijos iš saulės. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 88fba3f8f5..4313b466d5 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -993,7 +993,7 @@ block.diode.name = Batterij Diode block.battery.name = Batterij block.battery-large.name = Grote Batterij block.combustion-generator.name = Fossiele Generator -block.turbine-generator.name = Turbine Generator +block.steam-generator.name = Turbine Generator block.differential-generator.name = Verschiltemperatuurgenerator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanische Boor @@ -1192,7 +1192,7 @@ block.battery.description = Stores power whenever there is an abundance and prov block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.steam-generator.description = More efficient than a combustion generator, but requires additional water. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.solar-panel.description = Genereert een klein beetje zonne-energie. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index e643b1d553..b4cd5a3b2a 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -993,7 +993,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Turbine Generator +block.steam-generator.name = Turbine Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1192,7 +1192,7 @@ block.battery.description = Stores power whenever there is an abundance and prov block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.steam-generator.description = More efficient than a combustion generator, but requires additional water. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index a8d15895b9..be0c9c14d8 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -994,7 +994,7 @@ block.diode.name = Dioda baterii block.battery.name = Bateria block.battery-large.name = Duża Bateria block.combustion-generator.name = Generator Spalinowy -block.turbine-generator.name = Generator Parowy +block.steam-generator.name = Generator Parowy block.differential-generator.name = Generator Różnicowy block.impact-reactor.name = Reaktor Uderzeniowy block.mechanical-drill.name = Wiertło Mechaniczne @@ -1193,7 +1193,7 @@ block.battery.description = Przechowuje energię przy nadwyżce produkcji oraz d block.battery-large.description = Przechowuje o wiele wiecej prądu niż standardowa bateria. block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów. block.thermal-generator.description = Generuje prąd kiedy jest postawiony na źródłach ciepła. -block.turbine-generator.description = Zaawansowana wersja Generatora Spalinowego. Jest wydajniejszy niż Generator Spalinowy, ale wymaga wody do generowania pary. +block.steam-generator.description = Zaawansowana wersja Generatora Spalinowego. Jest wydajniejszy niż Generator Spalinowy, ale wymaga wody do generowania pary. block.differential-generator.description = Generuje duże ilości prądu. Wykorzystuje różnice temperatur pomiędzy Lodocieczą a spalanym Piratianem. block.rtg-generator.description = Prosty, niezawodny generator. Wykorzystuje ciepło powstałe z rozpadu izotopów promieniotwórczych. Nie wymaga chłodzenia, ale produkuje mniej energii od reaktora torowego. block.solar-panel.description = Wytwarza małe ilości prądu wykorzystując energię słoneczną. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 64d54a3d5d..20b03d870f 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -993,7 +993,7 @@ block.diode.name = Diodo block.battery.name = Bateria block.battery-large.name = Bateria grande block.combustion-generator.name = Gerador à combustão -block.turbine-generator.name = Gerador à vapor +block.steam-generator.name = Gerador à vapor block.differential-generator.name = Gerador diferencial block.impact-reactor.name = Reator De impacto block.mechanical-drill.name = Broca Mecânica @@ -1192,7 +1192,7 @@ block.battery.description = Armazena energia em tempos de energia excedente. Lib block.battery-large.description = Guarda muito mais energia que uma bateria comum. block.combustion-generator.description = Gera energia queimando materiais inflamáveis, como carvão. block.thermal-generator.description = Gera energia quando colocado em lugares quentes. -block.turbine-generator.description = Mais eficiente que o gerador à combustão, mas requer água adicional para a geração de vapor. +block.steam-generator.description = Mais eficiente que o gerador à combustão, mas requer água adicional para a geração de vapor. block.differential-generator.description = Gera grandes quantidades de energia. Utiliza a diferença de temperatura entre o Fluido Criogênico e a Piratita. block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos que não precisa de refriamento mas dá muito menos energia que o reator de tório. block.solar-panel.description = Gera pequenas quantidades de energia do sol. diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index c665535ba8..6863e838d1 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -993,7 +993,7 @@ block.diode.name = Battery Diode block.battery.name = Bateria block.battery-large.name = Bateria Grande block.combustion-generator.name = Gerador a combustão -block.turbine-generator.name = Gerador de Turbina +block.steam-generator.name = Gerador de Turbina block.differential-generator.name = Gerador diferencial block.impact-reactor.name = Reator De Impacto block.mechanical-drill.name = Broca Mecânica @@ -1192,7 +1192,7 @@ block.battery.description = Armazena energia em tempos de energia excedente. Lib block.battery-large.description = Guarda muito mais energia que uma beteria comum. block.combustion-generator.description = Gera energia usando combustível ou petróleo. block.thermal-generator.description = Gera uma quantidade grande de energia usando lava. -block.turbine-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. +block.steam-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos Que não precisa de refriamento Mas da muito menos energia que o reator de torio. block.solar-panel.description = Gera pequenas quantidades de energia do sol. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 2fb9106b6d..2164aa4a51 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -20,6 +20,7 @@ gameover = Игра окончена gameover.pvp = [accent]{0}[] команда победила! highscore = [accent]Новый рекорд! copied = Скопировано. +indevpopup = [accent]v6[] находится на стадии [accent]alpha[].\n[lightgray]Это означает следующее:[]\n- Отсутствие контента.\n- Большинство [scarlet]ИИ единиц[] не работает.\n- Множество единиц не готово.\n- Кампания не завершена.\n- Всё, что вы видите, может быть изменено или удалено.\n\nСообщайте о багах и вылетах на [accent]Github[]. load.sound = Звуки load.map = Карты @@ -113,6 +114,7 @@ mod.disable = Выкл. mod.content = Содержимое: mod.delete.error = Невозможно удалить модификацию. Возможно, файл используется. mod.requiresversion = [scarlet]Требуемая минимальная версия игры: [accent]{0} +mod.outdated = [scarlet]Не совместим с V6 (нет "min-game-version: 105") mod.missingdependencies = [scarlet]Не найдены родительские модификации: {0} mod.erroredcontent = [scarlet]Ошибки содержимого mod.errors = Ошибки были вызваны загружаемым содержимым. @@ -125,9 +127,9 @@ mod.import = Импортировать модификацию mod.import.file = Импортировать файл mod.import.github = Импортировать мод с GitHub mod.jarwarn = [scarlet]JAR-модификации по сути не безопасны.[]\nУбедитесь, что вы импортируете этот мод из надежного источника! -mod.item.remove = Этот предмет является частью модификации [accent]«{0}»[]. Чтобы удалить его, удалите саму модификацию. +mod.item.remove = Этот предмет является частью модификации [accent]«{0}[accent]»[white]. Чтобы удалить его, удалите саму модификацию. mod.remove.confirm = Эта модификация будет удалена. -mod.author = [lightgray]Автор:[] {0} +mod.author = [lightgray]Автор(ы):[] {0} mod.missing = В этом сохранении есть следы модификации, которая отсутствует или установлена её обновлённая версия. Может произойти повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0} mod.preview.missing = Перед публикацией этой модификации в Мастерской, вы должны добавить изображение предпросмотра.\nРазместите изображение с именем[accent] preview.png[] в папке модификации и попробуйте снова. mod.folder.missing = Модификации могут быть опубликованы в Мастерской только в виде папки.\nЧтобы конвертировать любой мод в папку, просто извлеките его из архива и удалите старый архив .zip, затем перезапустите игру или перезагрузите модификации. @@ -136,6 +138,8 @@ mod.scripts.disable = Ваше устройство не поддерживае about.button = Об игре name = Имя: noname = Для начала, придумайте[accent] себе имя[]. +planetmap = Карта планеты +launchcore = Запуск ядра filename = Имя файла: unlocked = Новый контент разблокирован! completed = [accent]Завершено @@ -170,7 +174,7 @@ host.info = Кнопка [accent]Открыть сервер[] запускае join.info = Здесь вы можете ввести [accent]IP-адрес сервера[], найти доступные [accent]локальные[] и [accent]глобальные[] серверы для подключения.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Если вы хотите подключиться к кому-то по IP-адресу, Вам нужно будет попросить IP-адрес у самого хоста. Хост может узнать IP-адрес своего устройства через Google запрос [accent]"my ip"[]. hostserver = Запустить многопользовательский сервер invitefriends = Пригласить друзей -hostserver.mobile = Запустить\nсервер +hostserver.mobile = Запустить сервер host = Открыть сервер hosting = [accent]Открытие сервера… hosts.refresh = Обновить @@ -505,7 +509,14 @@ error.io = Сетевая ошибка ввода-вывода. error.any = Неизвестная сетевая ошибка. error.bloom = Не удалось инициализировать свечение (Bloom).\nВозможно, ваше устройство не поддерживает его. +sectors.unexplored = [lightgray]Не исследовано +sectors.resources = Ресурсы: +sectors.production = Производит: +sectors.stored = Накоплено: +sectors.resume = Продолжить +sectors.launch = Высадка +#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway sector.groundZero.name = Отправная точка sector.craters.name = Кратеры sector.frozenForest.name = Ледяной лес @@ -573,8 +584,11 @@ blocks.itemsmoved = Скорость перемещения blocks.launchtime = Интервал запусков blocks.shootrange = Радиус действия blocks.size = Размер +blocks.displaysize = Размер дисплея blocks.liquidcapacity = Вместимость жидкости blocks.powerrange = Дальность передачи энергии +blocks.linkrange = Дальность связи +blocks.instructions = Инструкции blocks.powerconnections = Количество соединений blocks.poweruse = Потребляет энергии blocks.powerdamage = Энергия/урон @@ -590,6 +604,7 @@ blocks.boosteffect = Ускоряющий эффект blocks.maxunits = Максимальное количество активных единиц blocks.health = Прочность blocks.buildtime = Время строительства +blocks.maxconsecutive = Макс. последовательность blocks.buildcost = Стоимость строительства blocks.inaccuracy = Разброс blocks.shots = Выстрелы @@ -637,7 +652,9 @@ unit.liquidunits = жидкостных единиц unit.powerunits = энерг. единиц unit.degrees = град. unit.seconds = сек. +unit.minutes = мин. unit.persecond = /сек +unit.perminute = /мин unit.timesspeed = x скорость unit.percent = % unit.items = предметов @@ -726,6 +743,7 @@ category.blocks.name = Выбор блока command.attack = Атаковать command.rally = Точка сбора command.retreat = Отступить +command.idle = Ждать placement.blockselectkeys = \n[lightgray]Клавиша: [{0}, keybind.respawn.name = Возрождение в ядре keybind.control.name = Перехватить контроль над единицей @@ -738,6 +756,7 @@ keybind.toggle_block_status.name = Отображение статусов бл keybind.move_x.name = Движение по оси X keybind.move_y.name = Движение по оси Y keybind.mouse_move.name = Следовать за курсором +keybind.pan.name = Панорамирование камеры keybind.boost.name = Полёт/Ускорение keybind.schematic_select.name = Выбрать область keybind.schematic_menu.name = Меню схем @@ -799,6 +818,7 @@ rules.reactorexplosions = Взрывы реакторов rules.wavetimer = Интервал волн rules.waves = Волны rules.attack = Режим атаки +rules.buildai = Строительство ИИ rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда) rules.blockhealthmultiplier = Множитель здоровья блоков rules.blockdamagemultiplier = Множитель урона блоков @@ -820,8 +840,11 @@ rules.title.unit = Боевые единицы rules.title.experimental = Экспериментально rules.title.environment = Окружение rules.lighting = Освещение +rules.fire = Огонь +rules.explosions = Урон от взрывов блоков/единиц rules.ambientlight = Окружающий свет rules.solarpowermultiplier = Множитель солнечной энергии +rules.weather = Погода content.item.name = Предметы content.liquid.name = Жидкости @@ -866,13 +889,16 @@ liquid.temperature = [lightgray]Температура: {0} unit.dagger.name = Кинжал unit.mace.name = Булава unit.fortress.name = Крепость +unit.scepter.name = Скипетр +unit.reign.name = Власть unit.nova.name = Нова unit.pulsar.name = Пульсар unit.quasar.name = Квазар -unit.crawler.name = Обходчик +unit.crawler.name = Ползун unit.atrax.name = Атракс unit.spiroct.name = Спайрокт unit.arkyid.name = Аркид +unit.toxopid.name = Токсопид unit.flare.name = Вспышка unit.horizon.name = Горизонт unit.zenith.name = Зенит @@ -888,27 +914,28 @@ unit.alpha.name = Альфа unit.beta.name = Бета unit.gamma.name = Гамма +block.resupply-point.name = Пункт снабжения block.parallax.name = Параллакс block.cliff.name = Скала block.sand-boulder.name = Песчаный валун block.grass.name = Трава block.slag.name = Шлак block.salt.name = Соль -block.saltrocks.name = Соляные камни +block.salt-wall.name = Соляная стена block.pebbles.name = Галька block.tendrils.name = Споровые усики -block.sandrocks.name = Песчаные камни +block.sand-wall.name = Песчаная стена block.spore-pine.name = Споровая сосна -block.sporerocks.name = Споровые камни -block.rock.name = Каменный валун -block.snowrock.name = Заснеженный валун +block.spore-wall.name = Споровая стена +block.boulder.name = Каменный валун +block.snow-boulder.name = Заснеженный валун block.snow-pine.name = Заснеженная сосна block.shale.name = Сланец block.shale-boulder.name = Сланцевый валун block.moss.name = Мох block.shrubs.name = Кусты block.spore-moss.name = Споровый мох -block.shalerocks.name = Сланцевые камни +block.shale-wall.name = Сланцевая стена block.scrap-wall.name = Стена из металлолома block.scrap-wall-large.name = Большая стена из металлолома block.scrap-wall-huge.name = Огромная стена из металлолома @@ -936,13 +963,16 @@ block.craters.name = Кратеры block.sand-water.name = Песок с водой block.darksand-water.name = Тёмный песок с водой block.char.name = Выжженная земля -block.holostone.name = Голографический камень +block.dacite.name = Дацит +block.dacite-wall.name = Дацитовая стена block.ice-snow.name = Заснеженный лёд -block.rocks.name = Камни -block.icerocks.name = Ледяные камни -block.snowrocks.name = Снежные камни -block.dunerocks.name = Тёмные песчаные камни +block.stone-wall.name = Каменная стена +block.ice-wall.name = Ледяная стена +block.snow-wall.name = Снежная стена +block.dune-wall.name = Тёмная песчаная стена block.pine.name = Сосна +block.dirt.name = Земля +block.dirt-wall.name = Земляная стена block.white-tree-dead.name = Мёртвое белое дерево block.white-tree.name = Белое дерево block.spore-cluster.name = Скопление спор @@ -958,7 +988,7 @@ block.dark-panel-4.name = Тёмная панель 4 block.dark-panel-5.name = Тёмная панель 5 block.dark-panel-6.name = Тёмная панель 6 block.dark-metal.name = Тёмный металл -block.ignarock.name = Обожжённый камень +block.basalt.name = Базальт block.hotrock.name = Горячий камень block.magmarock.name = Магмовый камень block.cliffs.name = Скалы @@ -1010,7 +1040,7 @@ block.diode.name = Диод block.battery.name = Аккумулятор block.battery-large.name = Большой аккумулятор block.combustion-generator.name = Генератор внутреннего сгорания -block.turbine-generator.name = Паровой генератор +block.steam-generator.name = Паровой генератор block.differential-generator.name = Дифференциальный генератор block.impact-reactor.name = Импульсный реактор block.mechanical-drill.name = Механический бур @@ -1072,6 +1102,7 @@ block.container.name = Контейнер block.launch-pad.name = Пусковая площадка block.launch-pad-large.name = Большая пусковая площадка block.segment.name = Сегмент +block.command-center.name = Командный центр block.ground-factory.name = Наземная фабрика block.air-factory.name = Воздушная фабрика block.naval-factory.name = Морская фабрика @@ -1088,7 +1119,9 @@ block.overdrive-dome.name = Сверхприводный купол block.switch.name = Переключатель block.micro-processor.name = Микропроцессор block.logic-processor.name = Логический процессор +block.hyper-processor.name = Гипер процессор block.logic-display.name = Логический дисплей +block.large-logic-display.name = Большой логический дисплей block.memory-cell.name = Запоминающее устройство team.blue.name = Синяя @@ -1216,7 +1249,7 @@ block.battery.description = Накапливает энергию как буф block.battery-large.description = Хранит гораздо больше энергии, чем обычный аккумулятор. block.combustion-generator.description = Вырабатывает энергию путём сжигания легковоспламеняющихся материалов, таких как уголь. block.thermal-generator.description = Генерирует энергию, когда находится в горячих местах. -block.turbine-generator.description = Усовершенствованный генератор сгорания. Более эффективен, но дополнительно требует воду для выработки пара. +block.steam-generator.description = Усовершенствованный генератор сгорания. Более эффективен, но дополнительно требует воду для выработки пара. block.differential-generator.description = Генерирует большое количество энергии. Использует разницу температур между криогенной жидкостью и горящим пиротитом. block.rtg-generator.description = Простой, надежный генератор. Использует тепло распадающихся радиоактивных соединений для производства энергии с низкой скоростью. block.solar-panel.description = Обеспечивает небольшое количество энергии от солнца. @@ -1225,10 +1258,10 @@ block.thorium-reactor.description = Генерирует значительно block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса. block.mechanical-drill.description = Дешёвый бур. При размещении на соответствующих плитках, предметы постоянно выдаются в медленном темпе. Способен добывать только базовые ресурсы. block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур. -block.laser-drill.description = Позволяет сверлить еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий. +block.laser-drill.description = Позволяет добывать еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий. block.blast-drill.description = Самый продвинутый бур. Требует большое количество энергии. block.water-extractor.description = Выкачивает подземные воды. Используется в местах, где нет поверхностных вод. -block.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готовые к использованию споры. +block.cultivator.description = Выращивает крошечные концентрации спор из атмосферы в готовые к использованию споры. block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения, добывая нефть. block.core-shard.description = Первая итерация капсулы ядра. После уничтожения, весь контакт с регионом теряется. Не позволяйте этому случиться. block.core-foundation.description = Вторая версия ядра. Лучше бронировано. Хранит больше ресурсов. diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index bbe0f390c6..d6f7460f0d 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -993,7 +993,7 @@ block.diode.name = Battery Diode block.battery.name = Batteri block.battery-large.name = Stort Batteri block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Ånggenerator +block.steam-generator.name = Ånggenerator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mekanisk Borr @@ -1192,7 +1192,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 8fcf97cb03..dc649c6fe2 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -993,7 +993,7 @@ block.diode.name = ไดโอดแบตเตอรี่ block.battery.name = แบตเตอรี่ block.battery-large.name = แบตเตอรี่ขนาดใหญ่ block.combustion-generator.name = เครื่องกำเนิดไฟฟ้าโดยการสันดาป -block.turbine-generator.name = เครื่องกำเนิดไฟฟ้าไอน้ำ +block.steam-generator.name = เครื่องกำเนิดไฟฟ้าไอน้ำ block.differential-generator.name = เครื่องกำเนิดไฟฟ้าดิฟเฟอเร่นเตอร์ block.impact-reactor.name = เตาปฏิกรณ์อัดกระแทก block.mechanical-drill.name = เครื่องขุดเชิงกล @@ -1192,7 +1192,7 @@ block.battery.description = เก็บพลังงานเป็นบั block.battery-large.description = เก็บพลังงานได้เยอะกว่าแบตเตอรี่ธรรมดา. block.combustion-generator.description = ผลิตพลังงานโดยการวัสดุติดไฟ เช่นถ่านหิน. block.thermal-generator.description = ผลิตพลังงานเมื่อวานในที่ร้อน (บนหินร้อนหรือหินแม็คม่า) -block.turbine-generator.description = เครื่องกำเนิดไฟฟ้าเผาไหม้ขั้นสูง. ประสิทธิภาพสูงกว่า แต่ต้องใช้น้ำด้วยเพื่อผลิตไอน้ำ. +block.steam-generator.description = เครื่องกำเนิดไฟฟ้าเผาไหม้ขั้นสูง. ประสิทธิภาพสูงกว่า แต่ต้องใช้น้ำด้วยเพื่อผลิตไอน้ำ. block.differential-generator.description = ผลิตไฟฟ้าจำนวนมาก. ใช้ความต่างของอุณหภูมิระหว่างไครโยฟลูอิดและไพไรต์ที่กำลังไหม้. block.rtg-generator.description = เครื่องกำเนิดไฟฟ้าที่ใช้ง่ายและไว้ใจได้. ใช้ความร้อนจากการสลายของสารกัมมัตภาพรังสีเพื่อใช้ผลิตพลังงานอย่างช้าๆ. block.solar-panel.description = ให้พลังงานจากแสงอาทิตย์จำนวนน้อย. diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 006ef4ae92..d5bb1dd197 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -993,7 +993,7 @@ block.diode.name = Battery Diode block.battery.name = batarya block.battery-large.name = buyuk batarya block.combustion-generator.name = sicaklik jenaratoru -block.turbine-generator.name = termal jenaratoru +block.steam-generator.name = termal jenaratoru block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mekanikal Kazici @@ -1192,7 +1192,7 @@ block.battery.description = Stores power whenever there is an abundance and prov block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. block.thermal-generator.description = Generates a large amount of power from lava. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.steam-generator.description = More efficient than a combustion generator, but requires additional water. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 15788e2753..914c5f53a2 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -993,7 +993,7 @@ block.diode.name = Battery Diode block.battery.name = Batarya block.battery-large.name = Büyük Batarya block.combustion-generator.name = Termik Jeneratör -block.turbine-generator.name = Buhar Jeneratörü +block.steam-generator.name = Buhar Jeneratörü block.differential-generator.name = Diferansiyel Jeneratörü block.impact-reactor.name = Patlama Reaktörü block.mechanical-drill.name = Mekanik Matkap @@ -1192,7 +1192,7 @@ block.battery.description = Enerji fazlasını yedek olarak saklar. Enerji açı block.battery-large.description = Sıradan bataryadan çok daha fazla enerji depolar. block.combustion-generator.description = Kömür gibi yanıcı materyalleri yakarak enerji üretir. block.thermal-generator.description = Sıcak bölgelere konulduğunda enerji üretir. -block.turbine-generator.description = Daha gelişmiş bir termik jeneratör. Daha verimlidir, ama buhar üretebilmek için suya ihtiyaç duyar. +block.steam-generator.description = Daha gelişmiş bir termik jeneratör. Daha verimlidir, ama buhar üretebilmek için suya ihtiyaç duyar. block.differential-generator.description = Çok miktarda enerji üretir. Kriyosıvı ve yanan pirratit arasındaki sıcaklık farkından yararlanır. block.rtg-generator.description = Basit, güvenilir bir reaktör. Bozunan radyoaktif materyallerin ısısını kullanır. block.solar-panel.description = Güneşten küçük miktarda enerji üretir. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 9c02b7b8b4..7599189c88 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -13,13 +13,14 @@ link.google-play.description = Завантажити для Android з Google P link.f-droid.description = Завантажити для Android з F-Droid link.wiki.description = Офіційна ігрова Wiki link.suggestions.description = Запропонувати нові функції -linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну. +linkfail = Не вдалося перейти за посиланням!\nURL-адреса скопійована в буфер обміну. screenshot = Зняток мапи збережено до {0} screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи. gameover = Гра завершена gameover.pvp = [accent]{0}[] команда перемогла! highscore = [accent]Новий рекорд! copied = Скопійовано. +indevpopup = Наразі [accent]6.0[] знаходиться у стадії [accent]альфа[].\n[lightgray]Це означає наступне:[]\n- Не вистачає наповнення гри;\n- Більшість [scarlet]ШІ бойових одиниць[] не працює належним чином;\n- Багато одиниць [scarlet]відсутні[] або незавершені;\n- Кампанія повністю не є завершеною;\n- Усе, що ви бачите, може змінитися або видалитися.\n\nПовідомляйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord. load.sound = Звуки load.map = Мапи @@ -39,8 +40,8 @@ be.check = Перевірити на наявність оновлень schematic = Схема schematic.add = Зберегти схему… schematics = Схеми -schematic.replace = Схема з такою назвою вже існує. Замінити її? -schematic.exists = Схема з такою назвою вже існує. +schematic.replace = Схема з такою назвою вже є. Замінити її? +schematic.exists = Схема з такою назвою вже є. schematic.import = Імпортувати схему… schematic.exportfile = Експортувати файл schematic.importfile = Імпортувати файл @@ -50,7 +51,7 @@ schematic.copy.import = Імпортувати з клавіатури schematic.shareworkshop = Поширити в Майстерню schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Обернути схему schematic.saved = Схема збережена. -schematic.delete.confirm = Ця схема буде повністю випалена Викорінювачем. +schematic.delete.confirm = Ви справді хочете видалити цю схему? schematic.rename = Перейменувати схему schematic.info = {0}x{1}, {2} блоків @@ -68,7 +69,7 @@ map.delete = Ви впевнені, що хочете видалити мапу level.highscore = Рекорд: [accent]{0} level.select = Вибір мапи level.mode = Режим гри: -coreattack = < Ядро знаходиться під атакою! > +coreattack = < Ядро перебуває під атакою! > nearpoint = [[ [scarlet]ЗАЛИШТЕ ЗОНУ ВИСАДКИ НЕГАЙНО[] ]\nанігіляція неминуча database = База даних ядра savegame = Зберегти гру @@ -77,7 +78,7 @@ joingame = Мережева гра customgame = Користувацька гра newgame = Нова гра none = <нічого> -minimap = Міні-мапа +minimap = Мінімапа position = Місцезнаходження close = Закрити website = Вебсайт @@ -97,15 +98,15 @@ committingchanges = Здійснення змін done = Зроблено feature.unsupported = Ваш пристрій не підтримує цю функцію -mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. +mods.alphainfo = Майте на увазі, що модифікації перебувають в альфі, і [scarlet]можуть бути дуже несправними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. mods.alpha = [accent](Альфа) mods = Модифікації mods.none = [lightgray]Модифікацій не знайдено! -mods.guide = Посібник з модифікацій +mods.guide = Посібник із модифікацій mods.report = Повідомити про ваду mods.openfolder = Відкрити теку mods.reload = Перезавантажити -mods.reloadexit = Гра зараз закриється, щоб перезавантажити модифікації +mods.reloadexit = Гра зараз закриється, щоби перезавантажити модифікації mod.display = [gray]Модифікація:[orange] {0} mod.enabled = [lightgray]Увімкнено mod.disabled = [scarlet]Вимкнено @@ -113,29 +114,32 @@ mod.disable = Вимкнути mod.content = Зміст: mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується. mod.requiresversion = [scarlet]Необхідна мінімальна версія гри: [accent]{0} +mod.outdated = [scarlet]Не сумісна з V6 (немає мінімальної версі гри (англ. min-game-version): 105) mod.missingdependencies = [scarlet]Відсутні залежності: {0} -mod.erroredcontent = [scarlet]Помилки при завантаженні +mod.erroredcontent = [scarlet]Помилки під час завантаження mod.errors = Виникли помилки під час завантаження змісту. mod.noerrorplay = [scarlet]Ви маєте модифікації з помилками.[] Або вимкніть проблемні модифікації, або виправте їх. mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена. mod.enable = Увімкнути -mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. +mod.requiresrestart = А тепер гра закриється, щоби застосувати зміни модифікацій. mod.reloadrequired = [scarlet]Потрібно перезавантаження mod.import = Імпортувати модифікацію mod.import.file = Імпортувати файл mod.import.github = Імпортувати з GitHub -mod.jarwarn = [scarlet]JAR-модифікації по своїй суті небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела! -mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоб видалити його, видаліть цю модифікацію. +mod.jarwarn = [scarlet]JAR-модифікації за своєю суттю небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела! +mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоби видалити його, видаліть цю модифікацію. mod.remove.confirm = Цю модифікацію буде видалено. mod.author = [lightgray]Автор:[] {0} mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0} -mod.preview.missing = До публікації цієї модифікації в Майстерні, ви повинні додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову. -mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію у теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації. +mod.preview.missing = До публікації цієї модифікації в Майстерні, ви мусите додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову. +mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію в теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації. mod.scripts.disable = Ваш пристрій не підтримує модифікації зі скриптами. Вимкніть модифікацію для запуску гри. about.button = Про гру name = Ім’я: noname = Спочатку придумайте[accent] собі ім’я[]. +planetmap = Планетна мапа +launchcore = Запустити ядро filename = Назва файлу: unlocked = Доступний новий вміст! completed = [accent]Завершено @@ -149,28 +153,28 @@ players.single = {0} гравець на сервері players.search = пошук players.notfound = [gray]гравців не знайдено server.closing = [accent]Закриття сервера… -server.kicked.kick = Ви були вигнані з сервера! +server.kicked.kick = Ви були вигнані із сервера! server.kicked.whitelist = Ви не в білому списку сервера. -server.kicked.serverClose = Сервер закрито. +server.kicked.serverClose = Сервер зачинено. server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте. server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру! server.kicked.serverOutdated = Застарілий сервер! Попрохайте адміністратора сервера оновити сервер/гру! server.kicked.banned = Ви заблоковані на цьому сервері. -server.kicked.typeMismatch = Цей сервер не сумісний з вашим типом збірки. +server.kicked.typeMismatch = Цей сервер не сумісний із вашим типом збірки. server.kicked.playerLimit = Цей сервер — заповнений. Дочекайтесь вільного місця. server.kicked.recentKick = Нещодавно вас вигнали.\nПочекайте трохи перед наступним під’єднанням. -server.kicked.nameInUse = На цьому сервері вже є хтось з таким ім’ям. +server.kicked.nameInUse = На цьому сервері вже є хтось із таким ім’ям. server.kicked.nameEmpty = Ваше ім’я має містити принаймні один символ або цифру. server.kicked.idInUse = Ви вже на цьому сервері! Під’єднанням двох облікових записів не дозволяється. server.kicked.customClient = Цей сервер не підтримує користувацькі збірки. Завантажте офіційну версію. server.kicked.gameover = Гру завершено! server.kicked.serverRestarting = Сервер перезавантажується server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[] -host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [lightgray]WiFi або локальній мережах[], повинні побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер. +host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які перебувають в тій же [lightgray]WiFi або локальній мережах[], мають побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоби люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви надали Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дають змогу виявити сервер. join.info = Тут ви можете ввести [accent]IP сервера[] для під’єднання або знайти сервери у [accent]локальній[] чи [accent]глобальній мережі[] для приєднання до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Це не є автоматичним глобальним списком серверів; якщо ви хочете приєднатися до когось через IP, вам доведеться попросити власника сервера дати свій ip. hostserver = Запустити багатокористувацький сервер invitefriends = Запросити друзів -hostserver.mobile = Запустити\nсервер +hostserver.mobile = Запустити сервер host = Запустити hosting = [accent]Відкриття сервера… hosts.refresh = Оновити @@ -259,25 +263,25 @@ ok = Гаразд open = Відкрити customize = Налаштувати правила cancel = Скасувати -openlink = Відкрити посилання +openlink = Перейти за посиланням copylink = Скопіювати посилання back = Назад data.export = Вивантажити дані data.import = Завантажити дані -data.openfolder = Відкрити теку з даними +data.openfolder = Відчинити теку з даними data.exported = Дані вивантажено. data.invalid = Це не дійсні ігрові дані. -data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється. +data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється. quit.confirm = Ви дійсно хочете вийти? quit.confirm.tutorial = Ви впевнені, що знаєте що робите?\nНавчання можна пройти наново[accent] Налаштування->Гра->Пройти навчання ще раз.[] loading = [accent]Завантаження… reloading = [accent]Перезавантаження модифікацій… saving = [accent]Збереження… -respawn = [accent][[{0}][], щоб відродитися в ядрі +respawn = [accent][[{0}][], щоби відродитися в ядрі cancelbuilding = [accent][[{0}][], щоб очистити план -selectschematic = [accent][[{0}][], щоб вибрати та скопіювати -pausebuilding = [accent][[{0}][], щоб призупинити будування -resumebuilding = [scarlet][[{0}][], щоб продовжити будування +selectschematic = [accent][[{0}][], щоби вибрати та скопіювати +pausebuilding = [accent][[{0}][], щоби призупинити будування +resumebuilding = [scarlet][[{0}][], щоби продовжити будування wave = [accent]Хвиля {0} wave.waiting = [lightgray]Наступна хвиля\nчерез {0} wave.waveInProgress = [lightgray]Хвиля триває @@ -293,11 +297,11 @@ builtin = Вбудована map.delete.confirm = Ви дійсно хочете видалити цю мапу? Цю дію неможливо буде скасувати! map.random = [accent]Випадкова мапа map.nospawn = Ця мапа не має жодного ядра для появи гравця! Додайте [accent]помаранчеве[] ядро до цієї мапи в редакторі. -map.nospawn.pvp = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі. -map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі. +map.nospawn.pvp = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі. +map.nospawn.attack = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. workshop.update = Оновити предмет -workshop.error = Помилка при отриманні інформації з Майстерні: {0} +workshop.error = Помилка під час отримання інформації з Майстерні: {0} map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Спершу переконайтеся, що ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться! workshop.menu = Виберіть, що ви хочете зробити з цим предметом. workshop.info = Інформація про предмет @@ -306,7 +310,7 @@ eula = Ліцензійна угода Steam missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано. publishing = [accent]Публікація… publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться! -publish.error = Виникла помилка при публікації предмета: {0} +publish.error = Виникла помилка під час публікації предмета: {0} steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0} editor.brush = Пензлик @@ -316,11 +320,11 @@ editor.oregen.info = Генерація руд: editor.mapinfo = Інформація про мапу editor.author = Автор: editor.description = Опис: -editor.nodescription = Мапа повинна мати щонайменше 4 символи для публікації. +editor.nodescription = Мапа мусить мати щонайменше 4 символи для публікації. editor.waves = Хвилі: editor.rules = Правила: editor.generation = Генерація: -editor.ingame = Редагувати у грі +editor.ingame = Редагувати в грі editor.publish.workshop = Опублікувати в Майстерні Steam editor.newmap = Нова мапа workshop = Майстерня @@ -337,9 +341,12 @@ waves.preview = Попередній перегляд waves.edit = Редагувати… waves.copy = Копіювати в буфер обміну waves.load = Завантажити з буфера обміну -waves.invalid = Недійсні хвилі у буфері обміну. +waves.invalid = Недійсні хвилі в буфері обміну. waves.copied = Хвилі скопійовані. waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. +wavemode.counts = кількість +wavemode.totals = усього +wavemode.health = здоров’я editor.default = [lightgray]<За замовчуванням> details = Подробиці… edit = Редагувати… @@ -349,11 +356,11 @@ editor.removeunit = Видалити бойову одиницю editor.teams = Команди editor.errorload = Помилка завантаження зображення. editor.errorsave = Помилка збереження зображення. -editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» у редакторі. +editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» в редакторі. editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується. editor.errornot = Це не мапа. editor.errorheader = Цей файл мапи недійсний або пошкоджений. -editor.errorname = Мапа не має назви. Може Ви намагаєтеся завантажити збереження? +editor.errorname = Мапа не має назви. Може, ви намагаєтеся завантажити збереження? editor.update = Оновити editor.randomize = Випадково editor.apply = Застосувати @@ -364,7 +371,7 @@ editor.savemap = Зберегти мапу editor.saved = Збережено! editor.save.noname = Ваша мапа не має назви! Установіть його в «Інформація про мапу». editor.save.overwrite = Ваша мапа перезаписує вбудовану мапу! Виберіть іншу назву в «Інформація про мапу». -editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже існує! +editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже є! editor.import = Імпорт… editor.importmap = Імпортувати мапу editor.importmap.description = Імпортувати вже наявну мапу @@ -379,12 +386,12 @@ editor.exportimage = Експорт зображення місцевості editor.exportimage.description = Експортувати файл зображення, що містить лише основний рельєф місцевості editor.loadimage = Завантажити\nзображення editor.saveimage = Зберегти\nзображення -editor.unsaved = [scarlet]У вас є незбережені зміни![]\nВи впевнені, що хочете вийти? +editor.unsaved = Ви впевнені, що хочете вийти?\n[scarlet]Незбережені зміни буде втрачено назавжди![] editor.resizemap = Змінити розмір мапи editor.mapname = Назва мапи: editor.overwrite = [accent]Попередження!\nЦе перезаписує наявну мапу. -editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже існує. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]» -editor.exists = Мапа з такою назвою вже існує. +editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже є. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]» +editor.exists = Мапа з такою назвою вже є. editor.selectmap = Виберіть мапу для завантаження: toolmode.replace = Замінити @@ -397,7 +404,7 @@ toolmode.square = Прямокутник toolmode.square.description = Прямокутна кисть. toolmode.eraseores = Видалення руд toolmode.eraseores.description = Видалити тільки руди. -toolmode.fillteams = Змінити блок в команді +toolmode.fillteams = Змінити блок у команді toolmode.fillteams.description = Змінює належність\nблоків до команди. toolmode.drawteams = Змінити команду блока toolmode.drawteams.description = Змінює належність\nблока до команди. @@ -446,7 +453,7 @@ load = Завантажити save = Зберегти fps = FPS: {0} ping = Затримка: {0} мс -language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності. +language.restart = Будь ласка, перезапустіть свою гру, щоби налаштування мови набули чинності. settings = Налаштування tutorial = Навчання tutorial.retake = Пройти навчання ще раз @@ -458,7 +465,7 @@ abandon.text = Ця зона і всі її ресурси будуть утра locked = Заблоковано complete = [lightgray]Необхідно: requirement.wave = Досягніть хвилі {0} у зоні «{1}» -requirement.core = Знищте вороже ядро у зоні «{0}» +requirement.core = Знищте вороже ядро в зоні «{0}» requirement.unlock = Розблокуйте {0} resume = Відновити зону:\n[lightgray]{0} bestwave = [lightgray]Найкраща хвиля: {0} @@ -467,7 +474,7 @@ launch.text = Запуск launch.title = Запуск вдалий launch.next = [lightgray]наступна можливість буде на {0}-тій хвилі launch.unable2 = [scarlet]ЗАПУСК неможливий.[] -launch.confirm = Це видалить всі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази. +launch.confirm = Це видалить усі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази. launch.skip.confirm = Якщо ви пропустите зараз, ви не зможете не запускати до більш пізніх хвиль. uncover = Розкрити configure = Налаштувати вивантаження @@ -475,7 +482,7 @@ loadout = Вивантаження resources = Ресурси bannedblocks = Заборонені блоки addall = Додати все -configure.invalid = Кількість повинна бути числом між 0 та {0}. +configure.invalid = Кількість має бути числом між 0 та {0}. zone.unlocked = Зона «[lightgray]{0}» тепер розблокована. zone.requirement.complete = Вимоги до зони «{0}» виконані:[lightgray]\n{1} zone.resources = [lightgray]Виявлені ресурси: @@ -488,7 +495,7 @@ boss.health = Здоров’я босу connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0} error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса? error.invalidaddress = Некоректна адреса. -error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту! +error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна й що власник сервера налаштував переадресацію порту! error.mismatch = Помилка пакету:\nможлива невідповідність версії клієнта/сервера.\nПереконайтеся, що у вас та у власника сервера встановлена остання версія Mindustry! error.alreadyconnected = Ви вже під’єдналися. error.mapnotfound = Файл мапи не знайдено! @@ -496,6 +503,18 @@ error.io = Мережева помилка введення-виведення. error.any = Невідома мережева помилка error.bloom = Не вдалося ініціалізувати світіння.\nВаш пристрій, мабуть, не підтримує це. +weather.rain.name = Дощ +weather.snow.name = Сніг +weather.sandstorm.name = Піщана буря +weather.sporestorm.name = Спорова буря + +sectors.unexplored = [lightgray]Не досліджено +sectors.resources = Ресурси: +sectors.production = Виробництво: +sectors.stored = Зберігає: +sectors.resume = Продовжити +sectors.launch = Запуск + sector.groundZero.name = Відправний пункт sector.craters.name = Кратери sector.frozenForest.name = Крижаний ліс @@ -515,7 +534,7 @@ sector.craters.description = У цьому кратері накопичилас sector.ruinousShores.description = Саме берегова лінія є минулим цих відходів. Колись у цьому місці розташувався береговий оборонний масив. Проте залишилося не так багато чого. Тільки основні оборонні споруди залишилися неушкодженими, а все інше перетворилося на брухт.\nПродовжуйте експансію назовні. Повторно розкрийте технології. sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, які ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості. Дізнайтеся, як використовувати його.\n\nНа жаль, тут більше противників ніж в інших місцевостях. Не дайте їм часу надіслати свої найсильніші одиниці. sector.overgrowth.description = Ближче до джерела спор є територія, що заросла.\nНе дивуйтеся, що противник встановив тут свій форпост. Побудуйте бойові одиниці під кодовою назвою «Титан». Зруйнуйте її. Поверніть те, що колись належало нам. -sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один з небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти. +sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один із небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти. sector.desolateRift.description = Надзвичайно небезпечна зона. Багато ресурсів, але мало місця. Високий ризик знищення. Евакуюватися потрібно якомога швидше. Не розслабляйтеся між ворожими атаками та знайдіть ахіллесову п’яту супротивника. sector.nuclearComplex.description = Колишній об’єкт для виробництва та перероблювання торію було зведено до руїн.\n[lightgray]Дослідіть торій та його нескінченну кількість застосувань.\n\n Противник, який постійно шукає нападників, присутній тут у великій кількості, тому не баріться з евакуацією. @@ -531,7 +550,9 @@ settings.sound = Звук settings.graphics = Графіка settings.cleardata = Очистити дані… settings.clear.confirm = Ви дійсно хочете очистити ці дані?\nЦю дію не можна скасувати! -settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включаючи збереження, мапи, розблоковане та налаштування керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється. +settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включно із збереженнями, мапами, розблокованим та налаштуваннями керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється. +settings.clearsaves.confirm = Ви справді хочете видалити всі ваші збереження? +settings.clearsaves = Очистити збереження paused = [accent]< Пауза> clear = Очистити banned = [scarlet]Заблоковано @@ -557,8 +578,11 @@ blocks.itemsmoved = Швидкість переміщення blocks.launchtime = Час між запусками blocks.shootrange = Радіус дії blocks.size = Розмір +blocks.displaysize = Розмір дисплею blocks.liquidcapacity = Рідинна місткість -blocks.powerrange = Діапазон передачі енергії +blocks.powerrange = Радіус передачі енергії +blocks.linkrange = Радіус з’єднання +blocks.instructions = Інструкції blocks.powerconnections = Максимальна кількість з’єднань blocks.poweruse = Енергії використовує blocks.powerdamage = Енергії за од. шкоди @@ -574,6 +598,7 @@ blocks.boosteffect = Прискорювальний ефект blocks.maxunits = Максимальна кількість активних одиниць blocks.health = Здоров’я blocks.buildtime = Час будування +blocks.maxconsecutive = Максимальна послідовність blocks.buildcost = Вартість будування blocks.inaccuracy = Розкид blocks.shots = Постріли @@ -581,7 +606,7 @@ blocks.reload = Постріли/секунду blocks.ammo = Боєприпаси bar.drilltierreq = Потребується кращий бур -bar.noresources = Відсутні ресурси +bar.noresources = Бракує ресурсів bar.corereq = Необхідне основне ядро bar.drillspeed = Швидкість буріння: {0} за с. bar.pumpspeed = Швидкість викачування: {0} за с. @@ -621,7 +646,9 @@ unit.liquidunits = одиниць рідини unit.powerunits = одиниць енергії unit.degrees = град. unit.seconds = с +unit.minutes = хв unit.persecond = за секунду +unit.perminute = за хвилину unit.timesspeed = x швидкість unit.percent = % unit.items = предм. @@ -637,7 +664,7 @@ category.shooting = Стрільба category.optional = Додаткові поліпшення setting.landscape.name = Тільки альбомний (горизонтальний) режим setting.shadows.name = Тіні -setting.blockreplace.name = Пропозиції щодо автоматичної заміни блоків +setting.blockreplace.name = Пропонування щодо автоматичної заміни блоків setting.linear.name = Лінійна фільтрація setting.hints.name = Підказки setting.flow.name = Показувати темп швидкості ресурсів @@ -648,7 +675,7 @@ setting.animatedshields.name = Анімаційні щити setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[] setting.playerindicators.name = Позначки гравців setting.indicators.name = Позначки противників -setting.autotarget.name = Авто-стрільба +setting.autotarget.name = Автострільба setting.keyboard.name = Миш+Керування з клавіатури setting.touchscreen.name = Керування сенсорним екраном setting.fpscap.name = Максимальний FPS @@ -680,11 +707,11 @@ setting.blockselectkeys.name = Показувати клавіші вибору setting.vsync.name = Вертикальна синхронізація setting.pixelate.name = Пікселізація setting.minimap.name = Показувати мінімапу -setting.coreitems.name = Показувати предмети в ядрі (в роботі) +setting.coreitems.name = Показувати предмети в ядрі (дороблюється) setting.position.name = Показувати координати гравця setting.musicvol.name = Гучність музики setting.atmosphere.name = Показувати планетарну атмосферу -setting.ambientvol.name = Звуки навколишнього середовища +setting.ambientvol.name = Звуки довкілля setting.mutemusic.name = Заглушити музику setting.sfxvol.name = Гучність звукових ефектів setting.mutesound.name = Заглушити звук @@ -696,7 +723,7 @@ setting.chatopacity.name = Непрозорість чату setting.lasersopacity.name = Непрозорість лазерів енергопостачання setting.bridgeopacity.name = Непрозорість мостів setting.playerchat.name = Показувати хмару чата над гравцями -public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити у Налаштування->Гра->Загальнодоступність гри. +public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити в Налаштування->Гра->Загальнодоступність гри. public.beta = Зауважте, що в бета-версії гри ви не можете робити публічні ігри. uiscale.reset = Масштаб користувацького інтерфейсу було змінено.\nНатисніть «Гаразд» для підтвердження цього масштабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] секунд… uiscale.cancel = Скасувати & Вийти @@ -710,6 +737,7 @@ category.blocks.name = Вибір блока command.attack = Атака command.rally = Точка збору command.retreat = Відступити +command.idle = Бездіяти placement.blockselectkeys = \n[lightgray]Ключ: [{0}, keybind.respawn.name = Відродження keybind.control.name = Контролювання одиниці @@ -721,7 +749,8 @@ keybind.toggle_power_lines.name = Показувати лазери енерго keybind.toggle_block_status.name = Показувати стан блоків keybind.move_x.name = Рух по осі X keybind.move_y.name = Рух по осі Y -keybind.mouse_move.name = Слідкувати за мишею +keybind.mouse_move.name = Рухатися за мишею +keybind.pan.name = Політ камери за мишею keybind.boost.name = Прискорення keybind.schematic_select.name = Вибрати ділянку keybind.schematic_menu.name = Меню схем @@ -754,7 +783,7 @@ keybind.zoom.name = Наблизити keybind.menu.name = Меню keybind.pause.name = Пауза keybind.pause_building.name = Призупинити/Продовжити будування -keybind.minimap.name = Міні-мапа +keybind.minimap.name = Мінімапа keybind.chat.name = Чат keybind.player_list.name = Список гравців keybind.console.name = Консоль @@ -765,10 +794,10 @@ keybind.chat_history_prev.name = Попередня історія чату keybind.chat_history_next.name = Наступна історія чату keybind.chat_scroll.name = Прокрутка чату keybind.drop_unit.name = Скинути бойову одиницю -keybind.zoom_minimap.name = Збільшити міні-мапу +keybind.zoom_minimap.name = Збільшити мінімапу mode.help.title = Опис режимів гри mode.survival.name = Виживання -mode.survival.description = Звичайний режим. В цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри. +mode.survival.description = Звичайний режим. У цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри. mode.sandbox.name = Пісочниця mode.sandbox.description = Нескінченні ресурси та хвилі йдуть за вашим бажанням. mode.editor.name = Редактор @@ -783,28 +812,34 @@ rules.reactorexplosions = Вибухи реактора rules.wavetimer = Таймер для хвиль rules.waves = Хвилі rules.attack = Режим атаки +rules.buildai = Будування ШІ rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ rules.blockhealthmultiplier = Множник здоров’я блоків rules.blockdamagemultiplier = Множник шкоди блоків rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць rules.unithealthmultiplier = Множник здоров’я бойових одиниць rules.unitdamagemultiplier = Множник шкоди бойових одиниць -rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[lightgray] (плитки) +rules.enemycorebuildradius = Радіус оборони для ворожого ядра:[lightgray] (плитки) rules.wavespacing = Інтервал хвиль:[lightgray] (секунди) rules.buildcostmultiplier = Множник затрат на будування rules.buildspeedmultiplier = Множник швидкості будування -rules.deconstructrefundmultiplier = Множник відшкодування при демонтажі +rules.deconstructrefundmultiplier = Множник відшкодування у разі демонтажу rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках) rules.unitammo = Бойові одиниці потребують боєприпасів rules.title.waves = Хвилі -rules.title.resourcesbuilding = Ресурси & будування +rules.title.resourcesbuilding = Ресурси й будування rules.title.enemy = Противники rules.title.unit = Бойові одиниці rules.title.experimental = Експериментальне rules.title.environment = Середовище rules.lighting = Світлотінь +rules.fire = Вогонь +rules.explosions = Шкода від вибухів блоків і одиниць rules.ambientlight = Навколишнє світло +rules.weather = Погода +rules.weather.frequency = Повторюваність: +rules.weather.duration = Тривалість: rules.solarpowermultiplier = Множник сонячної енергії content.item.name = Предмети @@ -852,11 +887,12 @@ unit.fortress.name = Фортеця unit.nova.name = Нова unit.pulsar.name = Пульсар unit.quasar.name = Квазар -unit.crawler.name = Камікадзе +unit.crawler.name = Плазун unit.atrax.name = Атракс unit.spiroct.name = Павучник unit.arkyid.name = Аркиїд -unit.flare.name = Фальшфейєр +unit.toxopid.name = Отруйник +unit.flare.name = Фальшфеєр unit.horizon.name = Горизонт unit.zenith.name = Зеніт unit.antumbra.name = Тіньовик @@ -870,28 +906,31 @@ unit.bryde.name = Смугач Брайда unit.alpha.name = Альфа unit.beta.name = Бета unit.gamma.name = Гамма +unit.scepter.name = Верховна влада +unit.reign.name = Верховний Порядок +block.resupply-point.name = Пункт постачання block.parallax.name = Паралакс block.cliff.name = Скеля block.sand-boulder.name = Пісочний валун block.grass.name = Трава block.slag.name = Шлак block.salt.name = Сіль -block.saltrocks.name = Соляні камені +block.salt-wall.name = Соляна стіна block.pebbles.name = Галька block.tendrils.name = Щупальця -block.sandrocks.name = Піщані скелі +block.sand-wall.name = Піскова стіна block.spore-pine.name = Спорова сосна -block.sporerocks.name = Спорові камені -block.rock.name = Камінь -block.snowrock.name = Сніжний камінь +block.spore-wall.name = Спорова стіна +block.boulder.name = Брила +block.snow-boulder.name = Снігова брила block.snow-pine.name = Сніжні сосни block.shale.name = Сланець block.shale-boulder.name = Сланцевий валун block.moss.name = Мох block.shrubs.name = Кущі block.spore-moss.name = Споровий мох -block.shalerocks.name = Сланцеві породи +block.shale-wall.name = Сланцева стіна block.scrap-wall.name = Стіна з брухту block.scrap-wall-large.name = Велика стіна з брухту block.scrap-wall-huge.name = Величезна стіна з брухту @@ -916,16 +955,19 @@ block.darksand.name = Темний пісок block.ice.name = Лід block.snow.name = Сніг block.craters.name = Кратери -block.sand-water.name = Пісок з водою -block.darksand-water.name = Темний пісок з водою +block.sand-water.name = Пісок із водою +block.darksand-water.name = Темний пісок із водою block.char.name = Випалена земля -block.holostone.name = Голографічний камінь +block.dacite.name = Дацит +block.dacite-wall.name = Дацитова стіна block.ice-snow.name = Крижаний сніг -block.rocks.name = Камені -block.icerocks.name = Крижані камені -block.snowrocks.name = Снігові камені -block.dunerocks.name = Піщані камені +block.stone-wall.name = Кам’яна стіна +block.ice-wall.name = Крижана стіна +block.snow-wall.name = Снігова стіна +block.dune-wall.name = Дюнова стіна block.pine.name = Сосна +block.dirt.name = Ґрунт +block.dirt-wall.name = Ґрунтова стіна block.white-tree-dead.name = Мертве біле дерево block.white-tree.name = Біле дерево block.spore-cluster.name = Скупчення спор @@ -941,7 +983,7 @@ block.dark-panel-4.name = Темна панель 4 block.dark-panel-5.name = Темна панель 5 block.dark-panel-6.name = Темна панель 6 block.dark-metal.name = Темний метал -block.ignarock.name = Магматичні гірські породи +block.basalt.name = Базальт block.hotrock.name = Гарячий камінь block.magmarock.name = Магмовий камінь block.cliffs.name = Скелі @@ -966,7 +1008,7 @@ block.conveyor.name = Конвеєр block.titanium-conveyor.name = Титановий конвеєр block.plastanium-conveyor.name = Пластанієвий конвеєр block.armored-conveyor.name = Броньований конвеєр -block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що і титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. +block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що й титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. block.junction.name = Перехрестя block.router.name = Маршрутизатор block.distributor.name = Розподілювач @@ -993,7 +1035,7 @@ block.diode.name = Діод block.battery.name = Акумулятор block.battery-large.name = Великий акумулятор block.combustion-generator.name = Генератор згорання -block.turbine-generator.name = Паровий генератор +block.steam-generator.name = Паровий генератор block.differential-generator.name = Диференційний генератор block.impact-reactor.name = Імпульсний реактор block.mechanical-drill.name = Механічний бур @@ -1055,18 +1097,26 @@ block.container.name = Сховище block.launch-pad.name = Стартовий майданчик block.launch-pad-large.name = Великий стартовий майданчик block.segment.name = Сегмент +block.command-center.name = Командний центр block.ground-factory.name = Наземний завод block.air-factory.name = Повітряний завод block.naval-factory.name = Морський завод block.additive-reconstructor.name = Додавальний реконструктор block.multiplicative-reconstructor.name = Примножувальний реконструктор block.exponential-reconstructor.name = Експоненційний реконструктор -block.tetrative-reconstructor.name = Тетративний реконструктор +block.tetrative-reconstructor.name = Тетративний реконструктор block.payload-conveyor.name = Вантажний конвеєр block.payload-router.name = Розвантажувальний маршрутизатор block.disassembler.name = Розбирач block.silicon-crucible.name = Кремнієвий тигель block.large-overdrive-projector.name = Великий прискорювач +block.switch.name = Перемикач +block.micro-processor.name = Мікропроцесор +block.logic-processor.name = Логічний процесор +block.hyper-processor.name = Гіперпроцесор +block.logic-display.name = Логічний дисплей +block.large-logic-display.name = Великий логічний дисплей +block.memory-cell.name = Комірка пам’яті team.blue.name = Синя team.crux.name = Червона team.sharded.name = Помаранчева @@ -1076,39 +1126,39 @@ team.green.name = Зелена team.purple.name = Фіолетова tutorial.next = [lightgray]<Натисніть для продовження> -tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nВикористовуйте[accent] [[WASD][] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоб розпочати видобуток.\n\n[accent]{0}/{1} міді -tutorial.intro.mobile = Ви розпочали[scarlet] навчання по Mindustry.[]\nПроведіть по екрану для руху.\n[accent] Зведіть або розведіть 2 пальця[] для приближення і віддалення відповідно.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоб розпочати видобуток.\n\n[accent]{0}/{1} міді -tutorial.drill = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\n\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснувши [accent][[1][], незалежно від відкритої вкладки.\n[accent]Натисніть ПКМ[], щоб зупинити будування. -tutorial.drill.mobile = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\nВиберіть[accent] механічний бур[].\nРозмістіть його на мідній жилі натисканням, потім натисніть на [accent]галочку[] нижче, щоб підтвердити розміщення.\nНатисніть [accent]кнопку X[], щоб скасувати розміщення. +tutorial.intro = Ви розпочали[scarlet] навчання з Mindustry.[]\nВикористовуйте[accent] [[WASD][] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді +tutorial.intro.mobile = Ви розпочали[scarlet] навчання з Mindustry.[]\nПроведіть по екрану для руху.\n[accent] Зведіть або розведіть 2 пальця[] для приближення і віддалення відповідно.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді +tutorial.drill = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\n\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснувши [accent][[1][], незалежно від розгорнутої вкладки.\n[accent]Натисніть ПКМ[], щоби зупинити будування. +tutorial.drill.mobile = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\nВиберіть[accent] механічний бур[].\nРозмістіть його на мідній жилі натисканням, потім натисніть на [accent]галочку[] нижче, щоби підтвердити розміщення.\nНатисніть [accent]кнопку X[], щоби скасувати розміщення. tutorial.blockinfo = Кожний блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисніть на кнопку «?», коли ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура негайно.[] -tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш для розміщення у лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро. -tutorial.conveyor.mobile = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви обрали.\n\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро. -tutorial.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються у будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди повинні бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази. -tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоб заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1 +tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш для розміщення в лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро. +tutorial.conveyor.mobile = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви обрали.\n\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро. +tutorial.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються в будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди мають бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази. +tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоби заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1 tutorial.pause = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n [accent]Натисніть пробіл для паузи. tutorial.pause.mobile = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисніть кнопку вгорі ліворуч для паузи. tutorial.unpause = Призупиніть гру, натиснувши на пробіл. -tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоб зняти паузу. -tutorial.breaking = Блоки часто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення у зоні. -tutorial.breaking.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоб зламати його.\nЗнищте область, утримуючи палець протягом декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоб підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення у зоні. +tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоби зняти паузу. +tutorial.breaking = Блоки часто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні. +tutorial.breaking.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоби зламати його.\nВидаліть ділянку, утримуючи палець упродовж декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоби підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні. tutorial.withdraw = У деяких ситуаціях потрібно брати предмети безпосередньо з блоків.\nЩоб зробити це, [accent]натисніть на блок[] з предметами, і потім [accent]натисніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натискаючи та утримуючи[].\n\n [accent]Вилучіть трохи міді з ядра.[] tutorial.deposit = Покладіть предмети в блок, перетягнувши з вашого корабля в потрібний блок.\n\n[accent]Покладіть мідь назад у ядро.[] -tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль.[accent] Натисніть ЛКМ[], щоб стріляти.\nПобудуйте більше башт і бурів. Добудьте більше міді. +tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль.[accent] Натисніть ЛКМ[], щоби стріляти.\nПобудуйте більше башт і бурів. Добудьте більше міді. tutorial.waves.mobile = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль. Ваш корабель буде автоматично атакувати противників.\nПобудуйте більше башт і бурів. Добудьте більше міді. tutorial.launch = Як тільки ви досягнете певної хвилі, ви зможете[accent] запустити ядро[], залишивши свою базу позаду, та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску. item.copper.description = Початковий будівельний матеріал. Широко використовується у всіх типах блоків. -item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та у транспортуванні рідин. +item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та в транспортуванні рідин. item.metaglass.description = Дуже жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини. item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та як електричний компонент. -item.sand.description = Поширений матеріал, який широко використовується при виплавці, як при сплавленні, так і в якості відходів. +item.sand.description = Поширений матеріал, який широко використовується у виплавці, як під час сплавлення, так і в якості відходів. item.coal.description = Скам’янілі рослинні речовини, що утворилися задовго до посіву. Широко використовується для виробництва пального та ресурсів. item.titanium.description = Рідкісний надлегкий метал, який широко використовується для транспортування рідини, бурів і літаків. item.thorium.description = Щільний радіоактивний метал, що використовується в якості конструкційної опори та ядерного палива. item.scrap.description = Залишки старих споруд та підрозділів. Містить мікроелементи багатьох різних металів. item.silicon.description = Надзвичайно корисний напівпровідник. Має застосування в сонячних батареях, складній електроніці та боєприпасах для башт. item.plastanium.description = Легкий пластичний матеріал, що використовується в сучасних літальних апаратах та у фрагментованих боєприпасах. -item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та у технології самовідновлення. +item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та в технології самовідновлення. item.surge-alloy.description = Удосконалений сплав з унікальними електричними властивостями. item.spore-pod.description = Струмок синтетичних спор, синтезований з атмосферних концентрацій для промислових цілей. Використовується для перетворення на нафту, вибухівку та паливо. item.blast-compound.description = Нестабільна сполука, яка використовується в бомбах і вибухівках. Синтезується зі спорових стручків та інших летких речовин. Використовувати як паливо не рекомендується. @@ -1116,24 +1166,24 @@ item.pyratite.description = Надзвичайно легкозаймиста р liquid.water.description = Найкорисніша рідина. Зазвичай використовується для охолодження машин та перероблювання відходів. liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя. liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена у вугілля в якості палива або використана як куля. -liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує. +liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Має здатність надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує. block.message.description = Зберігає повідомлення. Використовується для комунікації між союзниками. block.graphite-press.description = Стискає шматки вугілля в чисті аркуші графіту. block.multi-press.description = Модернізована версія графітового преса. Використовує воду та енергію для швидкого та ефективного перероблювання вугілля. -block.silicon-smelter.description = Змішує пісок з чистим вугіллям. Виробляє кремній. +block.silicon-smelter.description = Змішує пісок із чистим вугіллям. Виробляє кремній. block.kiln.description = Виплавляє пісок та свинець у сполуку, відому як метаскло. Для запуску потрібна невелика кількість енергії. -block.plastanium-compressor.description = Виробляє пластаній з нафти та титану. +block.plastanium-compressor.description = Виробляє пластаній із нафти та титану. block.phase-weaver.description = Синтезує фазову тканину з радіоактивного торію та піску. Для роботи потрібна велика кількість енергії. block.alloy-smelter.description = Поєднує титан, свинець, кремній і мідь для отримання кінетичного сплаву. -block.cryofluidmixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання у торієвому реактору. -block.blast-mixer.description = Подрібнює і змішує скупчення спор з піротитом для отримання вибухової суміші. +block.cryofluidmixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання в торієвому реактору. +block.blast-mixer.description = Подрібнює і змішує скупчення спор із піротитом для отримання вибухової суміші. block.pyratite-mixer.description = Змішує вугілля, свинець та пісок у легкозаймистий піротит. -block.melter.description = Розплавляє брухт у шлак для подальшого перероблювання, або використання у баштах «Хвиля». +block.melter.description = Розплавляє брухт у шлак для подальшого перероблювання, або використання в баштах «Хвиля». block.separator.description = Відокремлює шлак на його мінеральні компоненти. Виводить охолоджені матеріали. block.spore-press.description = Стискає спорові стручки під сильним тиском для синтезу нафти. block.pulverizer.description = Подрібнює брухт у дрібний пісок. -block.coal-centrifuge.description = Нафта перетворюється у шматки вугілля. +block.coal-centrifuge.description = Нафта перетворюється в шматки вугілля. block.incinerator.description = Випаровує будь-який зайвий предмет або рідину, які він отримує. block.power-void.description = Знищує будь-яку енергію, до якої він під’єднаний. Тільки пісочниця. block.power-source.description = Постійно створює енергію. Тільки пісочниця. @@ -1141,30 +1191,30 @@ block.item-source.description = Постійно створює предмети block.item-void.description = Знищує будь-які предмети. Тільки пісочниця. block.liquid-source.description = Постійно створює рідини. Тільки пісочниця. block.liquid-void.description = Видаляє будь-які рідини. Тільки пісочниця. -block.copper-wall.description = Дешевий захисний блок.\nКорисний для захисту ядра та башт у перші кілька хвиль. -block.copper-wall-large.description = Дешевий захисний блок.\nКорисний для захисту ядра та башт у перші кілька хвиль.\nЗаймає декілька плиток. -block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від противників. -block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від противників.\nЗаймає декілька плиток. -block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів. -block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток. -block.thorium-wall.description = Сильний захисний блок.\nГідний захист від противників. -block.thorium-wall-large.description = Сильний захисний блок.\nГідний захист від противників.\nЗаймає декілька плиток. -block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі. -block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі.\nЗаймає декілька плиток. -block.surge-wall.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином. -block.surge-wall-large.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток. -block.door.description = Невеликі двері. Можна відкрити або закрити, натиснувши. -block.door-large.description = Великі двері. Можна відкрити та закрити, натиснувши.\nЗаймає декілька плиток. -block.mender.description = Періодично ремонтує блоки у його радіусі дії. Захищає башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності. -block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки у його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. +block.copper-wall.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль. +block.copper-wall-large.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль.\nЗаймає декілька плиток. +block.titanium-wall.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників. +block.titanium-wall-large.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників.\nЗаймає декілька плиток. +block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів. +block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток. +block.thorium-wall.description = Сильний оборонний блок.\nГарна оборона від противників. +block.thorium-wall-large.description = Сильний оборонний блок.\nГарна оборона від противників.\nЗаймає декілька плиток. +block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару. +block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару.\nЗаймає декілька плиток. +block.surge-wall.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином. +block.surge-wall-large.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток. +block.door.description = Невеликі двері. Можна відчинити або зачинити, натиснувши на них. +block.door-large.description = Великі двері. Можна відчинити та зачинити, натиснувши на них.\nЗаймає декілька плиток. +block.mender.description = Періодично ремонтує блоки в його радіусі дії. Боронить башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності. +block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки в його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. block.overdrive-projector.description = Збільшує швидкість найближчих будівель.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. -block.force-projector.description = Створює навколо себе шестикутне силове поле, захищаючи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину. +block.force-projector.description = Створює навколо себе шестикутне силове поле, боронячи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину. block.shock-mine.description = Наносить шкоду противникам, коли вони наступають на міну. Майже невидима для противника. block.conveyor.description = Базовий транспортний блок. Переміщує елементи вперед і автоматично перетворює їх у блоки. Можна обертати. block.titanium-conveyor.description = Покращений блок транспорту елементів. Переміщує предмети швидше, ніж звичайні конвеєри. -block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду. +block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду.\nПотребує кілька точок завантаження та розвантаження для максимальної пропускної здатності. block.junction.description = Діє як міст для двох перехресних конвеєрних стрічок. Корисно в ситуаціях, коли два різних конвеєри перевозять різні матеріали в різні місця. -block.bridge-conveyor.description = Покращений блок транспорту елементів. Дозволяє транспортувати предмети до 3-ох плиток з будь-якої місцевості чи будівлі. +block.bridge-conveyor.description = Покращений блок транспорту елементів. Дає змогу транспортувати предмети до 3-ох плиток із будь-якої місцевості чи будівлі. block.phase-conveyor.description = Покращений блок транспорту елементів. Використовує енергію для телепортування елементів на під’єднаний фазовий конвеєр через кілька плиток. block.sorter.description = Сортує предмети. Якщо елемент відповідає вибраному, його можна передати. В іншому випадку елемент виводиться зліва та/чи справа. block.inverted-sorter.description = Обробляє елементи, як звичайний сортувальник, але виводить обрані елементи на сторони. @@ -1173,35 +1223,35 @@ block.distributor.description = Поліпшений маршрутизатор. block.overflow-gate.description = Вивантажує лише вліво та/або вправо, якщо передній шлях заблокований. block.underflow-gate.description = Повна протилежність надмірному затвору. Виводить предмет прямо, якщо лівий та/або правий шлях заблоковано. block.mass-driver.description = Найкращий блок для транспортування предметів. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнітної катапульти на велику відстань. Для роботи потребує енергія. -block.mechanical-pump.description = Дешевий насос з повільним виходом, але не потребує енергоспоживання. +block.mechanical-pump.description = Дешевий насос із повільним виходом, але не потребує енергоспоживання. block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію. block.thermal-pump.description = Найкращий насос. block.conduit.description = Основний блок транспортування рідини. Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами. -block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує і більше зберігає рідини, ніж стандартні трубопроводи. -block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин з боків окрім інших трубопроводів.\nПротікає менше. +block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує й більше зберігає рідини, ніж стандартні трубопроводи. +block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин із боків окрім інших трубопроводів.\nПротікає менше. block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також можна зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела до кількох мішеней. -block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях з непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків. +block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях із непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків. block.liquid-junction.description = Діє як міст для двох каналів, що перетинаються. Корисно в ситуаціях, коли два різні трубопроводи транспортують різні рідини в різні місця. -block.bridge-conduit.description = Удосконалений блок транспортування рідини. Дозволяє транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі. +block.bridge-conduit.description = Удосконалений блок транспортування рідини. Надає можливість транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі. block.phase-conduit.description = Удосконалений блок транспортування рідини. Використовує енергію для транспортування рідин до приєднаного фазового каналу через декілька плиток. block.power-node.description = Передає живлення на приєднані вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них. block.power-node-large.description = Поліпшений вузол живлення з більшим радіусом дії. block.surge-tower.description = Вузол живлення з меншою кількістю доступних з’єднань і з найбільшим радіусом дії. block.diode.description = Живлення акумулятора може протікати через цей блок лише в одному напрямку, але лише в тому випадку, якщо інша сторона має менше енергії. -block.battery.description = Зберігає енергію як буфер в часи надлишкової енергії. Виводить енергію у періоди дефіциту. +block.battery.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту. block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор. block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, такі як вугілля. -block.thermal-generator.description = Генерує енергію при розміщенні в спекотних місцях. -block.turbine-generator.description = Удосконалений генератор згоряння. Більш ефективний, але потребує додаткової води для отримання пари. -block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною і піротитом, що горить. +block.thermal-generator.description = Генерує енергію у разі розміщення в спекотних місцях. +block.steam-generator.description = Удосконалений генератор згоряння. Більш ефективний, але потребує додаткової води для отримання пари. +block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною й піротитом, що горить. block.rtg-generator.description = Простий і надійний генератор. Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю. block.solar-panel.description = Забезпечує невелику кількість енергії від сонця. -block.solar-panel-large.description = Значно ефективніша версія стандартної сонячної панелі. +block.solar-panel-large.description = Значно ефективніша ніж стандартна сонячна панель. block.thorium-reactor.description = Виробляє значну кількість енергії з торію. Вимагає постійного охолодження. Сильно вибухне, якщо подаватиметься недостатня кількість теплоносія. Вихідна потужність залежить від заповненості, базова потужність генерується на повній місткості. -block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії при максимальній ефективності. Для запуску процесу потрібно значні обсяги енергії. +block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії за максимальною ефективності. Для запуску процесу потрібно значні обсяги енергії. block.mechanical-drill.description = Недорогий бур. Якщо розмістити на доречних плитках, то виводитиме предмети постійно, але повільно. Придатний лише для базових ресурсів. -block.pneumatic-drill.description = Поліпшений бур, здатний добувати титан. Видобуває швидше, ніж механічний бур. -block.laser-drill.description = Дозволяє виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію. +block.pneumatic-drill.description = Поліпшений бур, здатний видобувати титан. Видобуває швидше, ніж механічний бур. +block.laser-drill.description = Дає змогу виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію. block.blast-drill.description = Найкращий бур. Потрібна велика кількість енергії. block.water-extractor.description = Видобуває підземні води. Використовується в місцях, де немає поверхневої води. block.cultivator.description = Культивує невеликі концентрації спор в атмосфері на готові до промисловості стручки. @@ -1212,15 +1262,15 @@ block.core-nucleus.description = Третя й остання версія ка block.vault.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.container.description = Зберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.unloader.description = Вивантажує предмети з блока, який не переміщує предмети, на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок. -block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик дозволяє вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте у нього ресурси та забезпечте енергією. +block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик надає можливість вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте в нього ресурси та забезпечте енергією. block.launch-pad-large.description = Поліпшена версія стартового майданчика. Зберігає більше предметів. Запускається частіше. -block.duo.description = Мала і дешева башта. Корисна проти наземних одиниць. -block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла у противників. +block.duo.description = Мала й дешева башта. Корисна проти наземних одиниць. +block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла в противників. block.scorch.description = Підпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані. block.hail.description = Невелика артилерійська башта з далеким радіусом дії. block.wave.description = Башта середнього розміру. Випускає потоками рідини в противників. Автоматично гасить пожежі при постачанні води. block.lancer.description = Лазерна башта середнього розміру, яка атакує наземних противників. Заряджає і вистрілює потужні пучки енергії. -block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики у противників. +block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики в противників. block.swarmer.description = Ракетна башта середнього розміру. Атакує як повітряних, так і наземних противників. Запускає ракети, які летять у противників самостійно. block.salvo.description = Більш велика, вдосконалена версія башти «Подвійна». Вистрілює швидкий залп куль у противника. block.fuse.description = Велика енергетична башта з малим радіусом дії. Стріляє трьома пронизливими променями на найближчих противників. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 13cf2709e2..f3b85a3464 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -993,7 +993,7 @@ block.diode.name = 二极管 block.battery.name = 电池 block.battery-large.name = 大型电池 block.combustion-generator.name = 火力发电机 -block.turbine-generator.name = 涡轮发电机 +block.steam-generator.name = 涡轮发电机 block.differential-generator.name = 温差发电机 block.impact-reactor.name = 冲击反应堆 block.mechanical-drill.name = 机械钻头 @@ -1192,7 +1192,7 @@ block.battery.description = 存储能量作为缓冲,在发电量不足时提 block.battery-large.description = 比普通电池容量更大。 block.combustion-generator.description = 燃烧煤等材料发电。 block.thermal-generator.description = 放置在炽热的地形上能够发电。 -block.turbine-generator.description = 先进的火力发电机,效率更高,但需要水来产生蒸汽。 +block.steam-generator.description = 先进的火力发电机,效率更高,但需要水来产生蒸汽。 block.differential-generator.description = 利用低温流体与燃烧的硫之间的温差产生大量能量。 block.rtg-generator.description = 一种简单可靠的发电机。利用放射性化合物的衰变产生的热量,以缓慢的速度产生能量。 block.solar-panel.description = 普通太阳能板,提供少量电力。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index ea90067971..cf729a4a7f 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -993,7 +993,7 @@ block.diode.name = 二極體 block.battery.name = 電池 block.battery-large.name = 大型電池 block.combustion-generator.name = 燃燒發電機 -block.turbine-generator.name = 渦輪發電機 +block.steam-generator.name = 渦輪發電機 block.differential-generator.name = 差動發電機 block.impact-reactor.name = 衝擊反應堆 block.mechanical-drill.name = 機械鑽頭 @@ -1192,7 +1192,7 @@ block.battery.description = 有能量剩餘時存儲電力並在能量短缺時 block.battery-large.description = 比普通電池存儲更多的能量。 block.combustion-generator.description = 透過燃燒原油或可燃物品以產生能量。 block.thermal-generator.description = 放置在熱的位置時會產生能量。 -block.turbine-generator.description = 比燃燒發電機更有效率,但需要水才能運作。 +block.steam-generator.description = 比燃燒發電機更有效率,但需要水才能運作。 block.differential-generator.description = 利用冷卻液和燃燒火焰彈之間的溫差產生大量的能量。 block.rtg-generator.description = 一種簡單、可靠的發電機,使用放射性化合物衰變所產生的熱產生少量能量。不需要冷卻,但產生的能量比釷反應堆少。 block.solar-panel.description = 透過太陽產生少量的能量。 diff --git a/core/assets/contributors b/core/assets/contributors index ee8b77ddb9..f52a9bfccb 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -89,3 +89,4 @@ Daniel Dusek DeltaNedas GioIacca9 SnakkiZXZ +sk7725 diff --git a/core/assets/fonts/font.woff b/core/assets/fonts/font.woff index 7960523d0f..4d8ed4b9f7 100644 Binary files a/core/assets/fonts/font.woff and b/core/assets/fonts/font.woff differ diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 33acc0bd9c..fecea63b77 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -134,7 +134,7 @@ 63610=battery-large|block-battery-large-medium 63609=combustion-generator|block-combustion-generator-medium 63608=thermal-generator|block-thermal-generator-medium -63607=turbine-generator|block-turbine-generator-medium +63607=steam-generator|block-steam-generator-medium 63606=differential-generator|block-differential-generator-medium 63605=rtg-generator|block-rtg-generator-medium 63604=solar-panel|block-solar-panel-medium @@ -286,3 +286,28 @@ 63458=switch|block-switch-medium 63457=memory-cell|block-memory-cell-medium 63456=payload-conveyor|block-payload-conveyor-medium +63455=hyper-processor|block-hyper-processor-medium +63454=toxopid|unit-toxopid-medium +63453=vestige|unit-vestige-medium +63452=cataclyst|unit-cataclyst-medium +63451=scepter|unit-scepter-medium +63450=reign|unit-reign-medium +63449=dirt|block-dirt-medium +63448=dirtwall|block-dirtwall-medium +63447=stone-wall|block-stone-wall-medium +63446=spore-wall|block-spore-wall-medium +63445=ice-wall|block-ice-wall-medium +63444=snow-wall|block-snow-wall-medium +63443=dune-wall|block-dune-wall-medium +63442=sand-wall|block-sand-wall-medium +63441=salt-wall|block-salt-wall-medium +63440=shale-wall|block-shale-wall-medium +63439=dirt-wall|block-dirt-wall-medium +63438=holostone-wall|block-holostone-wall-medium +63437=basalt|block-basalt-medium +63436=dacite|block-dacite-medium +63435=boulder|block-boulder-medium +63434=snow-boulder|block-snow-boulder-medium +63433=dacite-wall|block-dacite-wall-medium +63432=dacite-boulder|block-dacite-boulder-medium +63431=large-logic-display|block-large-logic-display-medium diff --git a/core/assets/maps/fungalPass.msav b/core/assets/maps/fungalPass.msav index 2415d16ae4..c154c2e4db 100644 Binary files a/core/assets/maps/fungalPass.msav and b/core/assets/maps/fungalPass.msav differ diff --git a/core/assets/planets/serpulo.dat b/core/assets/planets/serpulo.dat index d31bf6c11c..3a1465dfde 100644 Binary files a/core/assets/planets/serpulo.dat and b/core/assets/planets/serpulo.dat differ diff --git a/core/assets/scripts/base.js b/core/assets/scripts/base.js index b6e377fa24..c6d7be846b 100755 --- a/core/assets/scripts/base.js +++ b/core/assets/scripts/base.js @@ -5,8 +5,9 @@ const log = function(context, obj){ } const readString = path => Vars.mods.getScripts().readString(path) - const readBytes = path => Vars.mods.getScripts().readBytes(path) +const loadMusic = path => Vars.mods.getScripts().loadMusic(path) +const loadSound = path => Vars.mods.getScripts().loadSound(path) var scriptName = "base.js" var modName = "none" diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 028dd591eb..5377350e3d 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -7,8 +7,9 @@ const log = function(context, obj){ } const readString = path => Vars.mods.getScripts().readString(path) - const readBytes = path => Vars.mods.getScripts().readBytes(path) +const loadMusic = path => Vars.mods.getScripts().loadMusic(path) +const loadSound = path => Vars.mods.getScripts().loadSound(path) var scriptName = "base.js" var modName = "none" @@ -40,6 +41,7 @@ importPackage(Packages.arc) importPackage(Packages.arc.func) importPackage(Packages.arc.graphics) importPackage(Packages.arc.graphics.g2d) +importPackage(Packages.arc.graphics.gl) importPackage(Packages.arc.math) importPackage(Packages.arc.math.geom) importPackage(Packages.arc.scene) @@ -77,6 +79,7 @@ importPackage(Packages.mindustry.maps) importPackage(Packages.mindustry.maps.filters) importPackage(Packages.mindustry.maps.generators) importPackage(Packages.mindustry.maps.planet) +importPackage(Packages.mindustry.net) importPackage(Packages.mindustry.type) importPackage(Packages.mindustry.ui) importPackage(Packages.mindustry.ui.dialogs) @@ -122,7 +125,7 @@ const BlockBuildBeginEvent = Packages.mindustry.game.EventType.BlockBuildBeginEv const ResearchEvent = Packages.mindustry.game.EventType.ResearchEvent const UnlockEvent = Packages.mindustry.game.EventType.UnlockEvent const StateChangeEvent = Packages.mindustry.game.EventType.StateChangeEvent -const BuildinghangeEvent = Packages.mindustry.game.EventType.BuildinghangeEvent +const TileChangeEvent = Packages.mindustry.game.EventType.TileChangeEvent const GameOverEvent = Packages.mindustry.game.EventType.GameOverEvent const ConfigEvent = Packages.mindustry.game.EventType.ConfigEvent const DepositEvent = Packages.mindustry.game.EventType.DepositEvent diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index 5d0c07f0b5..0ef97761e1 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 a8a1c936ab..788eabc640 100644 --- a/core/assets/sprites/fallback/sprites.atlas +++ b/core/assets/sprites/fallback/sprites.atlas @@ -88,13 +88,6 @@ tetrative-reconstructor-top orig: 288, 288 offset: 0, 0 index: -1 -circle-shadow - rotate: false - xy: 1387, 50 - size: 201, 201 - orig: 201, 201 - offset: 0, 0 - index: -1 antumbra-wreck0 rotate: false xy: 1613, 479 @@ -130,41 +123,6 @@ block-tetrative-reconstructor-full orig: 288, 288 offset: 0, 0 index: -1 -cracks-6-0 - rotate: false - xy: 1590, 43 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-1 - rotate: false - xy: 1784, 43 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-2 - rotate: false - xy: 775, 97 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-3 - rotate: false - xy: 969, 27 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-4 - rotate: false - xy: 1163, 27 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 cracks-7-0 rotate: false xy: 1161, 673 @@ -354,6 +312,27 @@ eclipse-wreck2 orig: 320, 320 offset: 0, 0 index: -1 +reign-wreck0 + rotate: false + xy: 1603, 95 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck1 + rotate: false + xy: 1819, 95 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck2 + rotate: false + xy: 807, 209 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 unit-antumbra-full rotate: false xy: 1831, 237 @@ -368,9 +347,16 @@ unit-eclipse-full orig: 320, 320 offset: 0, 0 index: -1 +unit-reign-full + rotate: false + xy: 775, 67 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 circle rotate: false - xy: 1839, 1050 + xy: 991, 6 size: 201, 201 orig: 201, 201 offset: 0, 0 @@ -403,6 +389,27 @@ eclipse-cell orig: 320, 320 offset: 0, 0 index: -1 +reign + rotate: false + xy: 1387, 111 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +toxopid-cannon + rotate: false + xy: 1839, 1031 + size: 206, 220 + orig: 206, 220 + offset: 0, 0 + index: -1 +toxopid-leg-base + rotate: false + xy: 1, 33 + size: 270, 64 + orig: 270, 64 + offset: 0, 0 + index: -1 sprites2.png size: 2048,2048 @@ -411,6086 +418,6247 @@ filter: nearest,nearest repeat: none core-silo rotate: false - xy: 713, 1887 + xy: 980, 1738 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 launch-pad rotate: false - xy: 521, 209 + xy: 1347, 888 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large rotate: false - xy: 1397, 1627 + xy: 1019, 1218 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 launch-pad-light rotate: false - xy: 521, 111 + xy: 1347, 790 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launchpod rotate: false - xy: 1575, 1037 + xy: 1111, 73 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 force-projector rotate: false - xy: 1125, 811 + xy: 1053, 598 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 force-projector-top rotate: false - xy: 1349, 1415 + xy: 1151, 810 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 1569, 839 + xy: 1311, 222 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 1635, 905 + xy: 1311, 156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-dome rotate: false - xy: 1125, 615 + xy: 1543, 736 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-top rotate: false - xy: 631, 549 + xy: 1543, 638 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 1701, 971 + xy: 1309, 90 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 1635, 839 + xy: 1298, 24 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-loader rotate: false - xy: 1043, 1203 + xy: 465, 798 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader rotate: false - xy: 647, 1137 + xy: 759, 696 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -bridge-arrow - rotate: false - xy: 767, 26 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor - rotate: false - xy: 1979, 217 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-bridge - rotate: false - xy: 1945, 149 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-end - rotate: false - xy: 1979, 183 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -center - rotate: false - xy: 1979, 149 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-0 - rotate: false - xy: 2001, 1799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-full - rotate: false - xy: 2001, 1799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-1 - rotate: false - xy: 2009, 1207 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-2 - rotate: false - xy: 1909, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-3 - rotate: false - xy: 2009, 1173 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-0 - rotate: false - xy: 1909, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-1 - rotate: false - xy: 2009, 1139 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-2 - rotate: false - xy: 1909, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-3 - rotate: false - xy: 2009, 1105 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-0 - rotate: false - xy: 2009, 1071 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-1 - rotate: false - xy: 2009, 1037 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-2 - rotate: false - xy: 2009, 1003 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-3 - rotate: false - xy: 2009, 969 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-0 - rotate: false - xy: 2009, 935 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-1 - rotate: false - xy: 2009, 901 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-2 - rotate: false - xy: 2009, 867 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-3 - rotate: false - xy: 2009, 833 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-0 - rotate: false - xy: 2009, 799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-1 - rotate: false - xy: 579, 77 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-2 - rotate: false - xy: 579, 43 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-3 - rotate: false - xy: 1909, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-1 - rotate: false - xy: 1819, 1175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-2 - rotate: false - xy: 1819, 1141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-3 - rotate: false - xy: 1853, 1209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-0 - rotate: false - xy: 1853, 1175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-1 - rotate: false - xy: 1853, 1141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-2 - rotate: false - xy: 1819, 1107 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-1-3 - rotate: false - xy: 1853, 1107 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-0 - rotate: false - xy: 1838, 1073 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-1 - rotate: false - xy: 1838, 1039 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-2 - rotate: false - xy: 1872, 1073 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-2-3 - rotate: false - xy: 1872, 1039 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 distributor rotate: false - xy: 1363, 674 + xy: 981, 139 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver-base rotate: false - xy: 1027, 713 + xy: 1445, 888 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor rotate: false - xy: 619, 451 + xy: 1543, 540 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-edge rotate: false - xy: 619, 353 + xy: 1543, 442 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-top rotate: false - xy: 619, 255 + xy: 1641, 768 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-top rotate: false - xy: 619, 255 + xy: 1641, 768 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router rotate: false - xy: 619, 157 + xy: 1641, 670 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-edge rotate: false - xy: 729, 529 + xy: 1641, 572 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-over rotate: false - xy: 827, 529 + xy: 1641, 474 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill rotate: false - xy: 155, 65 + xy: 629, 1446 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rim rotate: false - xy: 305, 1437 + xy: 629, 1316 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 305, 1307 + xy: 759, 1446 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 305, 1177 + xy: 759, 1316 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 drill-top rotate: false - xy: 1363, 476 + xy: 1034, 7 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -turbine-generator-liquid +steam-generator-liquid rotate: false - xy: 1363, 476 + xy: 1034, 7 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 1447, 1317 + xy: 1151, 516 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rim rotate: false - xy: 1545, 1415 + xy: 1249, 518 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 521, 307 + xy: 1271, 986 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 1545, 1317 + xy: 1369, 986 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 1503, 839 + xy: 1243, 90 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 1569, 905 + xy: 1232, 24 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 1635, 971 + xy: 1301, 288 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 733, 627 + xy: 1445, 594 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 831, 627 + xy: 1445, 496 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 929, 615 + xy: 1445, 398 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 1027, 615 + xy: 1543, 834 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 1429, 641 + xy: 1375, 68 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 1495, 707 + xy: 1441, 68 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 1429, 575 + xy: 1364, 2 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -water-extractor - rotate: false - xy: 1611, 179 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-liquid - rotate: false - xy: 1677, 179 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-rotator - rotate: false - xy: 1743, 377 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-top - rotate: false - xy: 1743, 311 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-border - rotate: false - xy: 1909, 225 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-middle - rotate: false - xy: 1943, 251 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-select - rotate: false - xy: 2011, 421 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-liquid - rotate: false - xy: 2001, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 place-arrow rotate: false - xy: 717, 431 + xy: 1739, 708 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -bridge-conduit - rotate: false - xy: 1809, 1255 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-arrow - rotate: false - xy: 1843, 1243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-arrow - rotate: false - xy: 1843, 1243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-bridge - rotate: false - xy: 1945, 217 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-end - rotate: false - xy: 1945, 183 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom - rotate: false - xy: 2013, 149 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-0 - rotate: false - xy: 1967, 115 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-1 - rotate: false - xy: 1967, 81 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-2 - rotate: false - xy: 2001, 115 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-3 - rotate: false - xy: 2001, 115 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-4 - rotate: false - xy: 2001, 115 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-0 - rotate: false - xy: 1977, 47 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-1 - rotate: false - xy: 1977, 13 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-2 - rotate: false - xy: 2011, 47 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-3 - rotate: false - xy: 2011, 13 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-3 - rotate: false - xy: 2011, 13 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-4 - rotate: false - xy: 1819, 1209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 liquid-tank-bottom rotate: false - xy: 533, 599 + xy: 1347, 692 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 1643, 1415 + xy: 1347, 594 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 1643, 1317 + xy: 1347, 496 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 1627, 707 + xy: 1575, 212 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 1109, 419 + xy: 1739, 414 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -data-processor-top +hyper-processor rotate: false - xy: 1039, 1105 + xy: 1249, 810 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +large-logic-display + rotate: false + xy: 1, 869 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 logic-display rotate: false - xy: 733, 725 + xy: 1249, 420 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor rotate: false - xy: 1641, 1037 + xy: 1113, 224 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -logic-processor-3 - rotate: false - xy: 831, 725 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery - rotate: false - xy: 1909, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 battery-large rotate: false - xy: 1153, 1301 + xy: 793, 1088 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-large-top rotate: false - xy: 435, 599 + xy: 891, 1088 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -battery-top - rotate: false - xy: 1909, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator - rotate: false - xy: 2013, 217 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator-top - rotate: false - xy: 2013, 183 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 differential-generator rotate: false - xy: 1137, 1105 + xy: 955, 598 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-liquid rotate: false - xy: 929, 1007 + xy: 969, 892 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-top rotate: false - xy: 929, 909 + xy: 977, 990 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 impact-reactor rotate: false - xy: 487, 1627 + xy: 1173, 1478 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-bottom rotate: false - xy: 617, 1627 + xy: 1303, 1478 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-light rotate: false - xy: 747, 1627 + xy: 1433, 1458 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-0 rotate: false - xy: 877, 1627 + xy: 1563, 1458 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-1 rotate: false - xy: 1007, 1627 + xy: 1693, 1458 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-2 rotate: false - xy: 1137, 1627 + xy: 1823, 1458 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-3 rotate: false - xy: 1267, 1627 + xy: 1019, 1348 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 1495, 641 + xy: 1430, 2 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 1495, 509 + xy: 1641, 233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 1011, 321 + xy: 1641, 376 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -surge-tower - rotate: false - xy: 1611, 377 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-generator - rotate: false - xy: 1677, 377 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 thorium-reactor rotate: false - xy: 1109, 321 + xy: 1837, 446 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 913, 223 + xy: 1935, 446 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-top rotate: false - xy: 1011, 223 + xy: 1739, 316 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -turbine-generator - rotate: false - xy: 1677, 311 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-cap - rotate: false - xy: 1611, 245 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-top - rotate: false - xy: 1677, 245 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-turbine0 - rotate: false - xy: 1413, 179 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-turbine1 - rotate: false - xy: 1479, 179 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 alloy-smelter rotate: false - xy: 957, 1301 + xy: 597, 1088 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 1055, 1301 + xy: 695, 1088 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-mixer rotate: false - xy: 1521, 1169 + xy: 1982, 1910 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-forge rotate: false - xy: 415, 11 + xy: 479, 896 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 coal-centrifuge rotate: false - xy: 1295, 19 + xy: 770, 38 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-bottom rotate: false - xy: 1377, 1070 + xy: 915, 213 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 1371, 1004 + xy: 915, 147 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 1371, 938 + xy: 913, 81 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator rotate: false - xy: 1371, 872 + xy: 902, 15 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 1371, 806 + xy: 989, 271 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 1363, 740 + xy: 981, 205 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 disassembler rotate: false - xy: 1027, 1007 + xy: 1075, 1006 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-liquid rotate: false - xy: 1027, 909 + xy: 1173, 1006 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-spinner rotate: false - xy: 1125, 1007 + xy: 1075, 908 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press rotate: false - xy: 1347, 344 + xy: 1100, 7 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln rotate: false - xy: 1347, 278 + xy: 1169, 298 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-top rotate: false - xy: 1347, 212 + xy: 1235, 288 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 1347, 212 + xy: 1235, 288 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 multi-press rotate: false - xy: 1125, 713 + xy: 1445, 790 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 1437, 773 + xy: 1377, 266 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 1503, 773 + xy: 1377, 200 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 1569, 773 + xy: 1443, 266 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 1635, 773 + xy: 1443, 200 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 1701, 773 + xy: 1377, 134 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 1429, 509 + xy: 1575, 278 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator rotate: false - xy: 1495, 443 + xy: 1562, 14 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 1561, 443 + xy: 1773, 102 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-spinner rotate: false - xy: 1627, 443 + xy: 1839, 102 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-crucible rotate: false - xy: 913, 321 + xy: 1935, 544 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-crucible-top rotate: false - xy: 1011, 419 + xy: 1543, 344 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 1693, 443 + xy: 1773, 36 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press rotate: false - xy: 1413, 377 + xy: 1839, 36 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame0 rotate: false - xy: 1479, 377 + xy: 1905, 46 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame1 rotate: false - xy: 1413, 311 + xy: 1971, 46 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -spore-press-frame2 - rotate: false - xy: 1545, 377 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-liquid - rotate: false - xy: 1479, 311 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-top - rotate: false - xy: 1413, 245 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rock1 - rotate: false - xy: 1959, 1179 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rock2 - rotate: false - xy: 1909, 1129 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrock1 - rotate: false - xy: 1909, 1029 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrock2 - rotate: false - xy: 1959, 1029 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-cluster1 - rotate: false - xy: 1909, 653 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster2 - rotate: false - xy: 1909, 611 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster3 - rotate: false - xy: 1909, 569 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 container rotate: false - xy: 513, 43 + xy: 849, 236 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation rotate: false - xy: 357, 1725 + xy: 913, 1576 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-foundation-team rotate: false - xy: 487, 1757 + xy: 889, 1446 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus rotate: false - xy: 389, 1887 + xy: 1, 99 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-nucleus-team rotate: false - xy: 1, 1337 + xy: 1496, 1880 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard rotate: false - xy: 635, 1039 + xy: 857, 696 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard-team rotate: false - xy: 635, 941 + xy: 465, 602 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 vault rotate: false - xy: 717, 137 + xy: 1837, 348 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -arc-heat - rotate: false - xy: 1809, 188 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-1 - rotate: false - xy: 1909, 293 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-2 rotate: false - xy: 1587, 1169 + xy: 572, 58 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-3 rotate: false - xy: 423, 501 + xy: 487, 994 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-4 rotate: false - xy: 305, 1047 + xy: 629, 1186 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -hail-heat - rotate: false - xy: 555, 1 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 lancer-heat rotate: false - xy: 1509, 1037 + xy: 1047, 139 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 1657, 1627 + xy: 1149, 1218 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 815, 431 + xy: 1739, 512 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 1627, 641 + xy: 1641, 167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 1693, 707 + xy: 1707, 173 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 1561, 509 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -wave-liquid - rotate: false - xy: 1743, 179 + xy: 1641, 101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 additive-reconstructor rotate: false - xy: 957, 1399 + xy: 1897, 1230 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 additive-reconstructor-top rotate: false - xy: 1055, 1399 + xy: 1929, 1360 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory rotate: false - xy: 1153, 1399 + xy: 499, 1092 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 command-center rotate: false - xy: 1361, 19 + xy: 857, 302 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 factory-in-3 rotate: false - xy: 1125, 909 + xy: 1173, 908 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 factory-in-5 rotate: false - xy: 1, 365 + xy: 163, 221 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 factory-out-3 rotate: false - xy: 929, 811 + xy: 1053, 794 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 factory-out-5 rotate: false - xy: 1523, 1887 + xy: 163, 59 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 factory-top-3 rotate: false - xy: 1027, 811 + xy: 1053, 696 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ground-factory rotate: false - xy: 1447, 1415 + xy: 1151, 614 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor rotate: false - xy: 1, 203 + xy: 325, 383 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 multiplicative-reconstructor-top rotate: false - xy: 1685, 1887 + xy: 325, 221 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory rotate: false - xy: 635, 647 + xy: 1445, 692 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rally-point rotate: false - xy: 1495, 575 + xy: 1509, 212 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 resupply-point rotate: false - xy: 1561, 641 + xy: 1509, 146 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 1297, 711 + xy: 849, 170 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large rotate: false - xy: 1363, 608 + xy: 979, 73 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 1363, 542 + xy: 968, 7 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 1701, 839 + xy: 1433, 332 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-wall-large rotate: false - xy: 1429, 707 + xy: 1443, 134 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-gigantic rotate: false - xy: 617, 1497 + xy: 1669, 1328 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge2 rotate: false - xy: 1121, 517 + xy: 1837, 544 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge3 rotate: false - xy: 913, 419 + xy: 1935, 642 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-large1 rotate: false - xy: 1693, 641 + xy: 1509, 80 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large2 rotate: false - xy: 1627, 509 + xy: 1575, 80 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large3 rotate: false - xy: 1693, 575 + xy: 1641, 35 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large4 rotate: false - xy: 1693, 509 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-wall-large - rotate: false - xy: 1545, 311 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-wall-large - rotate: false - xy: 1611, 311 + xy: 1707, 41 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster rotate: false - xy: 877, 1497 + xy: 1409, 1198 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -titanium-wall-large - rotate: false - xy: 1545, 245 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bullet - rotate: false - xy: 1305, 779 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -bullet-back - rotate: false - xy: 1613, 67 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 circle-end rotate: false - xy: 549, 1296 + xy: 1475, 997 size: 100, 199 orig: 100, 199 offset: 0, 0 index: -1 -error +circle-shadow rotate: false - xy: 1817, 588 - size: 48, 48 - orig: 48, 48 + xy: 1, 1839 + size: 201, 201 + orig: 201, 201 offset: 0, 0 index: -1 laser-end rotate: false - xy: 1207, 407 + xy: 577, 204 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 1207, 333 + xy: 733, 368 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -missile - rotate: false - xy: 1311, 1265 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -missile-back - rotate: false - xy: 1809, 1289 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 parallax-laser-end rotate: false - xy: 1207, 259 + xy: 807, 442 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -particle - rotate: false - xy: 1959, 693 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -shell - rotate: false - xy: 2009, 1241 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -shell-back - rotate: false - xy: 1909, 531 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -alpha-wreck0 - rotate: false - xy: 1767, 71 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck1 - rotate: false - xy: 1427, 13 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck2 - rotate: false - xy: 1477, 13 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -arc - rotate: false - xy: 1741, 1327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 arkyid-wreck0 rotate: false - xy: 163, 455 + xy: 499, 1190 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 arkyid-wreck1 rotate: false - xy: 163, 325 + xy: 653, 1576 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 arkyid-wreck2 rotate: false - xy: 163, 195 + xy: 783, 1576 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 atrax-wreck0 rotate: false - xy: 1085, 80 + xy: 1953, 1590 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-wreck1 rotate: false - xy: 811, 26 + xy: 1953, 1524 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-wreck2 rotate: false - xy: 901, 14 + xy: 1953, 1458 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 -beta-wreck0 - rotate: false - xy: 1727, 21 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck1 - rotate: false - xy: 1777, 21 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck2 - rotate: false - xy: 1817, 71 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 block-additive-reconstructor-full rotate: false - xy: 423, 403 + xy: 585, 990 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-air-factory-full rotate: false - xy: 423, 305 + xy: 683, 990 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-arc-full - rotate: false - xy: 1909, 259 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-blast-drill-full rotate: false - xy: 305, 917 + xy: 759, 1186 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -block-char-full - rotate: false - xy: 613, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-full - rotate: false - xy: 647, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-full - rotate: false - xy: 681, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-full - rotate: false - xy: 1199, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-0 - rotate: false - xy: 1199, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-core-foundation-full rotate: false - xy: 305, 787 + xy: 357, 1040 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-core-nucleus-full rotate: false - xy: 1, 1499 + xy: 1, 423 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 block-core-shard-full rotate: false - xy: 423, 207 + xy: 781, 990 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-craters-full - rotate: false - xy: 1233, 151 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-cryofluidmixer-full rotate: false - xy: 1653, 1169 + xy: 1241, 354 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cultivator-full rotate: false - xy: 1163, 6 + xy: 1097, 290 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cyclone-full rotate: false - xy: 423, 109 + xy: 879, 990 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-dark-metal-full - rotate: false - xy: 1951, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-full - rotate: false - xy: 1951, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dunerocks-full - rotate: false - xy: 1951, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-full - rotate: false - xy: 2009, 765 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-fuse-full rotate: false - xy: 651, 1235 + xy: 577, 892 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-grass-full - rotate: false - xy: 2001, 731 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-ground-factory-full rotate: false - xy: 749, 1215 + xy: 675, 892 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-hail-full - rotate: false - xy: 2001, 697 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-full - rotate: false - xy: 1951, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-full - rotate: false - xy: 1947, 523 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-full - rotate: false - xy: 1943, 489 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-full - rotate: false - xy: 1943, 455 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-icerocks-full - rotate: false - xy: 1943, 421 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-full - rotate: false - xy: 1943, 387 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-impact-reactor-full rotate: false - xy: 305, 657 + xy: 349, 910 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-lancer-full rotate: false - xy: 1719, 1169 + xy: 659, 302 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-laser-drill-full rotate: false - xy: 847, 1215 + xy: 773, 892 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-liquid-router-full - rotate: false - xy: 1943, 353 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-liquid-tank-full rotate: false - xy: 945, 1203 + xy: 871, 892 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-magmarock-full - rotate: false - xy: 1943, 319 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-mass-driver-full rotate: false - xy: 1141, 1203 + xy: 465, 700 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-mechanical-drill-full rotate: false - xy: 1455, 1103 + xy: 725, 302 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-meltdown-full rotate: false - xy: 293, 527 + xy: 335, 780 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -block-metal-floor-damaged-full - rotate: false - xy: 1943, 285 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-full - rotate: false - xy: 1847, 1277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-multiplicative-reconstructor-full rotate: false - xy: 195, 1693 + xy: 1, 261 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 block-naval-factory-full rotate: false - xy: 549, 1198 + xy: 563, 794 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-oil-extractor-full rotate: false - xy: 537, 1100 + xy: 661, 794 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-ore-coal-full - rotate: false - xy: 1785, 1201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-full - rotate: false - xy: 1785, 1167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-full - rotate: false - xy: 1785, 1133 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-full - rotate: false - xy: 597, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-full - rotate: false - xy: 631, 12 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-full - rotate: false - xy: 665, 12 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-parallax-full rotate: false - xy: 1521, 1103 + xy: 791, 302 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-payload-conveyor-full rotate: false - xy: 537, 1002 + xy: 759, 794 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-icon rotate: false - xy: 537, 1002 + xy: 759, 794 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-payload-router-full rotate: false - xy: 537, 904 + xy: 857, 794 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon rotate: false - xy: 537, 904 + xy: 857, 794 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-pebbles-full - rotate: false - xy: 1985, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-phase-weaver-full rotate: false - xy: 1587, 1103 + xy: 651, 236 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -block-plated-conduit-full - rotate: false - xy: 1985, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-pneumatic-drill-full rotate: false - xy: 1653, 1103 + xy: 717, 236 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -block-pulse-conduit-full - rotate: false - xy: 1985, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-full - rotate: false - xy: 1985, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-full - rotate: false - xy: 1981, 523 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-ripple-full rotate: false - xy: 537, 806 + xy: 563, 696 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-rock-full - rotate: false - xy: 1827, 21 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rocks-full - rotate: false - xy: 2015, 523 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-saltrocks-full - rotate: false - xy: 1977, 489 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-salvo-full rotate: false - xy: 1719, 1103 + xy: 783, 236 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -block-sand-boulder-full - rotate: false - xy: 1977, 455 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-full - rotate: false - xy: 2011, 489 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-full - rotate: false - xy: 1977, 421 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-scatter-full rotate: false - xy: 1229, 6 + xy: 651, 170 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -block-scorch-full - rotate: false - xy: 2011, 455 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-full - rotate: false - xy: 1977, 387 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall1 - rotate: false - xy: 1977, 387 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-scrap-wall-huge-full rotate: false - xy: 537, 708 + xy: 661, 696 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge1 rotate: false - xy: 537, 708 + xy: 661, 696 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-scrap-wall-large-full rotate: false - xy: 1281, 415 + xy: 717, 170 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-segment-full rotate: false - xy: 1281, 349 + xy: 783, 170 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -block-shale-boulder-full - rotate: false - xy: 1977, 353 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-full - rotate: false - xy: 2011, 387 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shalerocks-full - rotate: false - xy: 1977, 319 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-full - rotate: false - xy: 2011, 353 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-full - rotate: false - xy: 1977, 285 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-full - rotate: false - xy: 435, 1545 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrocks-full - rotate: false - xy: 2011, 319 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-spectre-full rotate: false - xy: 293, 397 + xy: 335, 650 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -block-spore-cluster-full - rotate: false - xy: 1759, 1235 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-full - rotate: false - xy: 1977, 251 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 block-spore-press-full rotate: false - xy: 1281, 283 + xy: 649, 104 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -block-sporerocks-full +block-steam-generator-full rotate: false - xy: 2011, 285 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-full - rotate: false - xy: 2011, 251 - size: 32, 32 - orig: 32, 32 + xy: 715, 104 + size: 64, 64 + orig: 64, 64 offset: 0, 0 index: -1 block-swarmer-full rotate: false - xy: 1281, 217 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-tendrils-full - rotate: false - xy: 699, 12 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-full - rotate: false - xy: 733, 26 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-0 - rotate: false - xy: 733, 26 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-turbine-generator-full - rotate: false - xy: 1281, 151 + xy: 781, 104 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-water-extractor-full rotate: false - xy: 1249, 85 + xy: 638, 38 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-wave-full rotate: false - xy: 1315, 85 + xy: 704, 38 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 bryde-wreck0 rotate: false - xy: 163, 1141 + xy: 357, 1170 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-wreck1 rotate: false - xy: 163, 999 + xy: 665, 1706 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-wreck2 rotate: false - xy: 163, 857 + xy: 807, 1706 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 core-foundation-team-crux rotate: false - xy: 617, 1757 + xy: 889, 1316 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-foundation-team-sharded rotate: false - xy: 747, 1757 + xy: 889, 1186 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-team-crux rotate: false - xy: 551, 1887 + xy: 1658, 1880 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-nucleus-team-sharded rotate: false - xy: 1, 1175 + xy: 1820, 1880 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-team-crux rotate: false - xy: 635, 843 + xy: 563, 598 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard-team-sharded rotate: false - xy: 635, 745 + xy: 661, 598 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-2-0 rotate: false - xy: 1297, 645 + xy: 847, 104 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-1 rotate: false - xy: 1297, 579 + xy: 836, 38 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-2 rotate: false - xy: 1297, 513 + xy: 1981, 1066 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-3 rotate: false - xy: 1311, 1097 + xy: 1981, 1000 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-4 rotate: false - xy: 1305, 1031 + xy: 1981, 934 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-5 rotate: false - xy: 1305, 965 + xy: 1981, 868 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-6 rotate: false - xy: 1305, 899 + xy: 1981, 802 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-7 rotate: false - xy: 1305, 833 + xy: 923, 279 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-3-0 rotate: false - xy: 745, 1117 + xy: 759, 598 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-1 rotate: false - xy: 843, 1117 + xy: 857, 598 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-2 rotate: false - xy: 733, 1019 + xy: 1897, 1132 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-3 rotate: false - xy: 733, 921 + xy: 1883, 1034 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-4 rotate: false - xy: 831, 1019 + xy: 1883, 936 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-5 rotate: false - xy: 733, 823 + xy: 1883, 838 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-6 rotate: false - xy: 831, 921 + xy: 1883, 740 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-7 rotate: false - xy: 831, 823 + xy: 955, 794 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-4-0 rotate: false - xy: 877, 1757 + xy: 1043, 1608 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-1 rotate: false - xy: 1007, 1757 + xy: 1173, 1608 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-2 rotate: false - xy: 1137, 1757 + xy: 1303, 1608 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-3 rotate: false - xy: 1267, 1757 + xy: 1433, 1588 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-4 rotate: false - xy: 1397, 1757 + xy: 1563, 1588 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-5 rotate: false - xy: 1527, 1757 + xy: 1693, 1588 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-6 rotate: false - xy: 1657, 1757 + xy: 1823, 1588 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-7 rotate: false - xy: 357, 1595 + xy: 1043, 1478 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-5-0 rotate: false - xy: 1, 1013 + xy: 1142, 1738 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-1 rotate: false - xy: 875, 1887 + xy: 1304, 1738 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-2 rotate: false - xy: 1, 851 + xy: 1466, 1718 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-3 rotate: false - xy: 1037, 1887 + xy: 1628, 1718 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-4 rotate: false - xy: 1, 689 + xy: 1790, 1718 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-5 rotate: false - xy: 1199, 1887 + xy: 173, 707 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-6 rotate: false - xy: 1, 527 + xy: 173, 545 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-7 rotate: false - xy: 1361, 1887 + xy: 163, 383 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 +cracks-6-0 + rotate: false + xy: 1, 1645 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-1 + rotate: false + xy: 204, 1848 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-2 + rotate: false + xy: 1, 1451 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-3 + rotate: false + xy: 398, 1848 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-4 + rotate: false + xy: 1, 1257 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 cracks-6-5 rotate: false - xy: 1, 1855 + xy: 592, 1848 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-6 rotate: false - xy: 1, 1661 + xy: 1, 1063 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-7 rotate: false - xy: 195, 1855 + xy: 786, 1848 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 -crawler-wreck0 - rotate: false - xy: 1767, 787 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck1 - rotate: false - xy: 1817, 988 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck2 - rotate: false - xy: 1817, 938 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 cyclone rotate: false - xy: 941, 1105 + xy: 955, 696 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dagger-wreck0 - rotate: false - xy: 1817, 738 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck1 - rotate: false - xy: 1817, 688 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck2 - rotate: false - xy: 1817, 638 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck0 - rotate: false - xy: 1809, 322 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck1 - rotate: false - xy: 1809, 272 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck2 - rotate: false - xy: 1809, 222 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 fortress-wreck0 rotate: false - xy: 435, 1105 + xy: 1577, 1034 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-wreck1 rotate: false - xy: 651, 1333 + xy: 1679, 1132 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-wreck2 rotate: false - xy: 753, 1415 + xy: 1679, 1050 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fuse rotate: false - xy: 1349, 1317 + xy: 1151, 712 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -gamma-wreck0 - rotate: false - xy: 1759, 519 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck1 - rotate: false - xy: 1759, 461 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck2 - rotate: false - xy: 1801, 1479 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 horizon-wreck0 rotate: false - xy: 1175, 72 + xy: 577, 278 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-wreck1 rotate: false - xy: 1223, 555 + xy: 659, 368 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-wreck2 rotate: false - xy: 1219, 481 + xy: 733, 442 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -item-blast-compound-large - rotate: false - xy: 1967, 987 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-blast-compound-xlarge - rotate: false - xy: 1859, 222 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-coal-large - rotate: false - xy: 1867, 679 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-coal-xlarge - rotate: false - xy: 1845, 172 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-copper-large - rotate: false - xy: 1917, 737 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-copper-xlarge - rotate: false - xy: 1845, 122 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-graphite-large - rotate: false - xy: 2001, 1959 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-graphite-xlarge - rotate: false - xy: 1867, 72 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-lead-large - rotate: false - xy: 1967, 945 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-lead-xlarge - rotate: false - xy: 1877, 22 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-metaglass-large - rotate: false - xy: 1867, 637 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-metaglass-xlarge - rotate: false - xy: 1895, 172 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-phase-fabric-large - rotate: false - xy: 2001, 1917 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-phase-fabric-xlarge - rotate: false - xy: 1895, 122 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-plastanium-large - rotate: false - xy: 1967, 903 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-plastanium-xlarge - rotate: false - xy: 1917, 72 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-pyratite-large - rotate: false - xy: 1867, 595 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-pyratite-xlarge - rotate: false - xy: 1927, 22 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-sand-large - rotate: false - xy: 2001, 1875 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-sand-xlarge - rotate: false - xy: 107, 15 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-scrap-large - rotate: false - xy: 1967, 861 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-scrap-xlarge - rotate: false - xy: 157, 15 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-silicon-large - rotate: false - xy: 1867, 553 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-silicon-xlarge - rotate: false - xy: 207, 15 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-spore-pod-large - rotate: false - xy: 2001, 1833 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-spore-pod-xlarge - rotate: false - xy: 1799, 1427 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-surge-alloy-large - rotate: false - xy: 1967, 819 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-surge-alloy-xlarge - rotate: false - xy: 1799, 1377 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-thorium-large - rotate: false - xy: 1867, 511 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-thorium-xlarge - rotate: false - xy: 1849, 1429 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-titanium-large - rotate: false - xy: 1867, 469 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-titanium-xlarge - rotate: false - xy: 1899, 1429 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 lancer rotate: false - xy: 1443, 1037 + xy: 1047, 205 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -liquid-cryofluid-large - rotate: false - xy: 1867, 427 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-cryofluid-xlarge - rotate: false - xy: 1999, 1429 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-oil-large - rotate: false - xy: 1967, 777 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-oil-xlarge - rotate: false - xy: 1899, 1379 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-slag-large - rotate: false - xy: 1959, 735 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-slag-xlarge - rotate: false - xy: 1949, 1379 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-water-large - rotate: false - xy: 1917, 695 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-water-xlarge - rotate: false - xy: 1999, 1379 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 mace-wreck0 rotate: false - xy: 1437, 839 + xy: 1245, 222 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-wreck1 rotate: false - xy: 1503, 905 + xy: 1245, 156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-wreck2 rotate: false - xy: 1569, 971 + xy: 1177, 90 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver rotate: false - xy: 929, 713 + xy: 1347, 398 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mega-wreck0 rotate: false - xy: 435, 799 + xy: 1679, 948 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-wreck1 rotate: false - xy: 435, 697 + xy: 1577, 932 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-wreck2 rotate: false - xy: 753, 1313 + xy: 1781, 908 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 meltdown rotate: false - xy: 1527, 1627 + xy: 1149, 1348 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 minke-wreck0 rotate: false - xy: 1787, 1537 - size: 128, 128 - orig: 128, 128 + xy: 1923, 112 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 minke-wreck1 rotate: false - xy: 1917, 1537 - size: 128, 128 - orig: 128, 128 + xy: 487, 413 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 minke-wreck2 rotate: false - xy: 487, 1497 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -mono-wreck0 - rotate: false - xy: 1999, 1329 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck1 - rotate: false - xy: 1899, 1279 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck2 - rotate: false - xy: 1949, 1279 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-wreck0 - rotate: false - xy: 1975, 1479 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck1 - rotate: false - xy: 1381, 104 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck2 - rotate: false - xy: 1439, 121 - size: 56, 56 - orig: 56, 56 + xy: 487, 310 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 parallax rotate: false - xy: 1701, 905 + xy: 1367, 332 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -poly-wreck0 - rotate: false - xy: 1613, 121 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck1 - rotate: false - xy: 1671, 121 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck2 - rotate: false - xy: 1729, 121 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar-wreck0 - rotate: false - xy: 1347, 162 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck1 - rotate: false - xy: 1723, 1527 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck2 - rotate: false - xy: 1235, 1107 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 quasar-wreck0 rotate: false - xy: 1223, 1023 + xy: 979, 516 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-wreck1 rotate: false - xy: 1223, 941 + xy: 1061, 516 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-wreck2 rotate: false - xy: 1223, 859 + xy: 577, 434 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 ripple rotate: false - xy: 717, 333 + xy: 1739, 610 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 risso-wreck0 rotate: false - xy: 815, 235 - size: 96, 96 - orig: 96, 96 + xy: 1169, 436 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 risso-wreck1 rotate: false - xy: 925, 517 - size: 96, 96 - orig: 96, 96 + xy: 1025, 337 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 risso-wreck2 rotate: false - xy: 1023, 517 - size: 96, 96 - orig: 96, 96 + xy: 1097, 356 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 salvo rotate: false - xy: 1561, 575 + xy: 1575, 146 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scatter rotate: false - xy: 1627, 575 + xy: 1707, 107 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +scepter-wreck0 + rotate: false + xy: 1, 727 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck1 + rotate: false + xy: 1152, 1900 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck2 + rotate: false + xy: 1, 585 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 segment rotate: false - xy: 1429, 443 + xy: 1496, 2 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spectre rotate: false - xy: 747, 1497 + xy: 1799, 1328 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spiroct-wreck0 rotate: false - xy: 1007, 146 + xy: 1837, 271 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-wreck1 rotate: false - xy: 1103, 146 + xy: 1935, 292 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-wreck2 rotate: false - xy: 619, 80 + xy: 1933, 215 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 -swarmer +toxopid-wreck0 rotate: false - xy: 1479, 245 - size: 64, 64 - orig: 64, 64 + xy: 195, 1647 + size: 160, 190 + orig: 160, 190 offset: 0, 0 index: -1 -unit-alpha-full +toxopid-wreck1 rotate: false - xy: 1867, 921 - size: 48, 48 - orig: 48, 48 + xy: 195, 1455 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck2 + rotate: false + xy: 195, 1263 + size: 160, 190 + orig: 160, 190 offset: 0, 0 index: -1 unit-arkyid-full rotate: false - xy: 1007, 1497 + xy: 1539, 1198 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 unit-atrax-full rotate: false - xy: 991, 14 + xy: 487, 244 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 -unit-beta-full - rotate: false - xy: 1917, 979 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 unit-bryde-full rotate: false - xy: 163, 715 + xy: 511, 1580 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 -unit-crawler-full - rotate: false - xy: 1867, 871 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-full - rotate: false - xy: 1917, 929 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-flare-full - rotate: false - xy: 1867, 821 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 unit-fortress-full rotate: false - xy: 855, 1415 + xy: 1679, 866 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 -unit-gamma-full - rotate: false - xy: 1439, 63 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 unit-horizon-full rotate: false - xy: 1207, 185 + xy: 807, 368 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -unit-mace-full - rotate: false - xy: 1545, 179 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 unit-mega-full rotate: false - xy: 855, 1313 + xy: 1781, 806 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 unit-minke-full rotate: false - xy: 1137, 1497 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-mono-full - rotate: false - xy: 1917, 879 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-full - rotate: false - xy: 1497, 63 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-poly-full - rotate: false - xy: 1555, 63 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-pulsar-full - rotate: false - xy: 1741, 1477 - size: 58, 48 - orig: 58, 48 + xy: 487, 141 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 unit-quasar-full rotate: false - xy: 1223, 777 + xy: 577, 352 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 unit-risso-full rotate: false - xy: 1109, 223 - size: 96, 96 - orig: 96, 96 + xy: 577, 124 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +unit-scepter-full + rotate: false + xy: 1324, 1900 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 unit-spiroct-full rotate: false - xy: 715, 60 + xy: 1737, 239 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 +unit-toxopid-full + rotate: false + xy: 195, 1071 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 unit-zenith-full rotate: false - xy: 1267, 1513 + xy: 1669, 1214 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 -wave - rotate: false - xy: 1743, 245 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 zenith-wreck0 rotate: false - xy: 1609, 1513 + xy: 1133, 1104 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-wreck1 rotate: false - xy: 435, 1383 + xy: 1247, 1104 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-wreck2 rotate: false - xy: 435, 1269 + xy: 1361, 1084 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 -shape-3 - rotate: false - xy: 1773, 1038 - size: 63, 63 - orig: 63, 63 - offset: 0, 0 - index: -1 -alpha - rotate: false - xy: 1667, 71 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-cell - rotate: false - xy: 1717, 71 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 arkyid rotate: false - xy: 163, 585 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -chaos-array - rotate: false - xy: 163, 585 + xy: 499, 1450 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 arkyid-cell rotate: false - xy: 815, 92 - size: 88, 64 - orig: 88, 64 + xy: 499, 1320 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 arkyid-foot rotate: false - xy: 1239, 1229 + xy: 881, 444 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-joint-base rotate: false - xy: 1239, 1157 + xy: 881, 372 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 -arkyid-leg - rotate: false - xy: 1741, 1419 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 arkyid-leg-base rotate: false - xy: 1, 11 + xy: 195, 879 size: 104, 64 orig: 104, 64 offset: 0, 0 index: -1 atrax rotate: false - xy: 905, 80 + xy: 1952, 1722 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-base rotate: false - xy: 1455, 1169 + xy: 1982, 1976 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 atrax-cell rotate: false - xy: 995, 80 + xy: 1953, 1656 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 -atrax-foot - rotate: false - xy: 513, 1 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -atrax-leg - rotate: false - xy: 349, 1567 - size: 36, 26 - orig: 36, 26 - offset: 0, 0 - index: -1 -atrax-leg-base - rotate: false - xy: 387, 1567 - size: 36, 26 - orig: 36, 26 - offset: 0, 0 - index: -1 -beta - rotate: false - xy: 1627, 17 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-cell - rotate: false - xy: 1677, 21 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 bryde rotate: false - xy: 163, 1425 + xy: 357, 1454 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-cell rotate: false - xy: 163, 1283 + xy: 357, 1312 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 -chaos-array-base - rotate: false - xy: 293, 267 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -chaos-array-cell - rotate: false - xy: 293, 137 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -chaos-array-leg - rotate: false - xy: 285, 7 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -crawler - rotate: false - xy: 1767, 987 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-base - rotate: false - xy: 1767, 937 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-cell - rotate: false - xy: 1767, 887 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-leg - rotate: false - xy: 1767, 837 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger - rotate: false - xy: 1817, 888 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-base - rotate: false - xy: 1817, 838 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-leg - rotate: false - xy: 1817, 788 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -eradicator - rotate: false - xy: 1, 77 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -eradicator-base - rotate: false - xy: 1847, 1923 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -eradicator-cell - rotate: false - xy: 1847, 1797 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -eradicator-leg - rotate: false - xy: 195, 1567 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -flare - rotate: false - xy: 1809, 372 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 fortress rotate: false - xy: 435, 1187 + xy: 335, 568 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 1347, 410 + xy: 1045, 73 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-cell rotate: false - xy: 651, 1415 + xy: 1577, 1116 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 1081, 18 + xy: 569, 536 size: 80, 60 orig: 80, 60 offset: 0, 0 index: -1 -gamma - rotate: false - xy: 1741, 1361 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-cell - rotate: false - xy: 1759, 577 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 horizon rotate: false - xy: 1223, 703 + xy: 1271, 912 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-cell rotate: false - xy: 1223, 629 + xy: 659, 442 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 mace rotate: false - xy: 1707, 1037 + xy: 1113, 158 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-base rotate: false - xy: 1437, 971 + xy: 1166, 7 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-cell rotate: false - xy: 1437, 905 + xy: 1179, 222 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-leg rotate: false - xy: 1503, 971 + xy: 1179, 156 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mega rotate: false - xy: 435, 1003 + xy: 1781, 1112 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-cell rotate: false - xy: 435, 901 + xy: 1781, 1010 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 minke rotate: false - xy: 1787, 1667 - size: 128, 128 - orig: 128, 128 + xy: 1833, 168 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 minke-cell rotate: false - xy: 1917, 1667 + xy: 1279, 1348 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -mono - rotate: false - xy: 1899, 1329 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-cell - rotate: false - xy: 1949, 1329 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova - rotate: false - xy: 1859, 1479 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-base - rotate: false - xy: 1909, 1229 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-cell - rotate: false - xy: 1917, 1479 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-leg - rotate: false - xy: 1959, 1229 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -poly - rotate: false - xy: 1497, 121 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-cell - rotate: false - xy: 1555, 121 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -power-cell - rotate: false - xy: 1787, 121 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar - rotate: false - xy: 1787, 1837 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-base - rotate: false - xy: 1909, 1179 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pulsar-cell - rotate: false - xy: 1723, 1577 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 pulsar-leg rotate: false - xy: 1561, 707 + xy: 1509, 278 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 quasar rotate: false - xy: 1431, 1235 + xy: 651, 516 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-base rotate: false - xy: 1513, 1235 + xy: 733, 516 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-cell rotate: false - xy: 1595, 1235 + xy: 815, 516 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-leg rotate: false - xy: 1677, 1235 + xy: 897, 516 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 +reign-base + rotate: false + xy: 195, 945 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +reign-cell + rotate: false + xy: 357, 1722 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +reign-leg + rotate: false + xy: 511, 1722 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 risso rotate: false - xy: 717, 235 - size: 96, 96 - orig: 96, 96 + xy: 1097, 436 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 risso-cell rotate: false - xy: 815, 333 + xy: 1837, 642 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +scepter + rotate: false + xy: 980, 1900 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-base + rotate: false + xy: 1279, 1218 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scepter-cell + rotate: false + xy: 1409, 1328 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scepter-leg + rotate: false + xy: 1539, 1328 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 spiroct rotate: false - xy: 815, 158 + xy: 1935, 369 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-cell rotate: false - xy: 911, 146 + xy: 1641, 299 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 -spiroct-foot +toxopid rotate: false - xy: 2001, 2001 - size: 46, 46 - orig: 46, 46 + xy: 325, 29 + size: 160, 190 + orig: 160, 190 offset: 0, 0 index: -1 -spiroct-leg +toxopid-cell rotate: false - xy: 1787, 1801 - size: 48, 34 - orig: 48, 34 + xy: 357, 1596 + size: 152, 124 + orig: 152, 124 offset: 0, 0 index: -1 -spiroct-leg-base +toxopid-foot rotate: false - xy: 435, 1509 - size: 48, 34 - orig: 48, 34 + xy: 1952, 1788 + size: 90, 90 + orig: 90, 90 offset: 0, 0 index: -1 -vanguard +toxopid-joint-base rotate: false - xy: 1867, 771 - size: 48, 48 - orig: 48, 48 + xy: 1169, 364 + size: 70, 70 + orig: 70, 70 offset: 0, 0 index: -1 -vanguard-cell +toxopid-leg rotate: false - xy: 1917, 829 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -antumbra-missiles - rotate: false - xy: 1527, 13 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -artillery - rotate: false - xy: 1577, 5 - size: 48, 56 - orig: 48, 56 + xy: 1, 25 + size: 150, 72 + orig: 150, 72 offset: 0, 0 index: -1 artillery-mount rotate: false - xy: 1311, 1163 + xy: 953, 444 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 beam-weapon rotate: false - xy: 1349, 1235 + xy: 487, 516 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 -chaos - rotate: false - xy: 1759, 635 - size: 56, 136 - orig: 56, 136 - offset: 0, 0 - index: -1 -eradication - rotate: false - xy: 1251, 1303 - size: 96, 192 - orig: 96, 192 - offset: 0, 0 - index: -1 -eruption - rotate: false - xy: 1817, 530 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flakgun - rotate: false - xy: 1817, 480 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flamethrower - rotate: false - xy: 1817, 422 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -heal-shotgun-weapon - rotate: false - xy: 1859, 372 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon - rotate: false - xy: 1859, 322 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-mount - rotate: false - xy: 1859, 272 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -large-artillery - rotate: false - xy: 1849, 1361 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 large-bullet-mount rotate: false - xy: 1383, 1136 + xy: 953, 345 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-laser-mount rotate: false - xy: 521, 405 + xy: 1249, 616 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 -large-weapon +large-purple-mount rotate: false - xy: 1949, 1429 - size: 48, 48 - orig: 48, 48 + xy: 1025, 417 + size: 70, 97 + orig: 70, 97 offset: 0, 0 index: -1 -missiles +reign-weapon rotate: false - xy: 1799, 1327 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -missiles-mount - rotate: false - xy: 1849, 1311 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-purple-weapon - rotate: false - xy: 1999, 1279 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon - rotate: false - xy: 1759, 1277 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-basic-weapon - rotate: false - xy: 1959, 1129 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon - rotate: false - xy: 1909, 1079 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-weapon - rotate: false - xy: 1959, 1079 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spiroct-weapon - rotate: false - xy: 1867, 971 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -weapon - rotate: false - xy: 1867, 721 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -zenith-missiles - rotate: false - xy: 1917, 779 - size: 48, 48 - orig: 48, 48 + xy: 487, 1 + size: 83, 138 + orig: 83, 138 offset: 0, 0 index: -1 zenith rotate: false - xy: 1381, 1513 + xy: 1783, 1214 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-cell rotate: false - xy: 1495, 1513 + xy: 1019, 1104 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 sprites3.png -size: 1024,256 +size: 2048,512 format: rgba8888 filter: nearest,nearest repeat: none mender rotate: false - xy: 477, 223 + xy: 1739, 204 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender-top rotate: false - xy: 307, 19 + xy: 1739, 170 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 715, 223 + xy: 1841, 106 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-arrow + rotate: false + xy: 1895, 276 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor + rotate: false + xy: 411, 134 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-bridge + rotate: false + xy: 411, 100 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-end + rotate: false + xy: 1827, 242 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +center + rotate: false + xy: 1861, 242 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-0 + rotate: false + xy: 305, 48 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-armored-conveyor-full + rotate: false + xy: 305, 48 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-1 + rotate: false + xy: 292, 14 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-2 + rotate: false + xy: 377, 122 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-3 + rotate: false + xy: 326, 14 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-0 + rotate: false + xy: 1691, 370 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-1 + rotate: false + xy: 1691, 336 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-2 + rotate: false + xy: 1725, 374 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-3 + rotate: false + xy: 1759, 374 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-0 + rotate: false + xy: 1725, 340 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-1 + rotate: false + xy: 1759, 340 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-2 + rotate: false + xy: 1691, 302 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-3 + rotate: false + xy: 1725, 306 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-0 + rotate: false + xy: 1759, 306 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-1 + rotate: false + xy: 375, 202 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-2 + rotate: false + xy: 515, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-3 + rotate: false + xy: 549, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-0 + rotate: false + xy: 583, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-1 + rotate: false + xy: 617, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-2 + rotate: false + xy: 651, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-3 + rotate: false + xy: 685, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-1 + rotate: false + xy: 1245, 286 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-2 + rotate: false + xy: 1279, 286 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-3 + rotate: false + xy: 1313, 286 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-0 + rotate: false + xy: 1347, 286 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-1 + rotate: false + xy: 1059, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-2 + rotate: false + xy: 1059, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-3 + rotate: false + xy: 1059, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-0 + rotate: false + xy: 1093, 244 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-1 + rotate: false + xy: 1093, 210 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-2 + rotate: false + xy: 1093, 176 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-3 + rotate: false + xy: 1127, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 1, 223 + xy: 1161, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 1, 189 + xy: 1127, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 35, 223 + xy: 1195, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 1, 155 + xy: 1127, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 35, 189 + xy: 1161, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 69, 223 + xy: 1229, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1, 121 + xy: 1161, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 35, 155 + xy: 1195, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor rotate: false - xy: 545, 223 + xy: 1875, 174 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-0 rotate: false - xy: 375, 19 + xy: 1875, 140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-1 rotate: false - xy: 409, 53 + xy: 1909, 200 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-2 rotate: false - xy: 443, 87 + xy: 1909, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-edge rotate: false - xy: 477, 121 + xy: 1943, 200 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-stack rotate: false - xy: 511, 155 + xy: 1943, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 783, 189 + xy: 445, 212 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 817, 223 + xy: 427, 178 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 647, 19 + xy: 461, 178 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 681, 53 + xy: 495, 178 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 715, 87 + xy: 529, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 749, 121 + xy: 563, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 783, 155 + xy: 597, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 817, 189 + xy: 631, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 851, 223 + xy: 665, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 681, 19 + xy: 699, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 715, 53 + xy: 733, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 749, 87 + xy: 767, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 783, 121 + xy: 801, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 817, 155 + xy: 835, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 851, 189 + xy: 869, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 885, 223 + xy: 479, 144 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 715, 19 + xy: 479, 110 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 749, 53 + xy: 513, 144 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 783, 87 + xy: 513, 110 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cross rotate: false - xy: 69, 121 + xy: 1297, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter rotate: false - xy: 205, 223 + xy: 1297, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 375, 223 + xy: 1603, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 409, 121 + xy: 1705, 136 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 375, 53 + xy: 1807, 174 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 409, 87 + xy: 1875, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 443, 121 + xy: 1807, 140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 477, 155 + xy: 1841, 174 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 545, 87 + xy: 1467, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 579, 53 + xy: 1909, 98 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 underflow-gate rotate: false - xy: 885, 189 + xy: 547, 118 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +water-extractor + rotate: false + xy: 1, 116 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-liquid + rotate: false + xy: 67, 182 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-rotator + rotate: false + xy: 133, 248 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-top + rotate: false + xy: 199, 314 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-border + rotate: false + xy: 889, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-middle + rotate: false + xy: 1827, 310 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-select + rotate: false + xy: 373, 54 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-liquid + rotate: false + xy: 1041, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit + rotate: false + xy: 1929, 268 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-arrow + rotate: false + xy: 1963, 268 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-arrow + rotate: false + xy: 1963, 268 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-bridge + rotate: false + xy: 1997, 268 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-end + rotate: false + xy: 409, 226 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom + rotate: false + xy: 1963, 234 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-0 + rotate: false + xy: 1997, 234 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-1 + rotate: false + xy: 1015, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-2 + rotate: false + xy: 1049, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-3 + rotate: false + xy: 1049, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-4 + rotate: false + xy: 1049, 312 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-0 + rotate: false + xy: 1075, 278 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-1 + rotate: false + xy: 1109, 286 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-2 + rotate: false + xy: 1143, 286 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-3 + rotate: false + xy: 1177, 286 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-3 + rotate: false + xy: 1177, 286 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-4 + rotate: false + xy: 1211, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 273, 87 + xy: 1569, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate rotate: false - xy: 375, 189 + xy: 1569, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate-top rotate: false - xy: 409, 223 + xy: 1603, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 239, 19 + xy: 1637, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 273, 53 + xy: 1603, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 307, 87 + xy: 1637, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 341, 87 + xy: 1739, 238 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump-liquid rotate: false - xy: 375, 121 + xy: 1705, 204 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-liquid rotate: false - xy: 375, 121 + xy: 1705, 204 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-pump-liquid rotate: false - xy: 375, 121 + xy: 1705, 204 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 443, 155 + xy: 1739, 136 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 477, 189 + xy: 1773, 136 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 511, 223 + xy: 1807, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 341, 19 + xy: 1841, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-cap rotate: false - xy: 579, 223 + xy: 1977, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-0 rotate: false - xy: 409, 19 + xy: 1909, 132 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-1 rotate: false - xy: 443, 53 + xy: 1943, 132 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-2 rotate: false - xy: 477, 87 + xy: 1977, 132 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-3 rotate: false - xy: 511, 121 + xy: 2011, 200 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-4 rotate: false - xy: 545, 155 + xy: 2011, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 477, 53 + xy: 1195, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 511, 87 + xy: 1229, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 545, 121 + xy: 1263, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 579, 155 + xy: 1297, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 memory-cell rotate: false - xy: 443, 189 + xy: 1705, 170 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 341, 53 + xy: 1773, 204 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor rotate: false - xy: 375, 87 + xy: 1773, 170 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch rotate: false - xy: 681, 87 + xy: 475, 58 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch-on rotate: false - xy: 715, 121 + xy: 496, 24 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +battery + rotate: false + xy: 719, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +battery-top + rotate: false + xy: 753, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +combustion-generator + rotate: false + xy: 1895, 242 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +combustion-generator-top + rotate: false + xy: 1929, 234 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 diode rotate: false - xy: 103, 155 + xy: 1331, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 diode-arrow rotate: false - xy: 137, 189 + xy: 1331, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator rotate: false - xy: 103, 121 + xy: 1195, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-top rotate: false - xy: 137, 155 + xy: 1229, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node rotate: false - xy: 579, 189 + xy: 2011, 132 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-source rotate: false - xy: 613, 223 + xy: 1127, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 443, 19 + xy: 1161, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 579, 121 + xy: 1501, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 545, 19 + xy: 1875, 106 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +steam-generator + rotate: false + xy: 1, 314 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-cap + rotate: false + xy: 67, 380 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-top + rotate: false + xy: 133, 446 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine0 + rotate: false + xy: 1, 248 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine1 + rotate: false + xy: 67, 314 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +surge-tower + rotate: false + xy: 133, 380 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thermal-generator + rotate: false + xy: 67, 248 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 incinerator rotate: false - xy: 171, 189 + xy: 1263, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 239, 121 + xy: 1535, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 341, 189 + xy: 1569, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 409, 189 + xy: 1671, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-void rotate: false - xy: 443, 223 + xy: 1671, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 409, 155 + xy: 1773, 238 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 613, 189 + xy: 1331, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 647, 223 + xy: 1365, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +spore-press-frame2 + rotate: false + xy: 1, 446 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-liquid + rotate: false + xy: 1, 380 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-top + rotate: false + xy: 67, 446 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +boulder1 + rotate: false + xy: 1901, 412 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +boulder2 + rotate: false + xy: 67, 82 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder1 + rotate: false + xy: 497, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder2 + rotate: false + xy: 547, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 sand-boulder1 rotate: false - xy: 613, 155 + xy: 1535, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-boulder2 rotate: false - xy: 647, 189 + xy: 1569, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder1 rotate: false - xy: 647, 155 + xy: 1773, 102 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder2 rotate: false - xy: 681, 189 + xy: 1807, 106 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +snow-boulder1 + rotate: false + xy: 815, 304 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +snow-boulder2 + rotate: false + xy: 865, 304 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spore-cluster1 + rotate: false + xy: 333, 194 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +spore-cluster2 + rotate: false + xy: 233, 154 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +spore-cluster3 + rotate: false + xy: 275, 154 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 unloader rotate: false - xy: 919, 223 + xy: 615, 152 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-center rotate: false - xy: 749, 19 + xy: 581, 118 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +arc-heat + rotate: false + xy: 343, 122 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-1 + rotate: false + xy: 787, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hail-heat + rotate: false + xy: 965, 254 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 scorch-heat rotate: false - xy: 511, 19 + xy: 1637, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +wave-liquid + rotate: false + xy: 331, 446 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 repair-point-base rotate: false - xy: 511, 53 + xy: 1433, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 69, 189 + xy: 1263, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door rotate: false - xy: 171, 223 + xy: 1059, 142 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-open rotate: false - xy: 1, 19 + xy: 1093, 142 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 511, 189 + xy: 1841, 140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall rotate: false - xy: 545, 189 + xy: 1977, 200 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall2 rotate: false - xy: 545, 53 + xy: 1671, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 579, 87 + xy: 1705, 102 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 613, 121 + xy: 1739, 102 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 613, 121 + xy: 1739, 102 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 647, 53 + xy: 462, 24 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +surge-wall-large + rotate: false + xy: 199, 446 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 thorium-wall rotate: false - xy: 749, 155 + xy: 479, 212 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +thorium-wall-large + rotate: false + xy: 133, 314 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 titanium-wall rotate: false - xy: 817, 121 + xy: 547, 152 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +titanium-wall-large + rotate: false + xy: 199, 380 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +bullet + rotate: false + xy: 1675, 458 + size: 52, 52 + orig: 52, 52 + offset: 0, 0 + index: -1 +bullet-back + rotate: false + xy: 1729, 458 + size: 52, 52 + orig: 52, 52 + offset: 0, 0 + index: -1 casing rotate: false - xy: 361, 1 + xy: 249, 246 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 circle-mid rotate: false - xy: 997, 30 + xy: 2045, 43 size: 1, 199 orig: 1, 199 offset: 0, 0 index: -1 +error + rotate: false + xy: 897, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 laser rotate: false - xy: 809, 9 + xy: 127, 132 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser rotate: false - xy: 815, 19 + xy: 193, 198 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 +missile + rotate: false + xy: 267, 60 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +missile-back + rotate: false + xy: 317, 156 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 parallax-laser rotate: false - xy: 821, 19 + xy: 325, 330 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 +particle + rotate: false + xy: 291, 196 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 scale_marker rotate: false - xy: 811, 81 + xy: 391, 440 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 +shell + rotate: false + xy: 355, 156 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +shell-back + rotate: false + xy: 305, 116 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 transfer rotate: false - xy: 827, 19 + xy: 981, 346 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 851, 155 + xy: 581, 152 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white rotate: false - xy: 1005, 252 + xy: 447, 457 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 +alpha-wreck0 + rotate: false + xy: 1833, 462 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-wreck1 + rotate: false + xy: 1883, 462 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-wreck2 + rotate: false + xy: 1933, 462 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +arc + rotate: false + xy: 305, 82 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +beta-wreck0 + rotate: false + xy: 1601, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +beta-wreck1 + rotate: false + xy: 1651, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +beta-wreck2 + rotate: false + xy: 1701, 408 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-arc-full + rotate: false + xy: 821, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-basalt-full + rotate: false + xy: 855, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-boulder-full + rotate: false + xy: 1751, 408 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-char-full + rotate: false + xy: 923, 226 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conduit-full + rotate: false + xy: 957, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conveyor-full + rotate: false + xy: 991, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-0 + rotate: false + xy: 991, 220 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-craters-full + rotate: false + xy: 923, 192 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-boulder-full + rotate: false + xy: 1801, 412 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dacite-full + rotate: false + xy: 957, 186 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-wall-full + rotate: false + xy: 991, 186 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-metal-full + rotate: false + xy: 1097, 320 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-full + rotate: false + xy: 1131, 320 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-full + rotate: false + xy: 1165, 320 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-full + rotate: false + xy: 1199, 320 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dune-wall-full + rotate: false + xy: 1233, 320 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-duo-full + rotate: false + xy: 1267, 320 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-grass-full + rotate: false + xy: 1301, 320 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hail-full + rotate: false + xy: 1335, 320 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hotrock-full + rotate: false + xy: 1793, 374 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-full + rotate: false + xy: 1793, 340 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-full + rotate: false + xy: 1793, 306 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-wall-full + rotate: false + xy: 1827, 378 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-router-full + rotate: false + xy: 1861, 378 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-magmarock-full + rotate: false + xy: 1827, 344 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-full + rotate: false + xy: 1895, 378 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-moss-full + rotate: false + xy: 1861, 344 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-coal-full + rotate: false + xy: 1861, 310 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-copper-full + rotate: false + xy: 1895, 344 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-lead-full + rotate: false + xy: 1895, 310 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-scrap-full + rotate: false + xy: 1929, 370 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-thorium-full + rotate: false + xy: 1929, 336 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-titanium-full + rotate: false + xy: 1963, 370 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pebbles-full + rotate: false + xy: 1963, 336 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plated-conduit-full + rotate: false + xy: 1929, 302 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulse-conduit-full + rotate: false + xy: 1963, 302 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-full + rotate: false + xy: 1007, 262 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-repair-point-full + rotate: false + xy: 393, 168 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-wall-full + rotate: false + xy: 1025, 228 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-boulder-full + rotate: false + xy: 1025, 194 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-full + rotate: false + xy: 1025, 160 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-wall-full + rotate: false + xy: 343, 88 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scorch-full + rotate: false + xy: 377, 88 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-full + rotate: false + xy: 339, 54 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall1 + rotate: false + xy: 339, 54 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-boulder-full + rotate: false + xy: 360, 20 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-full + rotate: false + xy: 394, 20 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-wall-full + rotate: false + xy: 407, 54 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-full + rotate: false + xy: 428, 20 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-boulder-full + rotate: false + xy: 1851, 412 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-full + rotate: false + xy: 1997, 370 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-wall-full + rotate: false + xy: 1997, 336 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-cluster-full + rotate: false + xy: 1397, 370 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-full + rotate: false + xy: 1997, 302 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-wall-full + rotate: false + xy: 1725, 272 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-full + rotate: false + xy: 1759, 272 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-full + rotate: false + xy: 1793, 272 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tendrils-full + rotate: false + xy: 1827, 276 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-conveyor-full + rotate: false + xy: 1861, 276 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-0 + rotate: false + xy: 1861, 276 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 cracks-1-0 rotate: false - xy: 103, 223 + xy: 1195, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-1 rotate: false - xy: 1, 87 + xy: 1229, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-2 rotate: false - xy: 35, 121 + xy: 1297, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-3 rotate: false - xy: 69, 155 + xy: 1229, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-4 rotate: false - xy: 103, 189 + xy: 1263, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-5 rotate: false - xy: 137, 223 + xy: 1331, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-6 rotate: false - xy: 1, 53 + xy: 1263, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-7 rotate: false - xy: 35, 87 + xy: 1297, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +crawler-wreck0 + rotate: false + xy: 331, 346 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck1 + rotate: false + xy: 397, 412 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck2 + rotate: false + xy: 447, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck0 + rotate: false + xy: 747, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck1 + rotate: false + xy: 797, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck2 + rotate: false + xy: 847, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 duo rotate: false - xy: 35, 53 + xy: 1127, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +flare-wreck0 + rotate: false + xy: 1147, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck1 + rotate: false + xy: 1197, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck2 + rotate: false + xy: 1247, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +gamma-wreck0 + rotate: false + xy: 631, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +gamma-wreck1 + rotate: false + xy: 689, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +gamma-wreck2 + rotate: false + xy: 747, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 hail rotate: false - xy: 69, 87 + xy: 1161, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +item-blast-compound-large + rotate: false + xy: 1439, 366 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-blast-compound-medium rotate: false - xy: 69, 53 + xy: 1365, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 817, 95 + xy: 649, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-blast-compound-tiny rotate: false - xy: 1, 1 + xy: 479, 92 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-blast-compound-xlarge + rotate: false + xy: 1047, 346 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-coal-large + rotate: false + xy: 1397, 328 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-coal-medium rotate: false - xy: 137, 121 + xy: 1365, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-small rotate: false - xy: 851, 129 + xy: 615, 126 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-coal-tiny rotate: false - xy: 19, 1 + xy: 2031, 388 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-coal-xlarge + rotate: false + xy: 1097, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-copper-large + rotate: false + xy: 1439, 324 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-copper-medium rotate: false - xy: 205, 189 + xy: 1381, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-small rotate: false - xy: 885, 163 + xy: 675, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-copper-tiny rotate: false - xy: 37, 1 + xy: 2031, 370 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-copper-xlarge + rotate: false + xy: 1147, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-graphite-large + rotate: false + xy: 1481, 362 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-graphite-medium rotate: false - xy: 69, 19 + xy: 1399, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-small rotate: false - xy: 919, 197 + xy: 701, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-graphite-tiny rotate: false - xy: 55, 1 + xy: 2031, 352 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-graphite-xlarge + rotate: false + xy: 1197, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-lead-large + rotate: false + xy: 1523, 362 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-lead-medium rotate: false - xy: 137, 87 + xy: 1399, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-small rotate: false - xy: 953, 231 + xy: 727, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-lead-tiny rotate: false - xy: 73, 1 + xy: 2031, 334 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-lead-xlarge + rotate: false + xy: 1247, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-metaglass-large + rotate: false + xy: 1565, 362 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-metaglass-medium rotate: false - xy: 205, 155 + xy: 1433, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-small rotate: false - xy: 783, 33 + xy: 753, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-metaglass-tiny rotate: false - xy: 91, 1 + xy: 2031, 316 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-metaglass-xlarge + rotate: false + xy: 1297, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-phase-fabric-large + rotate: false + xy: 1607, 362 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-phase-fabric-medium rotate: false - xy: 273, 223 + xy: 1433, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-small rotate: false - xy: 979, 231 + xy: 779, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-phase-fabric-tiny rotate: false - xy: 109, 1 + xy: 2031, 298 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-phase-fabric-xlarge + rotate: false + xy: 1347, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-plastanium-large + rotate: false + xy: 1649, 362 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-plastanium-medium rotate: false - xy: 137, 53 + xy: 1449, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-small rotate: false - xy: 783, 7 + xy: 805, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-plastanium-tiny rotate: false - xy: 127, 1 + xy: 2031, 280 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-plastanium-xlarge + rotate: false + xy: 1951, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-pyratite-large + rotate: false + xy: 1481, 320 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-pyratite-medium rotate: false - xy: 205, 121 + xy: 1467, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-small rotate: false - xy: 817, 69 + xy: 831, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-pyratite-tiny rotate: false - xy: 145, 1 + xy: 2031, 262 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-pyratite-xlarge + rotate: false + xy: 117, 82 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-sand-large + rotate: false + xy: 1523, 320 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-sand-medium rotate: false - xy: 273, 189 + xy: 1467, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-small rotate: false - xy: 843, 95 + xy: 857, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-sand-tiny rotate: false - xy: 163, 1 + xy: 2031, 244 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-sand-xlarge + rotate: false + xy: 116, 32 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-scrap-large + rotate: false + xy: 1565, 320 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-scrap-medium rotate: false - xy: 137, 19 + xy: 1551, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-small rotate: false - xy: 843, 69 + xy: 883, 160 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-scrap-tiny rotate: false - xy: 181, 1 + xy: 445, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-scrap-xlarge + rotate: false + xy: 183, 148 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-silicon-large + rotate: false + xy: 1607, 320 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-silicon-medium rotate: false - xy: 205, 87 + xy: 1501, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-small rotate: false - xy: 877, 129 + xy: 51, 6 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-silicon-tiny rotate: false - xy: 199, 1 + xy: 409, 208 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-silicon-xlarge + rotate: false + xy: 167, 98 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-spore-pod-large + rotate: false + xy: 1649, 320 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-spore-pod-medium rotate: false - xy: 307, 189 + xy: 1467, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-small rotate: false - xy: 869, 103 + xy: 77, 6 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-spore-pod-tiny rotate: false - xy: 217, 1 + xy: 385, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-spore-pod-xlarge + rotate: false + xy: 167, 48 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-surge-alloy-large + rotate: false + xy: 166, 6 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-surge-alloy-medium rotate: false - xy: 171, 19 + xy: 1535, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 869, 77 + xy: 103, 6 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-surge-alloy-tiny rotate: false - xy: 235, 1 + xy: 1807, 254 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-surge-alloy-xlarge + rotate: false + xy: 217, 98 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-thorium-large + rotate: false + xy: 208, 6 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-thorium-medium rotate: false - xy: 239, 87 + xy: 1619, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 911, 163 + xy: 129, 6 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-thorium-tiny rotate: false - xy: 253, 1 + xy: 903, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-thorium-xlarge + rotate: false + xy: 217, 48 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-titanium-large + rotate: false + xy: 250, 6 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-titanium-medium rotate: false - xy: 307, 155 + xy: 1535, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 903, 137 + xy: 509, 84 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-titanium-tiny rotate: false - xy: 271, 1 + xy: 385, 242 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-titanium-xlarge + rotate: false + xy: 315, 280 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-cryofluid-large + rotate: false + xy: 259, 238 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 liquid-cryofluid-medium rotate: false - xy: 239, 53 + xy: 1535, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-small rotate: false - xy: 945, 197 + xy: 509, 58 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-cryofluid-tiny rotate: false - xy: 289, 1 + xy: 561, 100 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +liquid-cryofluid-xlarge + rotate: false + xy: 431, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-oil-large + rotate: false + xy: 301, 238 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 liquid-oil-medium rotate: false - xy: 341, 155 + xy: 1637, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-small rotate: false - xy: 937, 171 + xy: 535, 84 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-oil-tiny rotate: false - xy: 307, 1 + xy: 579, 100 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +liquid-oil-xlarge + rotate: false + xy: 481, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-slag-large + rotate: false + xy: 343, 236 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 liquid-slag-medium rotate: false - xy: 375, 155 + xy: 1671, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-small rotate: false - xy: 971, 205 + xy: 535, 58 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-slag-tiny rotate: false - xy: 325, 1 + xy: 561, 82 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +liquid-slag-xlarge + rotate: false + xy: 531, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-water-large + rotate: false + xy: 249, 196 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 liquid-water-medium rotate: false - xy: 307, 53 + xy: 1705, 238 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-small rotate: false - xy: 895, 103 + xy: 530, 32 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-water-tiny rotate: false - xy: 343, 1 + xy: 597, 100 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +liquid-water-xlarge + rotate: false + xy: 581, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck0 + rotate: false + xy: 831, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck1 + rotate: false + xy: 881, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck2 + rotate: false + xy: 931, 346 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova-wreck0 + rotate: false + xy: 921, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-wreck1 + rotate: false + xy: 979, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-wreck2 + rotate: false + xy: 1037, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck0 + rotate: false + xy: 1211, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck1 + rotate: false + xy: 1269, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck2 + rotate: false + xy: 1327, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +pulsar-wreck0 + rotate: false + xy: 199, 264 + size: 58, 48 + orig: 58, 48 + offset: 0, 0 + index: -1 +pulsar-wreck1 + rotate: false + xy: 265, 330 + size: 58, 48 + orig: 58, 48 + offset: 0, 0 + index: -1 +pulsar-wreck2 + rotate: false + xy: 331, 396 + size: 58, 48 + orig: 58, 48 + offset: 0, 0 + index: -1 repair-point rotate: false - xy: 477, 19 + xy: 1399, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scorch rotate: false - xy: 681, 223 + xy: 1603, 116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-0 rotate: false - xy: 647, 121 + xy: 1977, 98 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-1 rotate: false - xy: 681, 155 + xy: 2011, 98 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-10 rotate: false - xy: 783, 223 + xy: 445, 92 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-11 rotate: false - xy: 613, 19 + xy: 441, 58 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-2 rotate: false - xy: 715, 189 + xy: 1807, 72 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-3 rotate: false - xy: 749, 223 + xy: 1841, 72 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-4 rotate: false - xy: 579, 19 + xy: 1875, 72 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-5 rotate: false - xy: 613, 53 + xy: 1909, 64 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-6 rotate: false - xy: 647, 87 + xy: 1943, 64 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-7 rotate: false - xy: 681, 121 + xy: 1977, 64 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-8 rotate: false - xy: 715, 155 + xy: 2011, 64 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-9 rotate: false - xy: 749, 189 + xy: 445, 126 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +swarmer + rotate: false + xy: 1, 182 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-alpha-full + rotate: false + xy: 515, 254 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-beta-full + rotate: false + xy: 565, 254 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-crawler-full + rotate: false + xy: 615, 254 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-dagger-full + rotate: false + xy: 665, 254 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-flare-full + rotate: false + xy: 715, 254 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-gamma-full + rotate: false + xy: 1501, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-mace-full + rotate: false + xy: 265, 446 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-mono-full + rotate: false + xy: 765, 254 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-nova-full + rotate: false + xy: 1559, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-poly-full + rotate: false + xy: 1617, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-pulsar-full + rotate: false + xy: 397, 462 + size: 58, 48 + orig: 58, 48 + offset: 0, 0 + index: -1 +wave + rotate: false + xy: 265, 380 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 item-blast-compound rotate: false - xy: 35, 19 + xy: 1331, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 103, 87 + xy: 1365, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 171, 155 + xy: 1365, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 239, 223 + xy: 1399, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 103, 53 + xy: 1399, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 171, 121 + xy: 1415, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 239, 189 + xy: 1433, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 103, 19 + xy: 1433, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 171, 87 + xy: 1483, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 239, 155 + xy: 1517, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 307, 223 + xy: 1501, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 171, 53 + xy: 1467, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod rotate: false - xy: 273, 155 + xy: 1585, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 341, 223 + xy: 1501, 184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 205, 53 + xy: 1569, 252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 273, 121 + xy: 1501, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 205, 19 + xy: 1653, 286 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 307, 121 + xy: 1603, 218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 341, 121 + xy: 1637, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 273, 19 + xy: 1671, 150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blank rotate: false - xy: 851, 126 + xy: 447, 454 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 +shape-3 + rotate: false + xy: 1, 51 + size: 63, 63 + orig: 63, 63 + offset: 0, 0 + index: -1 +alpha + rotate: false + xy: 1, 1 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-cell + rotate: false + xy: 1783, 462 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +arkyid-leg + rotate: false + xy: 457, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +atrax-foot + rotate: false + xy: 1397, 412 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 atrax-joint rotate: false - xy: 783, 59 + xy: 1369, 326 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 +atrax-leg + rotate: false + xy: 267, 126 + size: 36, 26 + orig: 36, 26 + offset: 0, 0 + index: -1 +atrax-leg-base + rotate: false + xy: 267, 98 + size: 36, 26 + orig: 36, 26 + offset: 0, 0 + index: -1 +beta + rotate: false + xy: 1501, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +beta-cell + rotate: false + xy: 1551, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler + rotate: false + xy: 66, 32 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-base + rotate: false + xy: 133, 148 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-cell + rotate: false + xy: 199, 214 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-leg + rotate: false + xy: 265, 280 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger + rotate: false + xy: 597, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-base + rotate: false + xy: 647, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-leg + rotate: false + xy: 697, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare + rotate: false + xy: 1097, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +gamma + rotate: false + xy: 515, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +gamma-cell + rotate: false + xy: 573, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +mono + rotate: false + xy: 731, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-cell + rotate: false + xy: 781, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova + rotate: false + xy: 805, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-base + rotate: false + xy: 515, 304 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova-cell + rotate: false + xy: 863, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-leg + rotate: false + xy: 565, 304 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +poly + rotate: false + xy: 1095, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-cell + rotate: false + xy: 1153, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +power-cell + rotate: false + xy: 1385, 454 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +pulsar + rotate: false + xy: 67, 132 + size: 58, 48 + orig: 58, 48 + offset: 0, 0 + index: -1 +pulsar-base + rotate: false + xy: 615, 304 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +pulsar-cell + rotate: false + xy: 133, 198 + size: 58, 48 + orig: 58, 48 + offset: 0, 0 + index: -1 +spiroct-foot + rotate: false + xy: 2001, 406 + size: 46, 46 + orig: 46, 46 + offset: 0, 0 + index: -1 spiroct-joint rotate: false - xy: 613, 87 + xy: 1943, 98 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +spiroct-leg + rotate: false + xy: 915, 310 + size: 48, 34 + orig: 48, 34 + offset: 0, 0 + index: -1 +spiroct-leg-base + rotate: false + xy: 415, 260 + size: 48, 34 + orig: 48, 34 + offset: 0, 0 + index: -1 +vanguard + rotate: false + xy: 815, 254 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +vanguard-cell + rotate: false + xy: 865, 254 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +artillery + rotate: false + xy: 1983, 454 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +eruption + rotate: false + xy: 947, 396 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flakgun + rotate: false + xy: 997, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flamethrower + rotate: false + xy: 1047, 396 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +heal-shotgun-weapon + rotate: false + xy: 1297, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +heal-weapon + rotate: false + xy: 1347, 404 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +heal-weapon-mount + rotate: false + xy: 997, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +large-artillery + rotate: false + xy: 365, 278 + size: 48, 66 + orig: 48, 66 + offset: 0, 0 + index: -1 +large-weapon + rotate: false + xy: 381, 346 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +missiles + rotate: false + xy: 631, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +missiles-mount + rotate: false + xy: 681, 354 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-purple-weapon + rotate: false + xy: 415, 296 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-weapon + rotate: false + xy: 465, 304 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +scepter-weapon + rotate: false + xy: 1443, 408 + size: 56, 102 + orig: 56, 102 + offset: 0, 0 + index: -1 +small-basic-weapon + rotate: false + xy: 665, 304 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +small-mount-weapon + rotate: false + xy: 715, 304 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +small-weapon + rotate: false + xy: 765, 304 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spiroct-weapon + rotate: false + xy: 465, 246 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +weapon + rotate: false + xy: 915, 260 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +zenith-missiles + rotate: false + xy: 965, 296 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 sprites4.png size: 2048,1024 @@ -6783,303 +6951,373 @@ size: 2048,512 format: rgba8888 filter: nearest,nearest repeat: none -char1 - rotate: false - xy: 1281, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char2 - rotate: false - xy: 1315, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char3 - rotate: false - xy: 1349, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliff - rotate: false - xy: 1383, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliffs1 - rotate: false - xy: 1417, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal1 - rotate: false - xy: 1451, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal2 - rotate: false - xy: 1485, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal3 - rotate: false - xy: 1519, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper1 - rotate: false - xy: 1553, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper2 - rotate: false - xy: 1587, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper3 - rotate: false - xy: 1621, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters1 - rotate: false - xy: 1655, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters2 - rotate: false - xy: 1689, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters3 - rotate: false - xy: 1723, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters4 - rotate: false - xy: 1757, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters5 - rotate: false - xy: 1791, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters6 - rotate: false - xy: 1825, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal-large - rotate: false - xy: 687, 329 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dark-metal1 - rotate: false - xy: 1859, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal2 - rotate: false - xy: 1893, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1 - rotate: false - xy: 1927, 459 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1-edge +basalt-edge rotate: false xy: 1, 395 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dark-panel-2 +basalt1 rotate: false - xy: 1961, 459 + xy: 835, 327 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-2-edge +basalt2 + rotate: false + xy: 1165, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt3 + rotate: false + xy: 869, 327 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +char1 + rotate: false + xy: 1199, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +char2 + rotate: false + xy: 903, 327 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +char3 + rotate: false + xy: 1233, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cliff + rotate: false + xy: 937, 327 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +coal1 + rotate: false + xy: 1267, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +coal2 + rotate: false + xy: 971, 327 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +coal3 + rotate: false + xy: 1301, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper1 + rotate: false + xy: 1005, 327 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper2 + rotate: false + xy: 1335, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper3 + rotate: false + xy: 1369, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters1 + rotate: false + xy: 1403, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters2 + rotate: false + xy: 1437, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters3 + rotate: false + xy: 1471, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters4 + rotate: false + xy: 1505, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters5 + rotate: false + xy: 1539, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters6 + rotate: false + xy: 1573, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-edge rotate: false xy: 1, 297 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dark-panel-3 +dacite-wall-large rotate: false - xy: 1995, 459 + xy: 785, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dacite-wall1 + rotate: false + xy: 1709, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-3-edge +dacite-wall2 + rotate: false + xy: 1743, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite1 + rotate: false + xy: 1607, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite2 + rotate: false + xy: 1641, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite3 + rotate: false + xy: 1675, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-metal-large + rotate: false + xy: 491, 35 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dark-metal1 + rotate: false + xy: 1777, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-metal2 + rotate: false + xy: 1811, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-1 + rotate: false + xy: 1845, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-1-edge rotate: false xy: 99, 395 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dark-panel-4 +dark-panel-2 rotate: false - xy: 753, 361 + xy: 1879, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-4-edge +dark-panel-2-edge rotate: false xy: 1, 199 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dark-panel-5 +dark-panel-3 rotate: false - xy: 753, 327 + xy: 1913, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-5-edge +dark-panel-3-edge rotate: false xy: 99, 297 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dark-panel-6 +dark-panel-4 rotate: false - xy: 753, 293 + xy: 1947, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-6-edge +dark-panel-4-edge rotate: false xy: 197, 395 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -darksand-edge +dark-panel-5 + rotate: false + xy: 1981, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-5-edge rotate: false xy: 1, 101 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -darksand-tainted-water +dark-panel-6 rotate: false - xy: 525, 1 + xy: 2015, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand-tainted-water-edge +dark-panel-6-edge rotate: false xy: 99, 199 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -darksand-tainted-water1 - rotate: false - xy: 655, 131 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water2 - rotate: false - xy: 753, 259 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water3 - rotate: false - xy: 689, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water - rotate: false - xy: 689, 145 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water-edge +darksand-edge rotate: false xy: 197, 297 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +darksand-tainted-water + rotate: false + xy: 753, 263 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water-edge + rotate: false + xy: 295, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +darksand-tainted-water1 + rotate: false + xy: 525, 1 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water2 + rotate: false + xy: 655, 131 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water3 + rotate: false + xy: 753, 229 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water + rotate: false + xy: 787, 277 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water-edge + rotate: false + xy: 1, 3 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 darksand-water1 rotate: false - xy: 737, 225 + xy: 787, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water2 rotate: false - xy: 1181, 409 + xy: 1049, 343 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water3 rotate: false - xy: 1215, 409 + xy: 1099, 393 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -7107,1043 +7345,1036 @@ darksand3 index: -1 deepwater rotate: false - xy: 1249, 409 + xy: 835, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-edge - rotate: false - xy: 295, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dunerocks-large - rotate: false - xy: 785, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dunerocks1 - rotate: false - xy: 1283, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dunerocks2 - rotate: false - xy: 1317, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -edge - rotate: false - xy: 1351, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -edge-stencil - rotate: false - xy: 1, 3 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -edgier - rotate: false - xy: 1385, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass-edge rotate: false xy: 99, 101 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -grass1 - rotate: false - xy: 1419, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass2 - rotate: false - xy: 1453, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass3 - rotate: false - xy: 1487, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-edge +dirt-edge rotate: false xy: 197, 199 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -holostone1 - rotate: false - xy: 1521, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone2 - rotate: false - xy: 1555, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone3 - rotate: false - xy: 1589, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock1 - rotate: false - xy: 1623, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock2 - rotate: false - xy: 1657, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock3 - rotate: false - xy: 1691, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-edge - rotate: false - xy: 295, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-snow-edge - rotate: false - xy: 393, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-snow1 - rotate: false - xy: 1827, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow2 - rotate: false - xy: 1861, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow3 - rotate: false - xy: 1895, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice1 - rotate: false - xy: 1725, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice2 - rotate: false - xy: 1759, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice3 - rotate: false - xy: 1793, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icerocks-large - rotate: false - xy: 491, 35 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -icerocks1 - rotate: false - xy: 1929, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icerocks2 - rotate: false - xy: 1963, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock-edge - rotate: false - xy: 99, 3 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ignarock1 - rotate: false - xy: 1997, 425 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock2 - rotate: false - xy: 771, 225 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock3 - rotate: false - xy: 1283, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead1 - rotate: false - xy: 1317, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead2 - rotate: false - xy: 1351, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead3 - rotate: false - xy: 1385, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock1 - rotate: false - xy: 1419, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock2 - rotate: false - xy: 1453, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock3 - rotate: false - xy: 1487, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor - rotate: false - xy: 1521, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2 - rotate: false - xy: 1555, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2-edge - rotate: false - xy: 197, 101 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-3 - rotate: false - xy: 1589, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-3-edge - rotate: false - xy: 295, 199 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-5 - rotate: false - xy: 1623, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-5-edge - rotate: false - xy: 393, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-damaged-edge - rotate: false - xy: 491, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-damaged1 - rotate: false - xy: 1657, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged2 - rotate: false - xy: 1691, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged3 - rotate: false - xy: 1725, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-edge - rotate: false - xy: 197, 3 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -moss-edge - rotate: false - xy: 295, 101 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -moss1 - rotate: false - xy: 1759, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss2 - rotate: false - xy: 1793, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss3 - rotate: false - xy: 1827, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal1 - rotate: false - xy: 1861, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal2 - rotate: false - xy: 1895, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal3 - rotate: false - xy: 1929, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper1 - rotate: false - xy: 1963, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper2 - rotate: false - xy: 1997, 391 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper3 - rotate: false - xy: 723, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead1 - rotate: false - xy: 723, 145 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead2 - rotate: false - xy: 757, 191 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead3 - rotate: false - xy: 757, 157 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap1 - rotate: false - xy: 689, 111 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap2 - rotate: false - xy: 723, 111 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap3 - rotate: false - xy: 757, 123 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium1 - rotate: false - xy: 791, 191 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium2 - rotate: false - xy: 791, 157 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium3 - rotate: false - xy: 791, 123 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium1 - rotate: false - xy: 757, 89 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium2 - rotate: false - xy: 791, 89 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium3 - rotate: false - xy: 591, 99 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pebbles1 - rotate: false - xy: 591, 65 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pebbles2 - rotate: false - xy: 625, 97 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pebbles3 - rotate: false - xy: 625, 63 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pine - rotate: false - xy: 687, 213 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rocks-large +dirt-wall-large rotate: false xy: 589, 133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -rocks1 +dirt-wall1 rotate: false - xy: 659, 77 + xy: 971, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -rocks2 +dirt-wall2 rotate: false - xy: 693, 77 + xy: 1005, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -salt +dirt1 rotate: false - xy: 659, 43 + xy: 869, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -salt-edge +dirt2 + rotate: false + xy: 903, 293 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt3 + rotate: false + xy: 937, 293 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dune-wall-large + rotate: false + xy: 687, 231 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dune-wall1 + rotate: false + xy: 1039, 309 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dune-wall2 + rotate: false + xy: 821, 259 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +edge + rotate: false + xy: 855, 259 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +edge-stencil + rotate: false + xy: 295, 297 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +edgier + rotate: false + xy: 889, 259 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass-edge + rotate: false + xy: 393, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +grass1 + rotate: false + xy: 923, 259 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass2 + rotate: false + xy: 957, 259 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass3 + rotate: false + xy: 991, 259 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock1 + rotate: false + xy: 1165, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock2 + rotate: false + xy: 1199, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock3 + rotate: false + xy: 1233, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-edge + rotate: false + xy: 99, 3 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +ice-snow-edge + rotate: false + xy: 197, 101 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +ice-snow1 + rotate: false + xy: 1369, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-snow2 + rotate: false + xy: 1403, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-snow3 + rotate: false + xy: 1437, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall-large + rotate: false + xy: 785, 361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +ice-wall1 + rotate: false + xy: 1471, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall2 + rotate: false + xy: 1505, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice1 + rotate: false + xy: 1267, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice2 + rotate: false + xy: 1301, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice3 + rotate: false + xy: 1335, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead1 + rotate: false + xy: 1539, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead2 + rotate: false + xy: 1573, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead3 + rotate: false + xy: 1607, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock1 + rotate: false + xy: 1641, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock2 + rotate: false + xy: 1675, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock3 + rotate: false + xy: 1709, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor + rotate: false + xy: 1743, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-2 + rotate: false + xy: 1777, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-2-edge + rotate: false + xy: 295, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-3 + rotate: false + xy: 1811, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-3-edge + rotate: false + xy: 393, 297 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-5 + rotate: false + xy: 1845, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-5-edge + rotate: false + xy: 491, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-damaged-edge + rotate: false + xy: 197, 3 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-damaged1 + rotate: false + xy: 1879, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-damaged2 + rotate: false + xy: 1913, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-damaged3 + rotate: false + xy: 1947, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-edge + rotate: false + xy: 295, 101 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +moss-edge rotate: false xy: 393, 199 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -saltrocks-large +moss1 rotate: false - xy: 687, 263 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -saltrocks1 - rotate: false - xy: 693, 43 + xy: 1981, 425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -saltrocks2 +moss2 rotate: false - xy: 727, 55 + xy: 2015, 425 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -sand-edge +moss3 + rotate: false + xy: 1083, 343 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-coal1 + rotate: false + xy: 1073, 309 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-coal2 + rotate: false + xy: 1039, 275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-coal3 + rotate: false + xy: 1073, 275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper1 + rotate: false + xy: 821, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper2 + rotate: false + xy: 855, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper3 + rotate: false + xy: 889, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead1 + rotate: false + xy: 923, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead2 + rotate: false + xy: 957, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead3 + rotate: false + xy: 991, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-scrap1 + rotate: false + xy: 787, 209 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-scrap2 + rotate: false + xy: 1025, 241 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-scrap3 + rotate: false + xy: 1059, 241 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-thorium1 + rotate: false + xy: 821, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-thorium2 + rotate: false + xy: 855, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-thorium3 + rotate: false + xy: 889, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-titanium1 + rotate: false + xy: 923, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-titanium2 + rotate: false + xy: 957, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-titanium3 + rotate: false + xy: 991, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pebbles1 + rotate: false + xy: 1025, 207 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pebbles2 + rotate: false + xy: 1059, 207 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pebbles3 + rotate: false + xy: 1025, 173 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pine + rotate: false + xy: 785, 311 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +salt + rotate: false + xy: 1059, 173 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +salt-edge rotate: false xy: 491, 297 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -sand-water - rotate: false - xy: 761, 21 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water-edge - rotate: false - xy: 589, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -sand-water1 - rotate: false - xy: 795, 21 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water2 - rotate: false - xy: 787, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water3 - rotate: false - xy: 787, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand1 - rotate: false - xy: 761, 55 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand2 - rotate: false - xy: 795, 55 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand3 - rotate: false - xy: 727, 21 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-large +salt-wall-large rotate: false xy: 851, 427 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sandrocks1 +salt-wall1 rotate: false - xy: 821, 393 + xy: 1093, 241 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -sandrocks2 +salt-wall2 rotate: false - xy: 787, 325 + xy: 1093, 207 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -scrap1 +sand-edge rotate: false - xy: 855, 393 + xy: 589, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +sand-wall-large + rotate: false + xy: 851, 361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +sand-wall1 + rotate: false + xy: 1127, 241 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -scrap2 +sand-wall2 rotate: false - xy: 821, 359 + xy: 1127, 207 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -scrap3 +sand-water rotate: false - xy: 787, 291 + xy: 1127, 173 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shale-edge +sand-water-edge rotate: false xy: 295, 3 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -shale1 +sand-water1 rotate: false - xy: 889, 393 + xy: 591, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shale2 +sand-water2 rotate: false - xy: 821, 325 + xy: 591, 65 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shale3 +sand-water3 rotate: false - xy: 855, 359 + xy: 625, 97 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shalerocks-large +sand1 rotate: false - xy: 917, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shalerocks1 - rotate: false - xy: 923, 393 + xy: 1093, 173 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shalerocks2 +sand2 rotate: false - xy: 821, 291 + xy: 1107, 309 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shrubs-large +sand3 rotate: false - xy: 983, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shrubs1 - rotate: false - xy: 855, 325 + xy: 1107, 275 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shrubs2 +scrap1 rotate: false - xy: 889, 359 + xy: 625, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -slag +scrap2 rotate: false - xy: 957, 393 + xy: 659, 97 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -slag-edge +scrap3 + rotate: false + xy: 659, 63 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-edge rotate: false xy: 393, 101 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -snow-edge +shale-wall-large + rotate: false + xy: 917, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +shale-wall1 + rotate: false + xy: 723, 161 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-wall2 + rotate: false + xy: 757, 175 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale1 + rotate: false + xy: 689, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale2 + rotate: false + xy: 689, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale3 + rotate: false + xy: 723, 195 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shrubs-large + rotate: false + xy: 917, 361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +shrubs1 + rotate: false + xy: 757, 141 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shrubs2 + rotate: false + xy: 791, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +slag + rotate: false + xy: 825, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +slag-edge rotate: false xy: 491, 199 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -snow-pine - rotate: false - xy: 1181, 443 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow1 - rotate: false - xy: 855, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow2 - rotate: false - xy: 889, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow3 - rotate: false - xy: 923, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snowrocks-large - rotate: false - xy: 1049, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -snowrocks1 - rotate: false - xy: 991, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snowrocks2 - rotate: false - xy: 889, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spawn - rotate: false - xy: 923, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss-edge +snow-edge rotate: false xy: 589, 297 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -spore-moss1 +snow-pine rotate: false - xy: 957, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss2 - rotate: false - xy: 1025, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss3 - rotate: false - xy: 923, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-pine - rotate: false - xy: 1231, 443 + xy: 1049, 377 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -sporerocks-large +snow-wall-large rotate: false - xy: 1115, 427 + xy: 983, 427 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks1 +snow-wall1 rotate: false - xy: 957, 325 + xy: 961, 157 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -sporerocks2 +snow-wall2 rotate: false - xy: 991, 359 + xy: 791, 123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -stone-edge +snow1 + rotate: false + xy: 859, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snow2 + rotate: false + xy: 893, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snow3 + rotate: false + xy: 927, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spawn + rotate: false + xy: 825, 123 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spore-moss-edge rotate: false xy: 687, 395 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -stone1 +spore-moss1 rotate: false - xy: 1059, 393 + xy: 859, 123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -stone2 +spore-moss2 rotate: false - xy: 957, 291 + xy: 893, 123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -stone3 +spore-moss3 rotate: false - xy: 991, 325 + xy: 927, 123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -tainted-water +spore-pine rotate: false - xy: 1025, 359 + xy: 1115, 443 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spore-wall-large + rotate: false + xy: 983, 361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-wall1 + rotate: false + xy: 961, 123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -tainted-water-edge +spore-wall2 + rotate: false + xy: 995, 139 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone-edge rotate: false xy: 393, 3 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -tar +stone-wall-large rotate: false - xy: 1093, 393 + xy: 1049, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall1 + rotate: false + xy: 1131, 139 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -tar-edge +stone-wall2 + rotate: false + xy: 995, 105 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone1 + rotate: false + xy: 1029, 139 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone2 + rotate: false + xy: 1063, 139 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone3 + rotate: false + xy: 1097, 139 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tainted-water + rotate: false + xy: 1029, 105 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tainted-water-edge rotate: false xy: 491, 101 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +tar + rotate: false + xy: 1063, 105 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tar-edge + rotate: false + xy: 589, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 tendrils1 rotate: false - xy: 991, 291 + xy: 1097, 105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils2 rotate: false - xy: 1025, 325 + xy: 1131, 105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils3 rotate: false - xy: 1059, 359 + xy: 1133, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 1127, 393 + xy: 1167, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 1025, 291 + xy: 1201, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 1059, 325 + xy: 1235, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 1093, 359 + xy: 1269, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 1059, 291 + xy: 1303, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 1093, 325 + xy: 1337, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water rotate: false - xy: 1127, 359 + xy: 1371, 391 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-edge rotate: false - xy: 589, 199 + xy: 687, 297 size: 96, 96 orig: 96, 96 offset: 0, 0 @@ -8156,2155 +8387,2218 @@ filter: nearest,nearest repeat: none additive-reconstructor-icon-editor rotate: false - xy: 485, 631 + xy: 613, 743 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory-icon-editor rotate: false - xy: 613, 759 + xy: 1717, 905 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-icon-editor rotate: false - xy: 1555, 921 + xy: 711, 743 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-icon-editor rotate: false - xy: 375, 207 + xy: 2011, 969 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-icon-editor rotate: false - xy: 181, 17 + xy: 1893, 707 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt-icon-editor + rotate: false + xy: 2011, 935 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt1 + rotate: false + xy: 2011, 935 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-editor rotate: false - xy: 583, 695 + xy: 1927, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-editor rotate: false - xy: 1653, 921 + xy: 1815, 905 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill-icon-editor rotate: false - xy: 1, 19 + xy: 1, 3 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-mixer-icon-editor rotate: false - xy: 1005, 725 + xy: 1103, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border-editor rotate: false - xy: 583, 661 + xy: 2011, 901 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-forge-icon-editor rotate: false - xy: 1751, 921 + xy: 809, 743 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-loader-icon-editor rotate: false - xy: 1849, 921 + xy: 1913, 905 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader-icon-editor rotate: false - xy: 1947, 921 + xy: 227, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +boulder-icon-editor + rotate: false + xy: 1535, 625 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 bridge-conduit-icon-editor rotate: false - xy: 583, 627 + xy: 1961, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 583, 593 + xy: 2011, 867 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 583, 559 + xy: 2011, 833 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 583, 559 + xy: 2011, 833 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear-editor rotate: false - xy: 2045, 1016 + xy: 615, 544 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 cliff-icon-editor rotate: false - xy: 587, 367 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliffs-icon-editor - rotate: false - xy: 587, 333 + xy: 131, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal-centrifuge-icon-editor rotate: false - xy: 1071, 725 + xy: 1169, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 combustion-generator-icon-editor rotate: false - xy: 587, 299 + xy: 165, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +command-center-icon-editor + rotate: false + xy: 1235, 807 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 conduit-icon-editor rotate: false - xy: 521, 235 + xy: 943, 447 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 1137, 725 + xy: 1301, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 555, 235 + xy: 1995, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 1995, 795 + xy: 977, 447 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 1203, 725 + xy: 1367, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-icon-editor rotate: false - xy: 323, 437 + xy: 323, 389 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-icon-editor rotate: false - xy: 323, 567 + xy: 613, 841 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-icon-editor rotate: false - xy: 227, 277 + xy: 227, 163 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 craters-icon-editor rotate: false - xy: 1995, 761 + xy: 229, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters1 rotate: false - xy: 1995, 761 + xy: 229, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cryofluidmixer-icon-editor rotate: false - xy: 1269, 725 + xy: 1433, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 1335, 725 + xy: 1499, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone-icon-editor rotate: false - xy: 227, 179 + xy: 517, 615 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +dacite-boulder-icon-editor + rotate: false + xy: 1601, 691 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-icon-editor + rotate: false + xy: 263, 31 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite1 + rotate: false + xy: 263, 31 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-wall-icon-editor + rotate: false + xy: 423, 355 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 dark-metal-icon-editor rotate: false - xy: 1995, 727 + xy: 423, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-editor rotate: false - xy: 1995, 693 + xy: 423, 287 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-1 rotate: false - xy: 1995, 693 + xy: 423, 287 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-editor rotate: false - xy: 1995, 659 + xy: 423, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-2 rotate: false - xy: 1995, 659 + xy: 423, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-editor rotate: false - xy: 1995, 625 + xy: 423, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-3 rotate: false - xy: 1995, 625 + xy: 423, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-editor rotate: false - xy: 409, 205 + xy: 327, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-4 rotate: false - xy: 409, 205 + xy: 327, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-editor rotate: false - xy: 443, 205 + xy: 361, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-5 rotate: false - xy: 443, 205 + xy: 361, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-editor rotate: false - xy: 477, 205 + xy: 649, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-6 rotate: false - xy: 477, 205 + xy: 649, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-editor rotate: false - xy: 511, 201 + xy: 683, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand1 rotate: false - xy: 511, 201 + xy: 683, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-editor rotate: false - xy: 545, 201 + xy: 717, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-editor rotate: false - xy: 579, 201 + xy: 751, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 361, 57 + xy: 785, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 361, 57 + xy: 785, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-icon-editor rotate: false - xy: 131, 51 + xy: 131, 35 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode-icon-editor rotate: false - xy: 361, 23 + xy: 819, 415 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-icon-editor + rotate: false + xy: 853, 415 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt1 + rotate: false + xy: 853, 415 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-wall-icon-editor + rotate: false + xy: 887, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 disassembler-icon-editor rotate: false - xy: 229, 81 + xy: 517, 517 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 distributor-icon-editor rotate: false - xy: 1401, 725 + xy: 1565, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 617, 725 + xy: 395, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 1467, 725 + xy: 1631, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -dunerocks-icon-editor - rotate: false - xy: 617, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -duo-icon-editor - rotate: false - xy: 651, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char2 - rotate: false - xy: 617, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-char3 - rotate: false - xy: 651, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters2 - rotate: false - xy: 685, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-craters3 - rotate: false - xy: 617, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water1 - rotate: false - xy: 719, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water2 - rotate: false - xy: 617, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-tainted-water3 - rotate: false - xy: 651, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water1 - rotate: false - xy: 685, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water2 - rotate: false - xy: 719, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand-water3 - rotate: false - xy: 753, 725 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand2 - rotate: false - xy: 651, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-darksand3 - rotate: false - xy: 685, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass1 - rotate: false - xy: 651, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass-icon-editor - rotate: false - xy: 651, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass2 - rotate: false - xy: 685, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-grass3 - rotate: false - xy: 719, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone1 - rotate: false - xy: 753, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-icon-editor - rotate: false - xy: 753, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone2 - rotate: false - xy: 685, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone3 - rotate: false - xy: 719, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock1 - rotate: false - xy: 753, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock-icon-editor - rotate: false - xy: 753, 657 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock2 - rotate: false - xy: 719, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-hotrock3 - rotate: false - xy: 753, 623 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow1 - rotate: false - xy: 685, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow-icon-editor - rotate: false - xy: 685, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow2 - rotate: false - xy: 719, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice-snow3 - rotate: false - xy: 753, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice1 - rotate: false - xy: 753, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-icon-editor - rotate: false - xy: 753, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice2 - rotate: false - xy: 617, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ice3 - rotate: false - xy: 651, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock1 - rotate: false - xy: 787, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock-icon-editor - rotate: false - xy: 787, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock2 - rotate: false - xy: 787, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock3 - rotate: false - xy: 787, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock1 - rotate: false - xy: 821, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock-icon-editor - rotate: false - xy: 821, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock2 - rotate: false - xy: 821, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-magmarock3 - rotate: false - xy: 787, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor - rotate: false - xy: 821, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-icon-editor - rotate: false - xy: 821, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-2 - rotate: false - xy: 855, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2-icon-editor - rotate: false - xy: 855, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-3 - rotate: false - xy: 855, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-3-icon-editor - rotate: false - xy: 855, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-5 - rotate: false - xy: 821, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-5-icon-editor - rotate: false - xy: 821, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged1 - rotate: false - xy: 855, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged-icon-editor - rotate: false - xy: 855, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged2 - rotate: false - xy: 889, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-metal-floor-damaged3 - rotate: false - xy: 889, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss1 - rotate: false - xy: 855, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss-icon-editor - rotate: false - xy: 855, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss2 - rotate: false - xy: 889, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-moss3 - rotate: false - xy: 923, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal1 - rotate: false - xy: 923, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal2 - rotate: false - xy: 889, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-coal3 - rotate: false - xy: 923, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper1 - rotate: false - xy: 957, 659 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper2 - rotate: false - xy: 957, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-copper3 - rotate: false - xy: 923, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead1 - rotate: false - xy: 957, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead2 - rotate: false - xy: 957, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-lead3 - rotate: false - xy: 991, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap1 - rotate: false - xy: 991, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap2 - rotate: false - xy: 1025, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-scrap3 - rotate: false - xy: 991, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium1 - rotate: false - xy: 1025, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium2 - rotate: false - xy: 1059, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-thorium3 - rotate: false - xy: 1025, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium1 - rotate: false - xy: 1059, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium2 - rotate: false - xy: 1093, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ore-titanium3 - rotate: false - xy: 1059, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles1 - rotate: false - xy: 1093, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles2 - rotate: false - xy: 1127, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-pebbles3 - rotate: false - xy: 1093, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-salt - rotate: false - xy: 1127, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-icon-editor - rotate: false - xy: 1127, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water1 - rotate: false - xy: 1195, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water2 - rotate: false - xy: 1161, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand-water3 - rotate: false - xy: 1195, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand1 - rotate: false - xy: 1161, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-icon-editor - rotate: false - xy: 1161, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand2 - rotate: false - xy: 1127, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-sand3 - rotate: false - xy: 1161, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale1 - rotate: false - xy: 1229, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-icon-editor - rotate: false - xy: 1229, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale2 - rotate: false - xy: 1195, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-shale3 - rotate: false - xy: 1229, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-slag - rotate: false - xy: 1263, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -slag-icon-editor - rotate: false - xy: 1263, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow1 - rotate: false - xy: 1229, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow2 - rotate: false - xy: 1263, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-snow3 - rotate: false - xy: 1297, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spawn - rotate: false - xy: 1263, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss1 - rotate: false - xy: 1297, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss-icon-editor - rotate: false - xy: 1297, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss2 - rotate: false - xy: 1331, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-spore-moss3 - rotate: false - xy: 1297, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone1 - rotate: false - xy: 1331, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone-icon-editor - rotate: false - xy: 1331, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone2 - rotate: false - xy: 1365, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-stone3 - rotate: false - xy: 1331, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tainted-water - rotate: false - xy: 1365, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tainted-water-icon-editor - rotate: false - xy: 1365, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tar - rotate: false - xy: 1399, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tar-icon-editor - rotate: false - xy: 1399, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils1 - rotate: false - xy: 1365, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils2 - rotate: false - xy: 1399, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-tendrils3 - rotate: false - xy: 1433, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-water - rotate: false - xy: 1399, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water-icon-editor - rotate: false - xy: 1399, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -exponential-reconstructor-icon-editor - rotate: false - xy: 1, 149 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -force-projector-icon-editor - rotate: false - xy: 485, 533 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -fuse-icon-editor - rotate: false - xy: 711, 759 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -graphite-press-icon-editor - rotate: false - xy: 1533, 725 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -ground-factory-icon-editor - rotate: false - xy: 809, 791 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -hail-icon-editor - rotate: false - xy: 1433, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icerocks-icon-editor - rotate: false - xy: 1467, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -illuminator-icon-editor - rotate: false - xy: 1433, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -impact-reactor-icon-editor - rotate: false - xy: 775, 889 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -incinerator-icon-editor - rotate: false - xy: 1467, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -inverted-sorter-icon-editor - rotate: false - xy: 1501, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source-icon-editor - rotate: false - xy: 1467, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void-icon-editor - rotate: false - xy: 1501, 591 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction-icon-editor - rotate: false - xy: 1535, 625 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln-icon-editor - rotate: false - xy: 1599, 757 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -lancer-icon-editor - rotate: false - xy: 1665, 757 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -laser-drill-icon-editor - rotate: false - xy: 907, 791 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-icon-editor - rotate: false - xy: 1005, 791 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-large-icon-editor - rotate: false - xy: 905, 889 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -liquid-junction-icon-editor - rotate: false - xy: 1501, 557 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-icon-editor +dune-wall-icon-editor rotate: false xy: 1535, 591 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +duo-icon-editor + rotate: false + xy: 1585, 641 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt2 + rotate: false + xy: 1619, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt3 + rotate: false + xy: 1653, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-char2 + rotate: false + xy: 1687, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-char3 + rotate: false + xy: 1721, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-craters2 + rotate: false + xy: 1755, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-craters3 + rotate: false + xy: 1789, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite2 + rotate: false + xy: 1823, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite3 + rotate: false + xy: 1857, 665 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-tainted-water1 + rotate: false + xy: 1653, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-tainted-water2 + rotate: false + xy: 1687, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-tainted-water3 + rotate: false + xy: 1721, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-water1 + rotate: false + xy: 1755, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-water2 + rotate: false + xy: 1789, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-water3 + rotate: false + xy: 1823, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand2 + rotate: false + xy: 1569, 591 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand3 + rotate: false + xy: 1619, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt2 + rotate: false + xy: 1857, 631 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt3 + rotate: false + xy: 1603, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-grass1 + rotate: false + xy: 1637, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass-icon-editor + rotate: false + xy: 1637, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-grass2 + rotate: false + xy: 1671, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-grass3 + rotate: false + xy: 1705, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-hotrock1 + rotate: false + xy: 1739, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock-icon-editor + rotate: false + xy: 1739, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-hotrock2 + rotate: false + xy: 1773, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-hotrock3 + rotate: false + xy: 1807, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice-snow1 + rotate: false + xy: 989, 413 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-snow-icon-editor + rotate: false + xy: 989, 413 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice-snow2 + rotate: false + xy: 1893, 673 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice-snow3 + rotate: false + xy: 1927, 673 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice1 + rotate: false + xy: 1841, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-icon-editor + rotate: false + xy: 1841, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice2 + rotate: false + xy: 921, 413 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice3 + rotate: false + xy: 955, 413 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-magmarock1 + rotate: false + xy: 1961, 673 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock-icon-editor + rotate: false + xy: 1961, 673 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-magmarock2 + rotate: false + xy: 1995, 673 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-magmarock3 + rotate: false + xy: 1891, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor + rotate: false + xy: 1925, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-icon-editor + rotate: false + xy: 1925, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-2 + rotate: false + xy: 1959, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-2-icon-editor + rotate: false + xy: 1959, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-3 + rotate: false + xy: 1993, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-3-icon-editor + rotate: false + xy: 1993, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-5 + rotate: false + xy: 1875, 597 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-5-icon-editor + rotate: false + xy: 1875, 597 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-damaged1 + rotate: false + xy: 1909, 605 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-damaged-icon-editor + rotate: false + xy: 1909, 605 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-damaged2 + rotate: false + xy: 1943, 605 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-damaged3 + rotate: false + xy: 1977, 605 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-moss1 + rotate: false + xy: 2011, 605 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +moss-icon-editor + rotate: false + xy: 2011, 605 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-moss2 + rotate: false + xy: 1875, 563 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-moss3 + rotate: false + xy: 1909, 571 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-coal1 + rotate: false + xy: 1943, 571 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-coal2 + rotate: false + xy: 1977, 571 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-coal3 + rotate: false + xy: 2011, 571 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-copper1 + rotate: false + xy: 1909, 537 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-copper2 + rotate: false + xy: 1943, 537 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-copper3 + rotate: false + xy: 1977, 537 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-lead1 + rotate: false + xy: 2011, 537 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-lead2 + rotate: false + xy: 425, 185 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-lead3 + rotate: false + xy: 425, 151 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-scrap1 + rotate: false + xy: 425, 117 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-scrap2 + rotate: false + xy: 429, 83 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-scrap3 + rotate: false + xy: 429, 49 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-thorium1 + rotate: false + xy: 1011, 477 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-thorium2 + rotate: false + xy: 1045, 477 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-thorium3 + rotate: false + xy: 457, 385 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-titanium1 + rotate: false + xy: 457, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-titanium2 + rotate: false + xy: 491, 385 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-titanium3 + rotate: false + xy: 457, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-pebbles1 + rotate: false + xy: 525, 385 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-pebbles2 + rotate: false + xy: 491, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-pebbles3 + rotate: false + xy: 457, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-salt + rotate: false + xy: 559, 385 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +salt-icon-editor + rotate: false + xy: 559, 385 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand-water1 + rotate: false + xy: 593, 385 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand-water2 + rotate: false + xy: 491, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand-water3 + rotate: false + xy: 525, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand1 + rotate: false + xy: 491, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-icon-editor + rotate: false + xy: 491, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand2 + rotate: false + xy: 525, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand3 + rotate: false + xy: 457, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-shale1 + rotate: false + xy: 559, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-icon-editor + rotate: false + xy: 559, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-shale2 + rotate: false + xy: 491, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-shale3 + rotate: false + xy: 525, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-slag + rotate: false + xy: 559, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +slag-icon-editor + rotate: false + xy: 559, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-snow1 + rotate: false + xy: 593, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-snow2 + rotate: false + xy: 525, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-snow3 + rotate: false + xy: 559, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-spawn + rotate: false + xy: 593, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-spore-moss1 + rotate: false + xy: 559, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spore-moss-icon-editor + rotate: false + xy: 559, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-spore-moss2 + rotate: false + xy: 593, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-spore-moss3 + rotate: false + xy: 593, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-stone1 + rotate: false + xy: 627, 381 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone-icon-editor + rotate: false + xy: 627, 381 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-stone2 + rotate: false + xy: 627, 347 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-stone3 + rotate: false + xy: 661, 381 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-tainted-water + rotate: false + xy: 627, 313 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tainted-water-icon-editor + rotate: false + xy: 627, 313 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-tar + rotate: false + xy: 661, 347 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tar-icon-editor + rotate: false + xy: 661, 347 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-tendrils1 + rotate: false + xy: 695, 381 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-tendrils2 + rotate: false + xy: 627, 279 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-tendrils3 + rotate: false + xy: 661, 313 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-water + rotate: false + xy: 695, 347 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +water-icon-editor + rotate: false + xy: 695, 347 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +exponential-reconstructor-icon-editor + rotate: false + xy: 1, 133 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +force-projector-icon-editor + rotate: false + xy: 325, 291 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +fuse-icon-editor + rotate: false + xy: 325, 193 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +graphite-press-icon-editor + rotate: false + xy: 943, 481 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +ground-factory-icon-editor + rotate: false + xy: 615, 645 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +hail-icon-editor + rotate: false + xy: 729, 381 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hyper-processor-icon-editor + rotate: false + xy: 615, 547 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +ice-wall-icon-editor + rotate: false + xy: 661, 279 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +illuminator-icon-editor + rotate: false + xy: 695, 313 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +impact-reactor-icon-editor + rotate: false + xy: 937, 873 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +incinerator-icon-editor + rotate: false + xy: 729, 347 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +inverted-sorter-icon-editor + rotate: false + xy: 763, 381 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-source-icon-editor + rotate: false + xy: 695, 279 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-void-icon-editor + rotate: false + xy: 729, 313 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +junction-icon-editor + rotate: false + xy: 763, 347 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +kiln-icon-editor + rotate: false + xy: 1007, 709 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +lancer-icon-editor + rotate: false + xy: 1007, 643 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +large-logic-display-icon-editor + rotate: false + xy: 323, 519 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +laser-drill-icon-editor + rotate: false + xy: 713, 645 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +launch-pad-icon-editor + rotate: false + xy: 713, 547 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +launch-pad-large-icon-editor + rotate: false + xy: 1067, 873 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +liquid-junction-icon-editor + rotate: false + xy: 797, 381 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-router-icon-editor + rotate: false + xy: 729, 279 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 liquid-source-icon-editor rotate: false - xy: 1535, 557 + xy: 763, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 1103, 791 + xy: 811, 645 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-void-icon-editor rotate: false - xy: 617, 521 + xy: 797, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-display-icon-editor rotate: false - xy: 1201, 791 + xy: 811, 547 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor-icon-editor rotate: false - xy: 1731, 757 + xy: 1007, 577 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 1299, 791 + xy: 229, 65 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 1797, 757 + xy: 1009, 511 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 617, 487 + xy: 831, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-editor rotate: false - xy: 1035, 889 + xy: 1197, 873 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 melter-icon-editor rotate: false - xy: 651, 521 + xy: 763, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 memory-cell-icon-editor rotate: false - xy: 617, 453 + xy: 797, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 1863, 757 + xy: 1103, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-icon-editor rotate: false - xy: 651, 487 + xy: 831, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 685, 521 + xy: 865, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor-icon-editor rotate: false - xy: 617, 419 + xy: 797, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 1397, 791 + xy: 327, 95 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor-icon-editor rotate: false - xy: 613, 857 + xy: 775, 841 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory-icon-editor rotate: false - xy: 453, 435 + xy: 453, 419 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 1495, 791 + xy: 551, 419 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-icon-editor rotate: false - xy: 1593, 823 + xy: 649, 449 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 1929, 757 + xy: 1169, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 651, 453 + xy: 831, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 parallax-icon-editor rotate: false - xy: 551, 467 + xy: 1235, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 payload-conveyor-icon-editor rotate: false - xy: 1691, 823 + xy: 747, 449 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon-editor rotate: false - xy: 1789, 823 + xy: 845, 449 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 685, 487 + xy: 865, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 719, 521 + xy: 831, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 651, 419 + xy: 865, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 685, 453 + xy: 865, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 1005, 659 + xy: 1301, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 1071, 659 + xy: 1367, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 325, 191 + xy: 1651, 691 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 1137, 659 + xy: 1433, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-conveyor-icon-editor rotate: false - xy: 719, 487 + xy: 627, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-icon-editor rotate: false - xy: 753, 521 + xy: 661, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large-icon-editor rotate: false - xy: 1203, 659 + xy: 1499, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plated-conduit-icon-editor rotate: false - xy: 787, 523 + xy: 695, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 1269, 659 + xy: 1565, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 685, 419 + xy: 729, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 1335, 659 + xy: 1631, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 719, 453 + xy: 763, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 753, 487 + xy: 797, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 787, 489 + xy: 831, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 821, 523 + xy: 865, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 1401, 659 + xy: 1697, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 719, 419 + xy: 899, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point-icon-editor rotate: false - xy: 1467, 659 + xy: 1763, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ripple-icon-editor rotate: false - xy: 1887, 823 + xy: 1717, 807 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -rock-icon-editor - rotate: false - xy: 1985, 871 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rocks-icon-editor - rotate: false - xy: 753, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 rotary-pump-icon-editor rotate: false - xy: 1533, 659 + xy: 1829, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 787, 455 + xy: 899, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 1599, 691 + xy: 1895, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -saltrocks-icon-editor +salt-wall-icon-editor rotate: false - xy: 821, 489 + xy: 933, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 1665, 691 + xy: 1961, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-editor rotate: false - xy: 855, 523 + xy: 899, 311 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-wall-icon-editor + rotate: false + xy: 933, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 753, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-icon-editor - rotate: false - xy: 787, 421 + xy: 967, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-editor rotate: false - xy: 1731, 691 + xy: 1073, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-icon-editor rotate: false - xy: 821, 455 + xy: 899, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-editor rotate: false - xy: 1165, 889 + xy: 1327, 873 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge-icon-editor rotate: false - xy: 325, 339 + xy: 1815, 807 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 855, 489 + xy: 933, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 1797, 691 + xy: 1073, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 segment-icon-editor rotate: false - xy: 1863, 691 + xy: 1139, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 1929, 691 + xy: 1139, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-editor rotate: false - xy: 889, 523 + xy: 967, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shalerocks-icon-editor +shale-wall-icon-editor rotate: false - xy: 821, 421 + xy: 933, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 855, 455 + xy: 967, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 889, 489 + xy: 967, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-crucible-icon-editor rotate: false - xy: 325, 241 + xy: 1913, 807 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 551, 401 + xy: 1205, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +snow-boulder-icon-editor + rotate: false + xy: 1701, 691 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 snow-icon-editor rotate: false - xy: 923, 523 + xy: 899, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-editor rotate: false - xy: 327, 141 + xy: 1751, 691 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -snowrock-icon-editor +snow-wall-icon-editor rotate: false - xy: 327, 91 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrocks-icon-editor - rotate: false - xy: 855, 421 + xy: 933, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 889, 455 + xy: 967, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 423, 337 + xy: 907, 743 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 923, 489 + xy: 1001, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 957, 523 + xy: 1001, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-editor rotate: false - xy: 1295, 889 + xy: 1457, 873 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spore-cluster-icon-editor rotate: false - xy: 1985, 829 + xy: 1851, 699 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-pine-icon-editor rotate: false - xy: 131, 1 + xy: 1801, 691 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 521, 335 + xy: 1205, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks-icon-editor +spore-wall-icon-editor rotate: false - xy: 889, 421 + xy: 1001, 311 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +steam-generator-icon-editor + rotate: false + xy: 1271, 675 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall-icon-editor + rotate: false + xy: 1001, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 521, 269 + xy: 1271, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 923, 455 + xy: 1001, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 1599, 625 + xy: 1337, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 1665, 625 + xy: 1337, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 switch-icon-editor rotate: false - xy: 957, 489 + xy: 459, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils-icon-editor rotate: false - xy: 991, 523 + xy: 493, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tetrative-reconstructor-icon-editor rotate: false - xy: 323, 729 + xy: 323, 713 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 thermal-generator-icon-editor rotate: false - xy: 1731, 625 + xy: 1403, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 423, 239 + xy: 909, 645 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 809, 693 + xy: 909, 547 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 923, 421 + xy: 459, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 1797, 625 + xy: 1403, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster-icon-editor rotate: false - xy: 1425, 889 + xy: 1587, 873 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-conveyor-icon-editor rotate: false - xy: 957, 455 + xy: 527, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 991, 489 + xy: 459, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 1863, 625 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-icon-editor - rotate: false - xy: 1929, 625 + xy: 1469, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 underflow-gate-icon-editor rotate: false - xy: 1025, 523 + xy: 493, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 957, 421 + xy: 561, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 907, 693 + xy: 1005, 775 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 229, 15 + xy: 1469, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 295, 15 + xy: 1535, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 white-tree-dead-icon-editor rotate: false - xy: 1, 697 + xy: 1, 681 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-icon-editor rotate: false - xy: 1, 375 + xy: 1, 359 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 sprites7.png -size: 2048,1024 +size: 1024,2048 format: rgba8888 filter: nearest,nearest repeat: none alpha-bg rotate: false - xy: 1, 528 + xy: 1, 1552 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 bar rotate: false - xy: 1748, 590 + xy: 525, 568 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -10312,7 +10606,7 @@ bar index: -1 bar-top rotate: false - xy: 751, 578 + xy: 525, 606 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 @@ -10320,7287 +10614,7497 @@ bar-top index: -1 block-additive-reconstructor-large rotate: false - xy: 2007, 983 + xy: 301, 170 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-additive-reconstructor-medium rotate: false - xy: 1071, 618 + xy: 729, 1378 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-additive-reconstructor-small rotate: false - xy: 781, 690 + xy: 473, 885 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-additive-reconstructor-tiny rotate: false - xy: 719, 156 + xy: 1007, 2031 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-additive-reconstructor-xlarge rotate: false - xy: 1, 478 + xy: 1, 1502 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-air-factory-large rotate: false - xy: 2007, 941 + xy: 301, 128 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-air-factory-medium rotate: false - xy: 1109, 647 + xy: 729, 1344 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-air-factory-small rotate: false - xy: 80, 2 + xy: 511, 6 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-air-factory-tiny rotate: false - xy: 301, 1 + xy: 1007, 2013 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-air-factory-xlarge rotate: false - xy: 131, 608 + xy: 131, 1632 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-alloy-smelter-large rotate: false - xy: 551, 274 + xy: 301, 86 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-alloy-smelter-medium rotate: false - xy: 1143, 647 + xy: 729, 1310 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-alloy-smelter-small rotate: false - xy: 1808, 650 + xy: 525, 411 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-alloy-smelter-tiny rotate: false - xy: 319, 1 + xy: 727, 1054 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-alloy-smelter-xlarge rotate: false - xy: 771, 928 + xy: 771, 1952 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-arc-large rotate: false - xy: 601, 324 + xy: 301, 44 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-arc-medium rotate: false - xy: 1177, 647 + xy: 729, 1276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-small rotate: false - xy: 106, 2 + xy: 525, 385 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-arc-tiny rotate: false - xy: 337, 1 + xy: 771, 1872 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-arc-xlarge rotate: false - xy: 259, 819 + xy: 259, 1843 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-armored-conveyor-large rotate: false - xy: 651, 374 + xy: 795, 1910 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-armored-conveyor-medium rotate: false - xy: 1211, 647 + xy: 729, 1242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-small rotate: false - xy: 1808, 624 + xy: 525, 359 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-armored-conveyor-tiny rotate: false - xy: 719, 364 + xy: 1005, 1939 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-armored-conveyor-xlarge rotate: false - xy: 1, 428 + xy: 1, 1452 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-basalt-large + rotate: false + xy: 795, 1868 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-basalt-medium + rotate: false + xy: 431, 848 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-basalt-small + rotate: false + xy: 525, 333 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-basalt-tiny + rotate: false + xy: 751, 1704 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-basalt-xlarge + rotate: false + xy: 51, 1502 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-battery-large rotate: false - xy: 701, 424 + xy: 301, 2 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-large rotate: false - xy: 351, 24 + xy: 821, 1957 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-medium rotate: false - xy: 1245, 647 + xy: 393, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-large-small rotate: false - xy: 1834, 650 + xy: 521, 307 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-large-tiny rotate: false - xy: 309, 698 + xy: 1005, 1585 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-battery-large-xlarge rotate: false - xy: 51, 478 + xy: 131, 1582 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-battery-medium rotate: false - xy: 1279, 647 + xy: 389, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-small rotate: false - xy: 1834, 624 + xy: 537, 6 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-tiny rotate: false - xy: 331, 598 + xy: 798, 838 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-battery-xlarge rotate: false - xy: 131, 558 + xy: 181, 1632 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-blast-drill-large rotate: false - xy: 401, 74 + xy: 863, 1957 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-drill-medium rotate: false - xy: 1313, 647 + xy: 389, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-drill-small rotate: false - xy: 1777, 587 + xy: 567, 874 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-drill-tiny rotate: false - xy: 132, 10 + xy: 1005, 1921 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-blast-drill-xlarge rotate: false - xy: 181, 608 + xy: 259, 1793 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-blast-mixer-large rotate: false - xy: 451, 124 + xy: 905, 1957 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-mixer-medium rotate: false - xy: 1347, 647 + xy: 389, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-mixer-small rotate: false - xy: 1860, 650 + xy: 567, 848 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-mixer-tiny rotate: false - xy: 745, 116 + xy: 1005, 1567 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-blast-mixer-xlarge rotate: false - xy: 259, 769 + xy: 1, 1402 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-block-forge-large rotate: false - xy: 501, 174 + xy: 947, 1957 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-forge-medium rotate: false - xy: 1381, 647 + xy: 389, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-forge-small rotate: false - xy: 1860, 624 + xy: 575, 900 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-forge-tiny rotate: false - xy: 1057, 271 + xy: 816, 838 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-block-forge-xlarge rotate: false - xy: 1, 378 + xy: 51, 1452 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-block-loader-large rotate: false - xy: 551, 232 + xy: 837, 1915 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-loader-medium rotate: false - xy: 1415, 647 + xy: 389, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-loader-small rotate: false - xy: 1731, 554 + xy: 567, 822 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-loader-tiny rotate: false - xy: 1083, 297 + xy: 1005, 1903 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-block-loader-xlarge rotate: false - xy: 51, 428 + xy: 181, 1582 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-block-unloader-large rotate: false - xy: 551, 190 + xy: 837, 1873 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-unloader-medium rotate: false - xy: 1449, 647 + xy: 389, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-unloader-small rotate: false - xy: 1808, 598 + xy: 560, 796 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-unloader-tiny rotate: false - xy: 1109, 323 + xy: 1005, 1549 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-block-unloader-xlarge rotate: false - xy: 181, 558 + xy: 259, 1743 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-boulder-large + rotate: false + xy: 879, 1915 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-boulder-medium + rotate: false + xy: 389, 581 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-boulder-small + rotate: false + xy: 601, 917 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-boulder-tiny + rotate: false + xy: 1005, 1885 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-boulder-xlarge + rotate: false + xy: 1, 1352 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-bridge-conduit-large rotate: false - xy: 751, 536 + xy: 879, 1873 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conduit-medium rotate: false - xy: 1483, 647 + xy: 389, 547 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conduit-small rotate: false - xy: 1834, 598 + xy: 627, 917 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conduit-tiny rotate: false - xy: 309, 680 + xy: 1005, 1531 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-bridge-conduit-xlarge rotate: false - xy: 259, 719 + xy: 51, 1402 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-bridge-conveyor-large rotate: false - xy: 751, 494 + xy: 921, 1915 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conveyor-medium rotate: false - xy: 1517, 647 + xy: 389, 513 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conveyor-small rotate: false - xy: 1860, 598 + xy: 601, 891 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conveyor-tiny rotate: false - xy: 331, 580 + xy: 1005, 1513 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-bridge-conveyor-xlarge rotate: false - xy: 1, 328 + xy: 259, 1693 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-char-large rotate: false - xy: 793, 536 + xy: 921, 1873 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-char-medium rotate: false - xy: 1551, 647 + xy: 389, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-char-small rotate: false - xy: 435, 6 + xy: 627, 891 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-char-tiny rotate: false - xy: 1057, 253 + xy: 1005, 1495 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-char-xlarge rotate: false - xy: 51, 378 + xy: 1, 1302 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cliff-large rotate: false - xy: 793, 494 + xy: 963, 1915 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cliff-medium rotate: false - xy: 1585, 647 + xy: 389, 445 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliff-small rotate: false - xy: 461, 6 + xy: 653, 900 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cliff-tiny rotate: false - xy: 1127, 323 + xy: 1005, 1477 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cliff-xlarge rotate: false - xy: 259, 669 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cliffs-large - rotate: false - xy: 835, 536 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cliffs-medium - rotate: false - xy: 1619, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-small - rotate: false - xy: 487, 14 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliffs-tiny - rotate: false - xy: 1057, 235 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cliffs-xlarge - rotate: false - xy: 1, 278 + xy: 51, 1352 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-coal-centrifuge-large rotate: false - xy: 835, 494 + xy: 963, 1873 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-coal-centrifuge-medium rotate: false - xy: 1653, 647 + xy: 389, 411 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-coal-centrifuge-small rotate: false - xy: 1803, 572 + xy: 593, 865 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-coal-centrifuge-tiny rotate: false - xy: 1145, 323 + xy: 547, 310 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-coal-centrifuge-xlarge rotate: false - xy: 51, 328 + xy: 1, 1252 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-combustion-generator-large rotate: false - xy: 751, 452 + xy: 309, 1848 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-combustion-generator-medium rotate: false - xy: 1105, 613 + xy: 389, 377 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-combustion-generator-small rotate: false - xy: 1829, 572 + xy: 593, 839 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-combustion-generator-tiny rotate: false - xy: 1057, 217 + xy: 939, 904 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-combustion-generator-xlarge rotate: false - xy: 1, 228 + xy: 51, 1302 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-command-center-large + rotate: false + xy: 351, 1848 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-command-center-medium + rotate: false + xy: 427, 814 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-command-center-small + rotate: false + xy: 619, 865 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-command-center-tiny + rotate: false + xy: 939, 886 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-command-center-xlarge + rotate: false + xy: 1, 1202 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-conduit-large rotate: false - xy: 793, 452 + xy: 309, 1806 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conduit-medium rotate: false - xy: 1139, 613 + xy: 423, 780 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conduit-small rotate: false - xy: 1855, 572 + xy: 619, 839 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conduit-tiny rotate: false - xy: 1163, 323 + xy: 939, 868 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-conduit-xlarge rotate: false - xy: 51, 278 + xy: 51, 1252 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-container-large rotate: false - xy: 835, 452 + xy: 351, 1806 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-container-medium rotate: false - xy: 1173, 613 + xy: 423, 746 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-container-small rotate: false - xy: 1881, 572 + xy: 593, 813 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-container-tiny rotate: false - xy: 1057, 199 + xy: 835, 848 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-container-xlarge rotate: false - xy: 1, 178 + xy: 1, 1152 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-conveyor-large rotate: false - xy: 743, 410 + xy: 393, 1848 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conveyor-medium rotate: false - xy: 1207, 613 + xy: 423, 712 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conveyor-small rotate: false - xy: 1859, 768 + xy: 619, 813 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conveyor-tiny rotate: false - xy: 1181, 323 + xy: 1005, 1459 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-conveyor-xlarge rotate: false - xy: 51, 228 + xy: 51, 1202 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-copper-wall-large rotate: false - xy: 785, 410 + xy: 309, 1764 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-large rotate: false - xy: 827, 410 + xy: 351, 1764 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-medium rotate: false - xy: 1241, 613 + xy: 423, 678 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-large-small rotate: false - xy: 1885, 768 + xy: 679, 900 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-large-tiny rotate: false - xy: 1057, 181 + xy: 1004, 1441 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-copper-wall-large-xlarge rotate: false - xy: 1, 128 + xy: 1, 1102 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-copper-wall-medium rotate: false - xy: 1275, 613 + xy: 423, 644 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-small rotate: false - xy: 1911, 768 + xy: 586, 787 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-tiny rotate: false - xy: 1199, 323 + xy: 1004, 1423 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-copper-wall-xlarge rotate: false - xy: 51, 178 + xy: 51, 1152 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-foundation-large rotate: false - xy: 701, 382 + xy: 393, 1806 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-foundation-medium rotate: false - xy: 1309, 613 + xy: 423, 610 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-foundation-small rotate: false - xy: 1937, 768 + xy: 612, 787 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-foundation-tiny rotate: false - xy: 1217, 323 + xy: 1004, 1405 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-foundation-xlarge rotate: false - xy: 1, 78 + xy: 1, 1052 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-nucleus-large rotate: false - xy: 743, 368 + xy: 435, 1848 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-nucleus-medium rotate: false - xy: 1343, 613 + xy: 423, 576 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-nucleus-small rotate: false - xy: 1963, 768 + xy: 560, 770 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-nucleus-tiny rotate: false - xy: 1235, 323 + xy: 550, 292 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-nucleus-xlarge rotate: false - xy: 51, 128 + xy: 51, 1102 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-shard-large rotate: false - xy: 785, 368 + xy: 309, 1722 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-shard-medium rotate: false - xy: 1377, 613 + xy: 423, 542 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-shard-small rotate: false - xy: 1989, 768 + xy: 556, 744 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-shard-tiny rotate: false - xy: 1253, 323 + xy: 550, 274 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-shard-xlarge rotate: false - xy: 1, 28 + xy: 1, 1002 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-craters-large rotate: false - xy: 827, 368 + xy: 351, 1722 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-craters-medium rotate: false - xy: 1411, 613 + xy: 423, 508 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-craters-small rotate: false - xy: 2015, 779 + xy: 556, 718 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-craters-tiny rotate: false - xy: 1271, 323 + xy: 550, 256 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-craters-xlarge rotate: false - xy: 51, 78 + xy: 51, 1052 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cryofluidmixer-large rotate: false - xy: 593, 274 + xy: 393, 1764 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cryofluidmixer-medium rotate: false - xy: 1445, 613 + xy: 423, 474 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cryofluidmixer-small rotate: false - xy: 2015, 753 + xy: 586, 761 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cryofluidmixer-tiny rotate: false - xy: 1289, 323 + xy: 550, 238 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cryofluidmixer-xlarge rotate: false - xy: 51, 28 + xy: 1, 952 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cultivator-large rotate: false - xy: 593, 232 + xy: 435, 1806 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cultivator-medium rotate: false - xy: 1479, 613 + xy: 423, 440 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cultivator-small rotate: false - xy: 1877, 684 + xy: 612, 761 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cultivator-tiny rotate: false - xy: 1307, 323 + xy: 550, 220 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cultivator-xlarge rotate: false - xy: 857, 975 + xy: 51, 1002 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cyclone-large rotate: false - xy: 593, 190 + xy: 477, 1848 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cyclone-medium rotate: false - xy: 1513, 613 + xy: 423, 406 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cyclone-small rotate: false - xy: 1886, 658 + xy: 582, 735 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cyclone-tiny rotate: false - xy: 1325, 323 + xy: 550, 202 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cyclone-xlarge rotate: false - xy: 907, 975 + xy: 1, 902 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dacite-boulder-large + rotate: false + xy: 393, 1722 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dacite-boulder-medium + rotate: false + xy: 423, 372 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-boulder-small + rotate: false + xy: 608, 735 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dacite-boulder-tiny + rotate: false + xy: 548, 184 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dacite-boulder-xlarge + rotate: false + xy: 51, 952 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dacite-large + rotate: false + xy: 435, 1764 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dacite-medium + rotate: false + xy: 561, 1036 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-small + rotate: false + xy: 582, 709 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dacite-tiny + rotate: false + xy: 548, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dacite-wall-large + rotate: false + xy: 477, 1806 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dacite-wall-medium + rotate: false + xy: 729, 1208 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-wall-small + rotate: false + xy: 608, 709 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dacite-wall-tiny + rotate: false + xy: 547, 148 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dacite-wall-xlarge + rotate: false + xy: 1, 852 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dacite-xlarge + rotate: false + xy: 51, 902 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-metal-large rotate: false - xy: 643, 324 + xy: 519, 1848 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-metal-medium rotate: false - xy: 1547, 613 + xy: 603, 1079 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-metal-small rotate: false - xy: 1886, 632 + xy: 556, 692 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-metal-tiny rotate: false - xy: 1343, 323 + xy: 547, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-metal-xlarge rotate: false - xy: 957, 975 + xy: 1, 802 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-1-large rotate: false - xy: 635, 282 + xy: 435, 1722 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-1-medium rotate: false - xy: 1581, 613 + xy: 687, 1164 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-1-small rotate: false - xy: 1886, 606 + xy: 555, 666 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-1-tiny rotate: false - xy: 1361, 323 + xy: 547, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-1-xlarge rotate: false - xy: 1007, 975 + xy: 51, 852 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-2-large rotate: false - xy: 635, 240 + xy: 477, 1764 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-2-medium rotate: false - xy: 1615, 613 + xy: 751, 1666 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-2-small rotate: false - xy: 1881, 742 + xy: 555, 640 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-2-tiny rotate: false - xy: 1379, 323 + xy: 547, 94 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-2-xlarge rotate: false - xy: 1057, 975 + xy: 1, 752 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-3-large rotate: false - xy: 635, 198 + xy: 519, 1806 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-3-medium rotate: false - xy: 1649, 613 + xy: 751, 1632 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-3-small rotate: false - xy: 1881, 716 + xy: 554, 614 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-3-tiny rotate: false - xy: 1397, 323 + xy: 547, 76 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-3-xlarge rotate: false - xy: 1107, 975 + xy: 51, 802 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-4-large rotate: false - xy: 393, 24 + xy: 561, 1848 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-4-medium rotate: false - xy: 1071, 584 + xy: 785, 1666 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-4-small rotate: false - xy: 1907, 742 + xy: 554, 588 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-4-tiny rotate: false - xy: 1415, 323 + xy: 547, 58 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-4-xlarge rotate: false - xy: 1157, 975 + xy: 1, 702 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-5-large rotate: false - xy: 443, 74 + xy: 477, 1722 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-5-medium rotate: false - xy: 1105, 579 + xy: 751, 1598 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-5-small rotate: false - xy: 1933, 742 + xy: 554, 562 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-5-tiny rotate: false - xy: 1433, 323 + xy: 547, 40 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-5-xlarge rotate: false - xy: 1207, 975 + xy: 51, 752 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-6-large rotate: false - xy: 435, 32 + xy: 519, 1764 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-6-medium rotate: false - xy: 1139, 579 + xy: 785, 1632 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-6-small rotate: false - xy: 1907, 716 + xy: 554, 536 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-6-tiny rotate: false - xy: 1451, 323 + xy: 834, 830 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-6-xlarge rotate: false - xy: 1257, 975 + xy: 1, 652 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-darksand-large rotate: false - xy: 493, 124 + xy: 561, 1806 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-medium rotate: false - xy: 1173, 579 + xy: 819, 1666 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-small rotate: false - xy: 1959, 742 + xy: 554, 510 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-large rotate: false - xy: 485, 82 + xy: 603, 1848 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-tainted-water-medium rotate: false - xy: 1207, 579 + xy: 785, 1598 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-tainted-water-small rotate: false - xy: 1933, 716 + xy: 554, 484 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-tiny rotate: false - xy: 1469, 323 + xy: 853, 848 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-tainted-water-xlarge rotate: false - xy: 1307, 975 + xy: 51, 702 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-darksand-tiny rotate: false - xy: 1487, 323 + xy: 852, 830 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-water-large rotate: false - xy: 543, 148 + xy: 519, 1722 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-water-medium rotate: false - xy: 1241, 579 + xy: 819, 1632 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-water-small rotate: false - xy: 1985, 742 + xy: 582, 683 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-water-tiny rotate: false - xy: 1505, 323 + xy: 871, 852 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-water-xlarge rotate: false - xy: 1357, 975 + xy: 1, 602 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-darksand-xlarge rotate: false - xy: 1407, 975 + xy: 51, 652 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-deepwater-large rotate: false - xy: 585, 148 + xy: 561, 1764 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-deepwater-medium rotate: false - xy: 1275, 579 + xy: 819, 1598 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-deepwater-small rotate: false - xy: 1959, 716 + xy: 608, 683 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-deepwater-tiny rotate: false - xy: 1523, 323 + xy: 889, 857 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-deepwater-xlarge rotate: false - xy: 1457, 975 + xy: 1, 552 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-differential-generator-large rotate: false - xy: 535, 106 + xy: 603, 1806 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-differential-generator-medium rotate: false - xy: 1309, 579 + xy: 767, 1564 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-differential-generator-small rotate: false - xy: 1985, 716 + xy: 581, 657 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-differential-generator-tiny rotate: false - xy: 1541, 323 + xy: 798, 820 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-differential-generator-xlarge rotate: false - xy: 1507, 975 + xy: 51, 602 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-diode-large rotate: false - xy: 577, 106 + xy: 645, 1848 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-diode-medium rotate: false - xy: 1343, 579 + xy: 767, 1530 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-diode-small rotate: false - xy: 2011, 727 + xy: 607, 657 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-diode-tiny rotate: false - xy: 1559, 323 + xy: 816, 820 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-diode-xlarge rotate: false - xy: 1557, 975 + xy: 1, 502 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dirt-large + rotate: false + xy: 561, 1722 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dirt-medium + rotate: false + xy: 801, 1564 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-small + rotate: false + xy: 581, 631 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dirt-tiny + rotate: false + xy: 797, 802 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dirt-wall-large + rotate: false + xy: 603, 1764 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dirt-wall-medium + rotate: false + xy: 767, 1496 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-small + rotate: false + xy: 607, 631 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dirt-wall-tiny + rotate: false + xy: 815, 802 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dirt-wall-xlarge + rotate: false + xy: 51, 552 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dirt-xlarge + rotate: false + xy: 1, 452 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-disassembler-large rotate: false - xy: 527, 64 + xy: 645, 1806 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-disassembler-medium rotate: false - xy: 1377, 579 + xy: 766, 1462 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-disassembler-small rotate: false - xy: 1903, 690 + xy: 580, 605 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-disassembler-tiny rotate: false - xy: 1577, 323 + xy: 834, 812 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-disassembler-xlarge rotate: false - xy: 1607, 975 + xy: 51, 502 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-distributor-large rotate: false - xy: 569, 64 + xy: 687, 1848 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-distributor-medium rotate: false - xy: 1411, 579 + xy: 801, 1530 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-distributor-small rotate: false - xy: 1929, 690 + xy: 580, 579 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-distributor-tiny rotate: false - xy: 1595, 323 + xy: 852, 812 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-distributor-xlarge rotate: false - xy: 1657, 975 + xy: 1, 402 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-door-large rotate: false - xy: 485, 40 + xy: 603, 1722 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-large rotate: false - xy: 527, 22 + xy: 645, 1764 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-medium rotate: false - xy: 1445, 579 + xy: 801, 1496 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-large-small rotate: false - xy: 1955, 690 + xy: 606, 605 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-large-tiny rotate: false - xy: 1613, 323 + xy: 833, 794 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-door-large-xlarge rotate: false - xy: 1707, 975 + xy: 51, 452 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-door-medium rotate: false - xy: 1479, 579 + xy: 800, 1462 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-small rotate: false - xy: 1981, 690 + xy: 580, 553 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-tiny rotate: false - xy: 1631, 323 + xy: 851, 794 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-door-xlarge rotate: false - xy: 1757, 975 + xy: 1, 352 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dunerocks-large +block-dune-wall-large rotate: false - xy: 569, 22 + xy: 687, 1806 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dunerocks-medium +block-dune-wall-medium rotate: false - xy: 1513, 579 + xy: 835, 1564 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dunerocks-small +block-dune-wall-small rotate: false - xy: 1912, 664 + xy: 606, 579 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dunerocks-tiny +block-dune-wall-tiny rotate: false - xy: 1649, 323 + xy: 907, 852 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dunerocks-xlarge +block-dune-wall-xlarge rotate: false - xy: 1807, 975 + xy: 51, 402 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-duo-large rotate: false - xy: 869, 410 + xy: 729, 1848 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-duo-medium rotate: false - xy: 1547, 579 + xy: 835, 1530 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-small rotate: false - xy: 1912, 638 + xy: 580, 527 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-duo-tiny rotate: false - xy: 1667, 323 + xy: 889, 839 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-duo-xlarge rotate: false - xy: 1857, 975 + xy: 1, 302 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-exponential-reconstructor-large rotate: false - xy: 869, 368 + xy: 645, 1722 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-exponential-reconstructor-medium rotate: false - xy: 1581, 579 + xy: 835, 1496 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-exponential-reconstructor-small rotate: false - xy: 1938, 664 + xy: 606, 553 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-exponential-reconstructor-tiny rotate: false - xy: 1685, 323 + xy: 871, 834 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-exponential-reconstructor-xlarge rotate: false - xy: 1907, 975 + xy: 51, 352 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-force-projector-large rotate: false - xy: 677, 282 + xy: 687, 1764 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-force-projector-medium rotate: false - xy: 1615, 579 + xy: 834, 1462 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-force-projector-small rotate: false - xy: 1912, 612 + xy: 580, 501 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-force-projector-tiny rotate: false - xy: 1703, 323 + xy: 870, 816 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-force-projector-xlarge rotate: false - xy: 1957, 975 + xy: 1, 252 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-fuse-large rotate: false - xy: 677, 240 + xy: 729, 1806 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-fuse-medium rotate: false - xy: 1649, 579 + xy: 389, 343 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-fuse-small rotate: false - xy: 1938, 638 + xy: 606, 527 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-fuse-tiny rotate: false - xy: 1721, 323 + xy: 907, 834 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-fuse-xlarge rotate: false - xy: 345, 866 + xy: 51, 302 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-graphite-press-large rotate: false - xy: 677, 198 + xy: 687, 1722 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-graphite-press-medium rotate: false - xy: 1979, 899 + xy: 423, 338 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-graphite-press-small rotate: false - xy: 1964, 664 + xy: 606, 501 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-graphite-press-tiny rotate: false - xy: 1739, 323 + xy: 889, 821 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-graphite-press-xlarge rotate: false - xy: 395, 866 + xy: 1, 202 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-grass-large rotate: false - xy: 635, 156 + xy: 729, 1764 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-grass-medium rotate: false - xy: 2013, 907 + xy: 477, 945 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-grass-small rotate: false - xy: 1938, 612 + xy: 580, 475 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-grass-tiny rotate: false - xy: 1057, 163 + xy: 907, 816 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-grass-xlarge rotate: false - xy: 445, 866 + xy: 51, 252 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ground-factory-large rotate: false - xy: 677, 156 + xy: 729, 1722 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ground-factory-medium rotate: false - xy: 1981, 865 + xy: 473, 911 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ground-factory-small rotate: false - xy: 1964, 638 + xy: 606, 475 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ground-factory-tiny rotate: false - xy: 355, 6 + xy: 1004, 1387 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ground-factory-xlarge rotate: false - xy: 495, 866 + xy: 1, 152 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-hail-large rotate: false - xy: 619, 106 + xy: 771, 1826 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-hail-medium rotate: false - xy: 2015, 873 + xy: 519, 987 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hail-small rotate: false - xy: 1964, 612 + xy: 554, 458 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-hail-tiny rotate: false - xy: 373, 6 + xy: 738, 726 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-hail-xlarge rotate: false - xy: 545, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-holostone-large - rotate: false - xy: 611, 64 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-holostone-medium - rotate: false - xy: 2015, 839 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-small - rotate: false - xy: 1990, 664 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-holostone-tiny - rotate: false - xy: 391, 6 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-holostone-xlarge - rotate: false - xy: 595, 866 + xy: 51, 202 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-hotrock-large rotate: false - xy: 611, 22 + xy: 771, 1784 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-hotrock-medium rotate: false - xy: 1981, 831 + xy: 645, 1121 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hotrock-small rotate: false - xy: 1990, 638 + xy: 553, 432 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-hotrock-tiny rotate: false - xy: 409, 6 + xy: 738, 708 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-hotrock-xlarge rotate: false - xy: 645, 866 + xy: 1, 102 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-hyper-processor-large + rotate: false + xy: 771, 1742 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-hyper-processor-medium + rotate: false + xy: 557, 1002 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hyper-processor-small + rotate: false + xy: 551, 406 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-hyper-processor-tiny + rotate: false + xy: 738, 690 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-hyper-processor-xlarge + rotate: false + xy: 51, 152 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ice-large rotate: false - xy: 661, 114 + xy: 813, 1826 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ice-medium rotate: false - xy: 2015, 805 + xy: 553, 968 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-small rotate: false - xy: 1990, 612 + xy: 551, 380 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ice-snow-large rotate: false - xy: 703, 114 + xy: 813, 1784 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ice-snow-medium rotate: false - xy: 881, 560 + xy: 766, 1428 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-snow-small rotate: false - xy: 2007, 690 + xy: 551, 354 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ice-snow-tiny rotate: false - xy: 1851, 750 + xy: 738, 672 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ice-snow-xlarge rotate: false - xy: 695, 866 + xy: 1, 52 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ice-tiny rotate: false - xy: 1757, 572 + xy: 738, 654 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +block-ice-wall-large + rotate: false + xy: 813, 1742 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-wall-medium + rotate: false + xy: 800, 1428 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-wall-small + rotate: false + xy: 551, 328 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-wall-tiny + rotate: false + xy: 737, 636 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-wall-xlarge + rotate: false + xy: 51, 102 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 block-ice-xlarge rotate: false - xy: 101, 478 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-icerocks-large - rotate: false - xy: 653, 64 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-icerocks-medium - rotate: false - xy: 915, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-icerocks-small - rotate: false - xy: 2016, 664 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-icerocks-tiny - rotate: false - xy: 1757, 554 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-icerocks-xlarge - rotate: false - xy: 101, 428 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ignarock-large - rotate: false - xy: 653, 22 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ignarock-medium - rotate: false - xy: 949, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-small - rotate: false - xy: 2016, 638 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ignarock-tiny - rotate: false - xy: 1775, 569 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ignarock-xlarge - rotate: false - xy: 101, 378 + xy: 1, 2 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-illuminator-large rotate: false - xy: 695, 72 + xy: 855, 1831 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-illuminator-medium rotate: false - xy: 983, 560 + xy: 834, 1428 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-illuminator-small rotate: false - xy: 2016, 612 + xy: 580, 449 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-illuminator-tiny rotate: false - xy: 1775, 551 + xy: 737, 618 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-illuminator-xlarge rotate: false - xy: 101, 328 + xy: 51, 52 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-impact-reactor-large rotate: false - xy: 695, 30 + xy: 855, 1789 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-impact-reactor-medium rotate: false - xy: 1017, 560 + xy: 764, 1394 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-impact-reactor-small rotate: false - xy: 1912, 586 + xy: 606, 449 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-impact-reactor-tiny rotate: false - xy: 1075, 271 + xy: 913, 1086 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-impact-reactor-xlarge rotate: false - xy: 101, 278 + xy: 51, 2 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-incinerator-large rotate: false - xy: 737, 72 + xy: 897, 1831 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-incinerator-medium rotate: false - xy: 877, 526 + xy: 798, 1394 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-incinerator-small rotate: false - xy: 1938, 586 + xy: 579, 423 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-incinerator-tiny rotate: false - xy: 1075, 253 + xy: 913, 1068 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-incinerator-xlarge rotate: false - xy: 101, 228 + xy: 857, 1999 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-inverted-sorter-large rotate: false - xy: 737, 30 + xy: 855, 1747 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-inverted-sorter-medium rotate: false - xy: 911, 526 + xy: 832, 1394 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-inverted-sorter-small rotate: false - xy: 1964, 586 + xy: 605, 423 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-inverted-sorter-tiny rotate: false - xy: 1075, 235 + xy: 909, 1050 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-inverted-sorter-xlarge rotate: false - xy: 101, 178 + xy: 907, 1999 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-item-source-large rotate: false - xy: 821, 933 + xy: 897, 1789 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-item-source-medium rotate: false - xy: 877, 492 + xy: 763, 1360 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-source-small rotate: false - xy: 1990, 586 + xy: 577, 397 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-item-source-tiny rotate: false - xy: 1075, 217 + xy: 909, 1032 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-item-source-xlarge rotate: false - xy: 101, 128 + xy: 957, 1999 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-item-void-large rotate: false - xy: 863, 933 + xy: 939, 1831 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-item-void-medium rotate: false - xy: 911, 492 + xy: 763, 1326 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-void-small rotate: false - xy: 2016, 586 + xy: 577, 371 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-item-void-tiny rotate: false - xy: 1075, 199 + xy: 909, 1014 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-item-void-xlarge rotate: false - xy: 101, 78 + xy: 345, 1890 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-junction-large rotate: false - xy: 905, 933 + xy: 897, 1747 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-junction-medium rotate: false - xy: 945, 526 + xy: 797, 1360 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-junction-small rotate: false - xy: 1907, 560 + xy: 603, 397 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-junction-tiny rotate: false - xy: 1075, 181 + xy: 949, 930 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-junction-xlarge rotate: false - xy: 101, 28 + xy: 395, 1890 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-kiln-large rotate: false - xy: 947, 933 + xy: 939, 1789 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-kiln-medium rotate: false - xy: 877, 458 + xy: 763, 1292 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-kiln-small rotate: false - xy: 1933, 560 + xy: 577, 345 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-kiln-tiny rotate: false - xy: 1075, 163 + xy: 925, 850 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-kiln-xlarge rotate: false - xy: 231, 608 + xy: 445, 1890 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-lancer-large rotate: false - xy: 989, 933 + xy: 939, 1747 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-lancer-medium rotate: false - xy: 911, 458 + xy: 797, 1326 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-lancer-small rotate: false - xy: 1959, 560 + xy: 603, 371 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-lancer-tiny rotate: false - xy: 1101, 297 + xy: 925, 832 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-lancer-xlarge rotate: false - xy: 231, 558 + xy: 495, 1890 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-large-logic-display-large + rotate: false + xy: 981, 1831 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-large-logic-display-medium + rotate: false + xy: 831, 1360 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-large-logic-display-small + rotate: false + xy: 603, 345 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-large-logic-display-tiny + rotate: false + xy: 925, 814 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-large-logic-display-xlarge + rotate: false + xy: 545, 1890 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-laser-drill-large rotate: false - xy: 1031, 933 + xy: 981, 1789 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-laser-drill-medium rotate: false - xy: 945, 492 + xy: 763, 1258 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-laser-drill-small rotate: false - xy: 1985, 560 + xy: 577, 319 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-laser-drill-tiny rotate: false - xy: 1093, 279 + xy: 943, 850 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-laser-drill-xlarge rotate: false - xy: 745, 866 + xy: 595, 1890 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-launch-pad-large rotate: false - xy: 1073, 933 + xy: 981, 1747 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-launch-pad-large-large rotate: false - xy: 1115, 933 + xy: 771, 1700 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-launch-pad-large-medium rotate: false - xy: 979, 526 + xy: 797, 1292 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-launch-pad-large-small rotate: false - xy: 2011, 560 + xy: 603, 319 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-launch-pad-large-tiny rotate: false - xy: 1093, 261 + xy: 943, 832 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-launch-pad-large-xlarge rotate: false - xy: 151, 508 + xy: 645, 1890 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-launch-pad-medium rotate: false - xy: 945, 458 + xy: 831, 1326 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-launch-pad-small rotate: false - xy: 693, 356 + xy: 653, 874 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-launch-pad-tiny rotate: false - xy: 1093, 243 + xy: 943, 814 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-launch-pad-xlarge rotate: false - xy: 151, 458 + xy: 695, 1890 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-junction-large rotate: false - xy: 1157, 933 + xy: 813, 1700 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-junction-medium rotate: false - xy: 979, 492 + xy: 763, 1224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-junction-small rotate: false - xy: 685, 330 + xy: 679, 874 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-junction-tiny rotate: false - xy: 1093, 225 + xy: 888, 803 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-junction-xlarge rotate: false - xy: 201, 508 + xy: 101, 1502 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-router-large rotate: false - xy: 1199, 933 + xy: 855, 1705 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-router-medium rotate: false - xy: 1013, 526 + xy: 797, 1258 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-router-small rotate: false - xy: 711, 330 + xy: 645, 848 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-router-tiny rotate: false - xy: 1093, 207 + xy: 870, 798 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-router-xlarge rotate: false - xy: 151, 408 + xy: 101, 1452 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-source-large rotate: false - xy: 1241, 933 + xy: 897, 1705 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-source-medium rotate: false - xy: 979, 458 + xy: 831, 1292 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-source-small rotate: false - xy: 719, 304 + xy: 645, 822 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-source-tiny rotate: false - xy: 1093, 189 + xy: 906, 798 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-source-xlarge rotate: false - xy: 201, 458 + xy: 101, 1402 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-tank-large rotate: false - xy: 1283, 933 + xy: 939, 1705 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-tank-medium rotate: false - xy: 1013, 492 + xy: 797, 1224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-tank-small rotate: false - xy: 719, 278 + xy: 671, 848 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-tank-tiny rotate: false - xy: 1093, 171 + xy: 924, 796 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-tank-xlarge rotate: false - xy: 151, 358 + xy: 101, 1352 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-void-large rotate: false - xy: 1325, 933 + xy: 981, 1705 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-void-medium rotate: false - xy: 1013, 458 + xy: 831, 1258 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-void-small rotate: false - xy: 719, 252 + xy: 671, 822 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-void-tiny rotate: false - xy: 1119, 305 + xy: 942, 796 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-void-xlarge rotate: false - xy: 201, 408 + xy: 101, 1302 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-logic-display-large rotate: false - xy: 1367, 933 + xy: 331, 1680 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-logic-display-medium rotate: false - xy: 911, 424 + xy: 831, 1224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-logic-display-small rotate: false - xy: 719, 226 + xy: 645, 796 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-logic-display-tiny rotate: false - xy: 1137, 305 + xy: 888, 785 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-logic-display-xlarge rotate: false - xy: 151, 308 + xy: 101, 1252 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-logic-processor-large rotate: false - xy: 1409, 933 + xy: 331, 1638 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-logic-processor-medium rotate: false - xy: 911, 390 + xy: 763, 1190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-logic-processor-small rotate: false - xy: 719, 200 + xy: 671, 796 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-logic-processor-tiny rotate: false - xy: 1155, 305 + xy: 906, 780 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-logic-processor-xlarge rotate: false - xy: 201, 358 + xy: 101, 1202 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-magmarock-large rotate: false - xy: 1451, 933 + xy: 373, 1680 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-magmarock-medium rotate: false - xy: 945, 424 + xy: 797, 1190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-magmarock-small rotate: false - xy: 719, 174 + xy: 638, 770 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-magmarock-tiny rotate: false - xy: 1173, 305 + xy: 924, 778 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-magmarock-xlarge rotate: false - xy: 151, 258 + xy: 101, 1152 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mass-driver-large rotate: false - xy: 1493, 933 + xy: 331, 1596 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mass-driver-medium rotate: false - xy: 945, 390 + xy: 831, 1190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mass-driver-small rotate: false - xy: 737, 342 + xy: 664, 770 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mass-driver-tiny rotate: false - xy: 1191, 305 + xy: 942, 778 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mass-driver-xlarge rotate: false - xy: 201, 308 + xy: 101, 1102 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mechanical-drill-large rotate: false - xy: 1535, 933 + xy: 373, 1638 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mechanical-drill-medium rotate: false - xy: 979, 424 + xy: 465, 848 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mechanical-drill-small rotate: false - xy: 763, 342 + xy: 638, 744 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mechanical-drill-tiny rotate: false - xy: 1209, 305 + xy: 737, 600 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mechanical-drill-xlarge rotate: false - xy: 151, 208 + xy: 101, 1052 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mechanical-pump-large rotate: false - xy: 1577, 933 + xy: 415, 1680 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mechanical-pump-medium rotate: false - xy: 979, 390 + xy: 461, 814 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mechanical-pump-small rotate: false - xy: 789, 342 + xy: 664, 744 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mechanical-pump-tiny rotate: false - xy: 1227, 305 + xy: 736, 582 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mechanical-pump-xlarge rotate: false - xy: 201, 258 + xy: 101, 1002 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-meltdown-large rotate: false - xy: 1619, 933 + xy: 373, 1596 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-meltdown-medium rotate: false - xy: 1013, 424 + xy: 457, 780 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-meltdown-small rotate: false - xy: 815, 342 + xy: 634, 718 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-meltdown-tiny rotate: false - xy: 1245, 305 + xy: 736, 564 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-meltdown-xlarge rotate: false - xy: 151, 158 + xy: 101, 952 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-melter-large rotate: false - xy: 1661, 933 + xy: 415, 1638 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-melter-medium rotate: false - xy: 1013, 390 + xy: 457, 746 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-melter-small rotate: false - xy: 841, 342 + xy: 634, 692 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-melter-tiny rotate: false - xy: 1263, 305 + xy: 736, 546 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-melter-xlarge rotate: false - xy: 201, 208 + xy: 101, 902 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-memory-cell-large rotate: false - xy: 1703, 933 + xy: 457, 1680 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-memory-cell-medium rotate: false - xy: 911, 356 + xy: 457, 712 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-memory-cell-small rotate: false - xy: 867, 342 + xy: 660, 718 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-memory-cell-tiny rotate: false - xy: 1281, 305 + xy: 736, 528 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-memory-cell-xlarge rotate: false - xy: 151, 108 + xy: 101, 852 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mend-projector-large rotate: false - xy: 1745, 933 + xy: 415, 1596 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mend-projector-medium rotate: false - xy: 945, 356 + xy: 457, 678 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mend-projector-small rotate: false - xy: 745, 316 + xy: 660, 692 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mend-projector-tiny rotate: false - xy: 1299, 305 + xy: 736, 510 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mend-projector-xlarge rotate: false - xy: 201, 158 + xy: 101, 802 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mender-large rotate: false - xy: 1787, 933 + xy: 457, 1638 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mender-medium rotate: false - xy: 979, 356 + xy: 457, 644 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mender-small rotate: false - xy: 745, 290 + xy: 634, 666 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mender-tiny rotate: false - xy: 1317, 305 + xy: 736, 492 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mender-xlarge rotate: false - xy: 151, 58 + xy: 101, 752 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-message-large rotate: false - xy: 1829, 933 + xy: 499, 1680 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-message-medium rotate: false - xy: 1013, 356 + xy: 457, 610 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-message-small rotate: false - xy: 771, 316 + xy: 660, 666 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-message-tiny rotate: false - xy: 1335, 305 + xy: 736, 474 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-message-xlarge rotate: false - xy: 201, 108 + xy: 101, 702 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-2-large rotate: false - xy: 1871, 933 + xy: 457, 1596 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-2-medium rotate: false - xy: 1783, 744 + xy: 457, 576 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-2-small rotate: false - xy: 745, 264 + xy: 633, 640 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-2-tiny rotate: false - xy: 1353, 305 + xy: 736, 456 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-2-xlarge rotate: false - xy: 201, 58 + xy: 101, 652 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-3-large rotate: false - xy: 1913, 933 + xy: 499, 1638 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-3-medium rotate: false - xy: 1741, 702 + xy: 457, 542 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-3-small rotate: false - xy: 797, 316 + xy: 659, 640 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-3-tiny rotate: false - xy: 1371, 305 + xy: 736, 438 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-3-xlarge rotate: false - xy: 251, 508 + xy: 101, 602 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-5-large rotate: false - xy: 1955, 933 + xy: 541, 1680 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-5-medium rotate: false - xy: 1699, 660 + xy: 457, 508 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-5-small rotate: false - xy: 771, 290 + xy: 633, 614 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-5-tiny rotate: false - xy: 1389, 305 + xy: 736, 420 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-5-xlarge rotate: false - xy: 251, 458 + xy: 101, 552 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-damaged-large rotate: false - xy: 845, 891 + xy: 499, 1596 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-damaged-medium rotate: false - xy: 1867, 828 + xy: 457, 474 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-damaged-small rotate: false - xy: 745, 238 + xy: 659, 614 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-damaged-tiny rotate: false - xy: 1407, 305 + xy: 735, 402 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-damaged-xlarge rotate: false - xy: 251, 408 + xy: 101, 502 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-large rotate: false - xy: 887, 891 + xy: 541, 1638 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-medium rotate: false - xy: 1901, 828 + xy: 457, 440 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-small rotate: false - xy: 823, 316 + xy: 632, 588 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-tiny rotate: false - xy: 1425, 305 + xy: 733, 384 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-xlarge rotate: false - xy: 251, 358 + xy: 101, 452 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-micro-processor-large rotate: false - xy: 929, 891 + xy: 583, 1680 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-micro-processor-medium rotate: false - xy: 1935, 828 + xy: 457, 406 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-micro-processor-small rotate: false - xy: 797, 290 + xy: 632, 562 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-micro-processor-tiny rotate: false - xy: 1443, 305 + xy: 733, 366 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-micro-processor-xlarge rotate: false - xy: 251, 308 + xy: 101, 402 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-moss-large rotate: false - xy: 971, 891 + xy: 541, 1596 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-moss-medium rotate: false - xy: 1825, 786 + xy: 457, 372 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-moss-small rotate: false - xy: 771, 264 + xy: 658, 588 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-moss-tiny rotate: false - xy: 1461, 305 + xy: 733, 348 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-moss-xlarge rotate: false - xy: 251, 258 + xy: 101, 352 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-multi-press-large rotate: false - xy: 1013, 891 + xy: 583, 1638 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-multi-press-medium rotate: false - xy: 1683, 613 + xy: 457, 338 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-multi-press-small rotate: false - xy: 745, 212 + xy: 632, 536 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-multi-press-tiny rotate: false - xy: 1479, 305 + xy: 733, 330 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-multi-press-xlarge rotate: false - xy: 251, 208 + xy: 101, 302 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-multiplicative-reconstructor-large rotate: false - xy: 1055, 891 + xy: 625, 1680 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-multiplicative-reconstructor-medium rotate: false - xy: 1683, 579 + xy: 351, 334 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-multiplicative-reconstructor-small rotate: false - xy: 849, 316 + xy: 658, 562 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-multiplicative-reconstructor-tiny rotate: false - xy: 1497, 305 + xy: 733, 312 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-multiplicative-reconstructor-xlarge rotate: false - xy: 251, 158 + xy: 101, 252 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-naval-factory-large rotate: false - xy: 1097, 891 + xy: 583, 1596 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-naval-factory-medium rotate: false - xy: 1051, 550 + xy: 346, 300 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-naval-factory-small rotate: false - xy: 823, 290 + xy: 632, 510 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-naval-factory-tiny rotate: false - xy: 1515, 305 + xy: 733, 294 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-naval-factory-xlarge rotate: false - xy: 251, 108 + xy: 101, 202 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-oil-extractor-large rotate: false - xy: 1139, 891 + xy: 625, 1638 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-oil-extractor-medium rotate: false - xy: 1047, 516 + xy: 346, 266 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-oil-extractor-small rotate: false - xy: 797, 264 + xy: 658, 536 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-oil-extractor-tiny rotate: false - xy: 1533, 305 + xy: 927, 1050 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-oil-extractor-xlarge rotate: false - xy: 251, 58 + xy: 101, 152 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-coal-large rotate: false - xy: 1181, 891 + xy: 667, 1680 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-coal-medium rotate: false - xy: 1047, 482 + xy: 725, 1174 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-coal-small rotate: false - xy: 771, 238 + xy: 632, 484 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-coal-tiny rotate: false - xy: 1551, 305 + xy: 927, 1032 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-coal-xlarge rotate: false - xy: 151, 8 + xy: 101, 102 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-copper-large rotate: false - xy: 1223, 891 + xy: 625, 1596 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-copper-medium rotate: false - xy: 1047, 448 + xy: 759, 1156 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-small rotate: false - xy: 745, 186 + xy: 658, 510 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-copper-tiny rotate: false - xy: 1569, 305 + xy: 927, 1014 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-copper-xlarge rotate: false - xy: 201, 8 + xy: 101, 52 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-lead-large rotate: false - xy: 1265, 891 + xy: 667, 1638 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-lead-medium rotate: false - xy: 1047, 414 + xy: 793, 1156 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-small rotate: false - xy: 849, 290 + xy: 632, 458 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-lead-tiny rotate: false - xy: 1587, 305 + xy: 866, 1381 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-lead-xlarge rotate: false - xy: 251, 8 + xy: 101, 2 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-scrap-large rotate: false - xy: 1307, 891 + xy: 709, 1680 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-scrap-medium rotate: false - xy: 1047, 380 + xy: 827, 1156 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-small rotate: false - xy: 823, 264 + xy: 658, 484 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-scrap-tiny rotate: false - xy: 1605, 305 + xy: 884, 1381 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-scrap-xlarge rotate: false - xy: 281, 619 + xy: 231, 1632 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-thorium-large rotate: false - xy: 1349, 891 + xy: 667, 1596 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-thorium-medium rotate: false - xy: 1047, 346 + xy: 721, 1140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-small rotate: false - xy: 797, 238 + xy: 658, 458 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-thorium-tiny rotate: false - xy: 1623, 305 + xy: 902, 1381 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-thorium-xlarge rotate: false - xy: 281, 569 + xy: 231, 1582 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-titanium-large rotate: false - xy: 1391, 891 + xy: 709, 1638 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-titanium-medium rotate: false - xy: 1085, 545 + xy: 755, 1122 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-small rotate: false - xy: 771, 212 + xy: 632, 432 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-titanium-tiny rotate: false - xy: 1641, 305 + xy: 920, 1381 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-titanium-xlarge rotate: false - xy: 301, 519 + xy: 745, 1890 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-overdrive-dome-large rotate: false - xy: 1433, 891 + xy: 709, 1596 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-overdrive-dome-medium rotate: false - xy: 1119, 545 + xy: 789, 1122 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-overdrive-dome-small rotate: false - xy: 849, 264 + xy: 658, 432 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-overdrive-dome-tiny rotate: false - xy: 1659, 305 + xy: 938, 1381 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-overdrive-dome-xlarge rotate: false - xy: 301, 469 + xy: 151, 1532 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-overdrive-projector-large rotate: false - xy: 1475, 891 + xy: 351, 1554 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-overdrive-projector-medium rotate: false - xy: 1153, 545 + xy: 823, 1122 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-overdrive-projector-small rotate: false - xy: 823, 238 + xy: 697, 848 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-overdrive-projector-tiny rotate: false - xy: 1677, 305 + xy: 956, 1381 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-overdrive-projector-xlarge rotate: false - xy: 301, 419 + xy: 151, 1482 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-overflow-gate-large rotate: false - xy: 1517, 891 + xy: 351, 1512 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-overflow-gate-medium rotate: false - xy: 1187, 545 + xy: 599, 1045 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-overflow-gate-small rotate: false - xy: 797, 212 + xy: 697, 822 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-overflow-gate-tiny rotate: false - xy: 1695, 305 + xy: 974, 1381 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-overflow-gate-xlarge rotate: false - xy: 301, 369 + xy: 201, 1532 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-parallax-large rotate: false - xy: 1559, 891 + xy: 393, 1554 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-parallax-medium rotate: false - xy: 1221, 545 + xy: 855, 1671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-parallax-small rotate: false - xy: 771, 186 + xy: 697, 796 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-parallax-tiny rotate: false - xy: 1713, 305 + xy: 865, 1363 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-parallax-xlarge rotate: false - xy: 301, 319 + xy: 151, 1432 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-payload-conveyor-large rotate: false - xy: 1601, 891 + xy: 351, 1470 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-payload-conveyor-medium rotate: false - xy: 1255, 545 + xy: 889, 1671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-payload-conveyor-small rotate: false - xy: 849, 238 + xy: 690, 770 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-payload-conveyor-tiny rotate: false - xy: 1731, 305 + xy: 865, 1345 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-payload-conveyor-xlarge rotate: false - xy: 301, 269 + xy: 201, 1482 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-payload-router-large rotate: false - xy: 1643, 891 + xy: 393, 1512 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-payload-router-medium rotate: false - xy: 1289, 545 + xy: 923, 1671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-payload-router-small rotate: false - xy: 823, 212 + xy: 690, 744 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-payload-router-tiny rotate: false - xy: 1793, 554 + xy: 883, 1363 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-payload-router-xlarge rotate: false - xy: 301, 219 + xy: 151, 1382 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pebbles-large rotate: false - xy: 1685, 891 + xy: 435, 1554 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pebbles-medium rotate: false - xy: 1323, 545 + xy: 957, 1671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pebbles-small rotate: false - xy: 797, 186 + xy: 686, 718 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pebbles-tiny rotate: false - xy: 1811, 554 + xy: 865, 1327 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pebbles-xlarge rotate: false - xy: 301, 169 + xy: 201, 1432 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-conduit-large rotate: false - xy: 1727, 891 + xy: 351, 1428 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-conduit-medium rotate: false - xy: 1357, 545 + xy: 991, 1671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conduit-small rotate: false - xy: 849, 212 + xy: 686, 692 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-conduit-tiny rotate: false - xy: 1829, 554 + xy: 901, 1363 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-conduit-xlarge rotate: false - xy: 301, 119 + xy: 151, 1332 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-conveyor-large rotate: false - xy: 1769, 891 + xy: 393, 1470 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-conveyor-medium rotate: false - xy: 1391, 545 + xy: 853, 1637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conveyor-small rotate: false - xy: 823, 186 + xy: 686, 666 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-conveyor-tiny rotate: false - xy: 1847, 554 + xy: 883, 1345 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-conveyor-xlarge rotate: false - xy: 301, 69 + xy: 201, 1382 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-wall-large rotate: false - xy: 1811, 891 + xy: 435, 1512 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-wall-large-large rotate: false - xy: 1853, 891 + xy: 477, 1554 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-wall-large-medium rotate: false - xy: 1425, 545 + xy: 887, 1637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-large-small rotate: false - xy: 849, 186 + xy: 685, 640 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-wall-large-tiny rotate: false - xy: 1865, 554 + xy: 865, 1309 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-wall-large-xlarge rotate: false - xy: 301, 19 + xy: 151, 1282 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-wall-medium rotate: false - xy: 1459, 545 + xy: 853, 1603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-small rotate: false - xy: 875, 316 + xy: 685, 614 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-wall-tiny rotate: false - xy: 1883, 554 + xy: 919, 1363 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-wall-xlarge rotate: false - xy: 795, 878 + xy: 201, 1332 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-weaver-large rotate: false - xy: 1895, 891 + xy: 351, 1386 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-weaver-medium rotate: false - xy: 1493, 545 + xy: 921, 1637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-weaver-small rotate: false - xy: 875, 290 + xy: 684, 588 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-weaver-tiny rotate: false - xy: 1111, 279 + xy: 901, 1345 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-weaver-xlarge rotate: false - xy: 309, 816 + xy: 151, 1232 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pine-large rotate: false - xy: 1937, 891 + xy: 393, 1428 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pine-medium rotate: false - xy: 1527, 545 + xy: 887, 1603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pine-small rotate: false - xy: 875, 264 + xy: 684, 562 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pine-tiny rotate: false - xy: 1111, 261 + xy: 883, 1327 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pine-xlarge rotate: false - xy: 309, 766 + xy: 201, 1282 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-compressor-large rotate: false - xy: 859, 849 + xy: 435, 1470 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-compressor-medium rotate: false - xy: 1561, 545 + xy: 955, 1637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-compressor-small rotate: false - xy: 875, 238 + xy: 684, 536 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-compressor-tiny rotate: false - xy: 1111, 243 + xy: 865, 1291 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-compressor-xlarge rotate: false - xy: 359, 816 + xy: 151, 1182 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-conveyor-large rotate: false - xy: 859, 807 + xy: 477, 1512 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-conveyor-medium rotate: false - xy: 1595, 545 + xy: 921, 1603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-conveyor-small rotate: false - xy: 875, 212 + xy: 684, 510 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-conveyor-tiny rotate: false - xy: 1111, 225 + xy: 937, 1363 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-conveyor-xlarge rotate: false - xy: 309, 716 + xy: 201, 1232 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-wall-large rotate: false - xy: 901, 849 + xy: 519, 1554 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-wall-large-large rotate: false - xy: 859, 765 + xy: 351, 1344 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-wall-large-medium rotate: false - xy: 1629, 545 + xy: 989, 1637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-wall-large-small rotate: false - xy: 875, 186 + xy: 684, 484 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-wall-large-tiny rotate: false - xy: 1111, 207 + xy: 919, 1345 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-wall-large-xlarge rotate: false - xy: 359, 766 + xy: 151, 1132 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-wall-medium rotate: false - xy: 1663, 545 + xy: 955, 1603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-wall-small rotate: false - xy: 745, 160 + xy: 684, 458 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-wall-tiny rotate: false - xy: 1111, 189 + xy: 901, 1327 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-wall-xlarge rotate: false - xy: 409, 816 + xy: 201, 1182 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plated-conduit-large rotate: false - xy: 943, 849 + xy: 393, 1386 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plated-conduit-medium rotate: false - xy: 1081, 511 + xy: 989, 1603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plated-conduit-small rotate: false - xy: 771, 160 + xy: 684, 432 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plated-conduit-tiny rotate: false - xy: 1111, 171 + xy: 883, 1309 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plated-conduit-xlarge rotate: false - xy: 359, 716 + xy: 151, 1082 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pneumatic-drill-large rotate: false - xy: 901, 807 + xy: 435, 1428 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pneumatic-drill-medium rotate: false - xy: 1081, 477 + xy: 869, 1569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pneumatic-drill-small rotate: false - xy: 797, 160 + xy: 631, 406 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pneumatic-drill-tiny rotate: false - xy: 1129, 287 + xy: 865, 1273 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pneumatic-drill-xlarge rotate: false - xy: 409, 766 + xy: 201, 1132 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-node-large rotate: false - xy: 859, 723 + xy: 477, 1470 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-node-large-large rotate: false - xy: 985, 849 + xy: 519, 1512 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-node-large-medium rotate: false - xy: 1115, 511 + xy: 869, 1535 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-node-large-small rotate: false - xy: 823, 160 + xy: 657, 406 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-node-large-tiny rotate: false - xy: 1129, 269 + xy: 955, 1363 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-node-large-xlarge rotate: false - xy: 459, 816 + xy: 151, 1032 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-node-medium rotate: false - xy: 1081, 443 + xy: 903, 1569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-node-small rotate: false - xy: 849, 160 + xy: 683, 406 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-node-tiny rotate: false - xy: 1147, 287 + xy: 937, 1345 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-node-xlarge rotate: false - xy: 409, 716 + xy: 201, 1082 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-source-large rotate: false - xy: 943, 807 + xy: 561, 1554 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-source-medium rotate: false - xy: 1115, 477 + xy: 869, 1501 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-source-small rotate: false - xy: 875, 160 + xy: 629, 380 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-source-tiny rotate: false - xy: 1129, 251 + xy: 919, 1327 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-source-xlarge rotate: false - xy: 459, 766 + xy: 151, 982 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-void-large rotate: false - xy: 901, 765 + xy: 351, 1302 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-void-medium rotate: false - xy: 1149, 511 + xy: 903, 1535 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-void-small rotate: false - xy: 745, 134 + xy: 629, 354 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-void-tiny rotate: false - xy: 1147, 269 + xy: 901, 1309 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-void-xlarge rotate: false - xy: 509, 816 + xy: 201, 1032 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pulse-conduit-large rotate: false - xy: 859, 681 + xy: 393, 1344 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pulse-conduit-medium rotate: false - xy: 1081, 409 + xy: 937, 1569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulse-conduit-small rotate: false - xy: 771, 134 + xy: 655, 380 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pulse-conduit-tiny rotate: false - xy: 1165, 287 + xy: 883, 1291 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pulse-conduit-xlarge rotate: false - xy: 459, 716 + xy: 151, 932 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pulverizer-large rotate: false - xy: 1027, 849 + xy: 435, 1386 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pulverizer-medium rotate: false - xy: 1115, 443 + xy: 903, 1501 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulverizer-small rotate: false - xy: 797, 134 + xy: 629, 328 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pulverizer-tiny rotate: false - xy: 1129, 233 + xy: 865, 1255 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pulverizer-xlarge rotate: false - xy: 509, 766 + xy: 201, 982 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pyratite-mixer-large rotate: false - xy: 985, 807 + xy: 477, 1428 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pyratite-mixer-medium rotate: false - xy: 1149, 477 + xy: 937, 1535 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pyratite-mixer-small rotate: false - xy: 823, 134 + xy: 655, 354 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pyratite-mixer-tiny rotate: false - xy: 1147, 251 + xy: 973, 1363 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pyratite-mixer-xlarge rotate: false - xy: 559, 816 + xy: 151, 882 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-repair-point-large rotate: false - xy: 943, 765 + xy: 519, 1470 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-repair-point-medium rotate: false - xy: 1183, 511 + xy: 971, 1569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-repair-point-small rotate: false - xy: 849, 134 + xy: 681, 380 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-repair-point-tiny rotate: false - xy: 1165, 269 + xy: 955, 1345 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-repair-point-xlarge rotate: false - xy: 509, 716 + xy: 201, 932 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-resupply-point-large rotate: false - xy: 901, 723 + xy: 561, 1512 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-resupply-point-medium rotate: false - xy: 1081, 375 + xy: 937, 1501 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-resupply-point-small rotate: false - xy: 875, 134 + xy: 655, 328 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-resupply-point-tiny rotate: false - xy: 1183, 287 + xy: 937, 1327 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-resupply-point-xlarge rotate: false - xy: 559, 766 + xy: 151, 832 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ripple-large rotate: false - xy: 1069, 849 + xy: 603, 1554 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ripple-medium rotate: false - xy: 1115, 409 + xy: 971, 1535 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ripple-small rotate: false - xy: 779, 108 + xy: 681, 354 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ripple-tiny rotate: false - xy: 1129, 215 + xy: 919, 1309 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ripple-xlarge rotate: false - xy: 609, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rock-large - rotate: false - xy: 1027, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rock-medium - rotate: false - xy: 1149, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rock-small - rotate: false - xy: 779, 82 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rock-tiny - rotate: false - xy: 1147, 233 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rock-xlarge - rotate: false - xy: 559, 716 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rocks-large - rotate: false - xy: 985, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rocks-medium - rotate: false - xy: 1183, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rocks-small - rotate: false - xy: 805, 108 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rocks-tiny - rotate: false - xy: 1165, 251 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rocks-xlarge - rotate: false - xy: 609, 766 + xy: 201, 882 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-rotary-pump-large rotate: false - xy: 943, 723 + xy: 351, 1260 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-rotary-pump-medium rotate: false - xy: 1217, 511 + xy: 971, 1501 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rotary-pump-small rotate: false - xy: 779, 56 + xy: 681, 328 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-rotary-pump-tiny rotate: false - xy: 1183, 269 + xy: 901, 1291 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-rotary-pump-xlarge rotate: false - xy: 659, 816 + xy: 151, 782 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-router-large rotate: false - xy: 901, 681 + xy: 393, 1302 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-router-medium rotate: false - xy: 1115, 375 + xy: 385, 309 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-router-small rotate: false - xy: 779, 30 + xy: 629, 302 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-router-tiny rotate: false - xy: 1201, 287 + xy: 883, 1273 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-router-xlarge rotate: false - xy: 609, 716 + xy: 201, 832 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-rtg-generator-large rotate: false - xy: 1111, 849 + xy: 435, 1344 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-rtg-generator-medium rotate: false - xy: 1149, 409 + xy: 380, 275 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rtg-generator-small rotate: false - xy: 831, 108 + xy: 655, 302 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-rtg-generator-tiny rotate: false - xy: 1129, 197 + xy: 865, 1237 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-rtg-generator-xlarge rotate: false - xy: 659, 766 + xy: 151, 732 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-salt-large rotate: false - xy: 1069, 807 + xy: 477, 1386 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-salt-medium rotate: false - xy: 1183, 443 + xy: 419, 304 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-salt-small rotate: false - xy: 805, 82 + xy: 681, 302 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-salt-tiny rotate: false - xy: 1147, 215 + xy: 973, 1345 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salt-xlarge +block-salt-wall-large rotate: false - xy: 709, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-saltrocks-large - rotate: false - xy: 1027, 765 + xy: 519, 1428 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-saltrocks-medium +block-salt-wall-medium rotate: false - xy: 1217, 477 + xy: 453, 304 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-saltrocks-small +block-salt-wall-small rotate: false - xy: 857, 108 + xy: 716, 770 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-saltrocks-tiny +block-salt-wall-tiny rotate: false - xy: 1165, 233 + xy: 955, 1327 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-saltrocks-xlarge +block-salt-wall-xlarge rotate: false - xy: 659, 716 + xy: 201, 782 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salt-xlarge + rotate: false + xy: 151, 682 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-salvo-large rotate: false - xy: 985, 723 + xy: 561, 1470 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-salvo-medium rotate: false - xy: 1251, 511 + xy: 414, 270 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-salvo-small rotate: false - xy: 831, 82 + xy: 716, 744 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-salvo-tiny rotate: false - xy: 1183, 251 + xy: 937, 1309 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-salvo-xlarge rotate: false - xy: 709, 766 + xy: 201, 732 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sand-boulder-large rotate: false - xy: 943, 681 + xy: 603, 1512 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sand-boulder-medium rotate: false - xy: 1149, 375 + xy: 448, 270 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-boulder-small rotate: false - xy: 805, 56 + xy: 712, 718 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sand-boulder-tiny rotate: false - xy: 1201, 269 + xy: 919, 1291 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sand-boulder-xlarge rotate: false - xy: 709, 716 + xy: 151, 632 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sand-large rotate: false - xy: 1153, 849 + xy: 645, 1554 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sand-medium rotate: false - xy: 1183, 409 + xy: 380, 241 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-small rotate: false - xy: 805, 30 + xy: 712, 692 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sand-tiny rotate: false - xy: 1219, 287 + xy: 901, 1273 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +block-sand-wall-large + rotate: false + xy: 351, 1218 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-wall-medium + rotate: false + xy: 346, 232 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-wall-small + rotate: false + xy: 712, 666 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-wall-tiny + rotate: false + xy: 883, 1255 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-wall-xlarge + rotate: false + xy: 201, 682 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 block-sand-water-large rotate: false - xy: 1111, 807 + xy: 393, 1260 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sand-water-medium rotate: false - xy: 1217, 443 + xy: 414, 236 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-water-small rotate: false - xy: 857, 82 + xy: 711, 640 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sand-water-tiny rotate: false - xy: 1129, 179 + xy: 865, 1219 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sand-water-xlarge rotate: false - xy: 759, 816 + xy: 151, 582 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sand-xlarge rotate: false - xy: 759, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sandrocks-large - rotate: false - xy: 1069, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sandrocks-medium - rotate: false - xy: 1251, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-small - rotate: false - xy: 831, 56 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sandrocks-tiny - rotate: false - xy: 1147, 197 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sandrocks-xlarge - rotate: false - xy: 759, 716 + xy: 201, 632 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scatter-large rotate: false - xy: 1027, 723 + xy: 435, 1302 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scatter-medium rotate: false - xy: 1285, 511 + xy: 448, 236 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scatter-small rotate: false - xy: 831, 30 + xy: 711, 614 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scatter-tiny rotate: false - xy: 1165, 215 + xy: 973, 1327 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scatter-xlarge rotate: false - xy: 809, 828 + xy: 151, 532 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scorch-large rotate: false - xy: 985, 681 + xy: 477, 1344 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scorch-medium rotate: false - xy: 1183, 375 + xy: 344, 198 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scorch-small rotate: false - xy: 809, 4 + xy: 710, 588 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scorch-tiny rotate: false - xy: 1183, 233 + xy: 955, 1309 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scorch-xlarge rotate: false - xy: 809, 778 + xy: 201, 582 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-gigantic-large rotate: false - xy: 1195, 849 + xy: 519, 1386 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-gigantic-medium rotate: false - xy: 1217, 409 + xy: 343, 164 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-gigantic-small rotate: false - xy: 857, 56 + xy: 710, 562 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-gigantic-tiny rotate: false - xy: 1201, 251 + xy: 937, 1291 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-gigantic-xlarge rotate: false - xy: 809, 728 + xy: 151, 482 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-huge-large rotate: false - xy: 1153, 807 + xy: 561, 1428 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-huge-medium rotate: false - xy: 1251, 443 + xy: 343, 130 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-huge-small rotate: false - xy: 857, 30 + xy: 710, 536 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-huge-tiny rotate: false - xy: 1219, 269 + xy: 919, 1273 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-huge-xlarge rotate: false - xy: 809, 678 + xy: 201, 532 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-large rotate: false - xy: 1111, 765 + xy: 603, 1470 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-large-large rotate: false - xy: 1069, 723 + xy: 645, 1512 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-large-medium rotate: false - xy: 1285, 477 + xy: 343, 96 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-large-small rotate: false - xy: 835, 4 + xy: 710, 510 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-large-tiny rotate: false - xy: 1237, 287 + xy: 901, 1255 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-large-xlarge rotate: false - xy: 331, 666 + xy: 151, 432 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-medium rotate: false - xy: 1319, 511 + xy: 343, 62 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-small rotate: false - xy: 861, 4 + xy: 710, 484 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-tiny rotate: false - xy: 1147, 179 + xy: 883, 1237 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-xlarge rotate: false - xy: 331, 616 + xy: 201, 482 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-segment-large rotate: false - xy: 1027, 681 + xy: 687, 1554 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-segment-medium rotate: false - xy: 1217, 375 + xy: 343, 28 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-segment-small rotate: false - xy: 883, 108 + xy: 710, 458 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-segment-tiny rotate: false - xy: 1165, 197 + xy: 865, 1201 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-segment-xlarge rotate: false - xy: 381, 666 + xy: 151, 382 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-separator-large rotate: false - xy: 1237, 849 + xy: 351, 1176 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-separator-medium rotate: false - xy: 1251, 409 + xy: 380, 207 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-separator-small rotate: false - xy: 883, 82 + xy: 710, 432 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-separator-tiny rotate: false - xy: 1183, 215 + xy: 973, 1309 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-separator-xlarge rotate: false - xy: 381, 616 + xy: 201, 432 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shale-boulder-large rotate: false - xy: 1195, 807 + xy: 393, 1218 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shale-boulder-medium rotate: false - xy: 1285, 443 + xy: 414, 202 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-boulder-small rotate: false - xy: 883, 56 + xy: 709, 406 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shale-boulder-tiny rotate: false - xy: 1201, 233 + xy: 955, 1291 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-shale-boulder-xlarge rotate: false - xy: 431, 666 + xy: 151, 332 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shale-large rotate: false - xy: 1153, 765 + xy: 435, 1260 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shale-medium rotate: false - xy: 1319, 477 + xy: 448, 202 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-small rotate: false - xy: 883, 30 + xy: 707, 380 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shale-tiny rotate: false - xy: 1219, 251 + xy: 937, 1273 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-xlarge +block-shale-wall-large rotate: false - xy: 431, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shalerocks-large - rotate: false - xy: 1111, 723 + xy: 477, 1302 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shalerocks-medium +block-shale-wall-medium rotate: false - xy: 1353, 511 + xy: 378, 173 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shalerocks-small +block-shale-wall-small rotate: false - xy: 887, 4 + xy: 707, 354 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shalerocks-tiny +block-shale-wall-tiny rotate: false - xy: 1237, 269 + xy: 919, 1255 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shalerocks-xlarge +block-shale-wall-xlarge rotate: false - xy: 481, 666 + xy: 201, 382 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-xlarge + rotate: false + xy: 151, 282 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shock-mine-large rotate: false - xy: 1069, 681 + xy: 519, 1344 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shock-mine-medium rotate: false - xy: 1251, 375 + xy: 377, 139 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shock-mine-small rotate: false - xy: 901, 330 + xy: 707, 328 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shock-mine-tiny rotate: false - xy: 1255, 287 + xy: 901, 1237 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-shock-mine-xlarge rotate: false - xy: 481, 616 + xy: 201, 332 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shrubs-large rotate: false - xy: 1279, 849 + xy: 561, 1386 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shrubs-medium rotate: false - xy: 1285, 409 + xy: 377, 105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shrubs-small rotate: false - xy: 901, 304 + xy: 707, 302 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shrubs-tiny rotate: false - xy: 1165, 179 + xy: 883, 1219 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-shrubs-xlarge rotate: false - xy: 531, 666 + xy: 151, 232 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-silicon-crucible-large rotate: false - xy: 1237, 807 + xy: 603, 1428 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-silicon-crucible-medium rotate: false - xy: 1319, 443 + xy: 377, 71 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-silicon-crucible-small rotate: false - xy: 927, 330 + xy: 891, 1130 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-silicon-crucible-tiny rotate: false - xy: 1183, 197 + xy: 973, 1291 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-silicon-crucible-xlarge rotate: false - xy: 531, 616 + xy: 201, 282 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-silicon-smelter-large rotate: false - xy: 1195, 765 + xy: 645, 1470 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-silicon-smelter-medium rotate: false - xy: 1353, 477 + xy: 377, 37 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-silicon-smelter-small rotate: false - xy: 901, 278 + xy: 891, 1104 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-silicon-smelter-tiny rotate: false - xy: 1201, 215 + xy: 955, 1273 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-silicon-smelter-xlarge rotate: false - xy: 581, 666 + xy: 151, 182 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-slag-large rotate: false - xy: 1153, 723 + xy: 687, 1512 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-slag-medium rotate: false - xy: 1387, 511 + xy: 412, 168 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-slag-small rotate: false - xy: 953, 330 + xy: 887, 1078 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-slag-tiny rotate: false - xy: 1219, 233 + xy: 937, 1255 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-slag-xlarge rotate: false - xy: 581, 616 + xy: 201, 232 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-boulder-large + rotate: false + xy: 351, 1134 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-boulder-medium + rotate: false + xy: 446, 168 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-boulder-small + rotate: false + xy: 883, 1052 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-boulder-tiny + rotate: false + xy: 919, 1237 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-boulder-xlarge + rotate: false + xy: 151, 132 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snow-large rotate: false - xy: 1111, 681 + xy: 393, 1176 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-snow-medium rotate: false - xy: 1285, 375 + xy: 411, 134 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snow-pine-large rotate: false - xy: 1321, 849 + xy: 435, 1218 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-snow-pine-medium rotate: false - xy: 1319, 409 + xy: 411, 100 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snow-pine-small rotate: false - xy: 927, 304 + xy: 701, 1036 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-snow-pine-tiny rotate: false - xy: 1237, 251 + xy: 901, 1219 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-snow-pine-xlarge rotate: false - xy: 631, 666 + xy: 201, 182 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snow-small rotate: false - xy: 901, 252 + xy: 701, 1010 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-snow-tiny rotate: false - xy: 1255, 269 + xy: 883, 1201 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +block-snow-wall-large + rotate: false + xy: 477, 1260 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-wall-medium + rotate: false + xy: 445, 134 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-wall-small + rotate: false + xy: 697, 984 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-wall-tiny + rotate: false + xy: 973, 1273 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-wall-xlarge + rotate: false + xy: 151, 82 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 block-snow-xlarge rotate: false - xy: 631, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrock-large - rotate: false - xy: 1279, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrock-medium - rotate: false - xy: 1353, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-small - rotate: false - xy: 979, 330 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrock-tiny - rotate: false - xy: 1273, 287 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrock-xlarge - rotate: false - xy: 681, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrocks-large - rotate: false - xy: 1237, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrocks-medium - rotate: false - xy: 1387, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrocks-small - rotate: false - xy: 927, 278 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrocks-tiny - rotate: false - xy: 1183, 179 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrocks-xlarge - rotate: false - xy: 681, 616 + xy: 201, 132 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-solar-panel-large rotate: false - xy: 1195, 723 + xy: 519, 1302 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-solar-panel-large-large rotate: false - xy: 1153, 681 + xy: 561, 1344 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-solar-panel-large-medium rotate: false - xy: 1421, 511 + xy: 411, 66 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-large-small rotate: false - xy: 953, 304 + xy: 693, 958 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-solar-panel-large-tiny rotate: false - xy: 1201, 197 + xy: 955, 1255 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-solar-panel-large-xlarge rotate: false - xy: 731, 666 + xy: 151, 32 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-solar-panel-medium rotate: false - xy: 1319, 375 + xy: 445, 100 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-small rotate: false - xy: 901, 226 + xy: 689, 932 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-solar-panel-tiny rotate: false - xy: 1219, 215 + xy: 937, 1237 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-solar-panel-xlarge rotate: false - xy: 731, 616 + xy: 201, 82 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sorter-large rotate: false - xy: 1363, 849 + xy: 603, 1386 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sorter-medium rotate: false - xy: 1353, 409 + xy: 445, 66 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sorter-small rotate: false - xy: 1005, 330 + xy: 727, 1028 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sorter-tiny rotate: false - xy: 1237, 233 + xy: 919, 1219 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sorter-xlarge rotate: false - xy: 781, 628 + xy: 201, 32 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spawn-large rotate: false - xy: 1321, 807 + xy: 645, 1428 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spawn-medium rotate: false - xy: 1387, 443 + xy: 411, 32 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spawn-small rotate: false - xy: 927, 252 + xy: 753, 1028 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spawn-tiny rotate: false - xy: 1255, 251 + xy: 901, 1201 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spawn-xlarge rotate: false - xy: 831, 628 + xy: 251, 1532 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spectre-large rotate: false - xy: 1279, 765 + xy: 687, 1470 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spectre-medium rotate: false - xy: 1421, 477 + xy: 445, 32 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spectre-small rotate: false - xy: 953, 278 + xy: 779, 1028 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spectre-tiny rotate: false - xy: 1273, 269 + xy: 973, 1255 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spectre-xlarge rotate: false - xy: 781, 578 + xy: 251, 1482 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-cluster-large rotate: false - xy: 1237, 723 + xy: 351, 1092 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-cluster-medium rotate: false - xy: 1455, 511 + xy: 377, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-cluster-small rotate: false - xy: 979, 304 + xy: 805, 1028 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-cluster-tiny rotate: false - xy: 1291, 287 + xy: 955, 1237 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-cluster-xlarge rotate: false - xy: 831, 578 + xy: 251, 1432 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-moss-large rotate: false - xy: 1195, 681 + xy: 393, 1134 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-moss-medium rotate: false - xy: 1353, 375 + xy: 683, 1130 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-moss-small rotate: false - xy: 901, 200 + xy: 831, 1028 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-moss-tiny rotate: false - xy: 1201, 179 + xy: 937, 1219 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-moss-xlarge rotate: false - xy: 351, 566 + xy: 251, 1382 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-pine-large rotate: false - xy: 1405, 849 + xy: 435, 1176 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-pine-medium rotate: false - xy: 1387, 409 + xy: 717, 1106 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-pine-small rotate: false - xy: 927, 226 + xy: 857, 1028 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-pine-tiny rotate: false - xy: 1219, 197 + xy: 919, 1201 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-pine-xlarge rotate: false - xy: 351, 516 + xy: 251, 1332 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-press-large rotate: false - xy: 1363, 807 + xy: 477, 1218 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-press-medium rotate: false - xy: 1421, 443 + xy: 751, 1088 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-press-small rotate: false - xy: 953, 252 + xy: 883, 1026 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-press-tiny rotate: false - xy: 1237, 215 + xy: 973, 1237 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-press-xlarge rotate: false - xy: 401, 566 + xy: 251, 1282 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sporerocks-large +block-spore-wall-large rotate: false - xy: 1321, 765 + xy: 519, 1260 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sporerocks-medium +block-spore-wall-medium rotate: false - xy: 1455, 477 + xy: 785, 1088 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sporerocks-small +block-spore-wall-small rotate: false - xy: 979, 278 + xy: 727, 1002 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sporerocks-tiny +block-spore-wall-tiny rotate: false - xy: 1255, 233 + xy: 955, 1219 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sporerocks-xlarge +block-spore-wall-xlarge rotate: false - xy: 351, 466 + xy: 251, 1232 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-steam-generator-large + rotate: false + xy: 561, 1302 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-steam-generator-medium + rotate: false + xy: 819, 1088 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-steam-generator-small + rotate: false + xy: 753, 1002 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-steam-generator-tiny + rotate: false + xy: 937, 1201 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-steam-generator-xlarge + rotate: false + xy: 251, 1182 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-stone-large rotate: false - xy: 1279, 723 + xy: 603, 1344 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-stone-medium rotate: false - xy: 1489, 511 + xy: 595, 1011 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-stone-small rotate: false - xy: 1005, 304 + xy: 779, 1002 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-stone-tiny rotate: false - xy: 1273, 251 + xy: 973, 1219 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +block-stone-wall-large + rotate: false + xy: 645, 1386 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-wall-medium + rotate: false + xy: 869, 1467 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-small + rotate: false + xy: 805, 1002 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-wall-tiny + rotate: false + xy: 955, 1201 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-wall-xlarge + rotate: false + xy: 251, 1132 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 block-stone-xlarge rotate: false - xy: 401, 516 + xy: 251, 1082 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-surge-tower-large rotate: false - xy: 1237, 681 + xy: 687, 1428 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-surge-tower-medium rotate: false - xy: 1387, 375 + xy: 903, 1467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-tower-small rotate: false - xy: 901, 174 + xy: 831, 1002 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-surge-tower-tiny rotate: false - xy: 1291, 269 + xy: 973, 1201 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-surge-tower-xlarge rotate: false - xy: 451, 566 + xy: 251, 1032 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-surge-wall-large rotate: false - xy: 1447, 849 + xy: 351, 1050 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-surge-wall-large-large rotate: false - xy: 1405, 807 + xy: 393, 1092 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-surge-wall-large-medium rotate: false - xy: 1421, 409 + xy: 937, 1467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-wall-large-small rotate: false - xy: 927, 200 + xy: 857, 1002 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-surge-wall-large-tiny rotate: false - xy: 1309, 287 + xy: 895, 1183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-surge-wall-large-xlarge rotate: false - xy: 351, 416 + xy: 251, 982 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-surge-wall-medium rotate: false - xy: 1455, 443 + xy: 971, 1467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-wall-small rotate: false - xy: 953, 226 + xy: 883, 1000 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-surge-wall-tiny rotate: false - xy: 1219, 179 + xy: 895, 1165 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-surge-wall-xlarge rotate: false - xy: 401, 466 + xy: 251, 932 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-swarmer-large rotate: false - xy: 1363, 765 + xy: 435, 1134 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-swarmer-medium rotate: false - xy: 1489, 477 + xy: 868, 1433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-swarmer-small rotate: false - xy: 979, 252 + xy: 723, 976 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-swarmer-tiny rotate: false - xy: 1237, 197 + xy: 913, 1183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-swarmer-xlarge rotate: false - xy: 451, 516 + xy: 251, 882 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-switch-large rotate: false - xy: 1321, 723 + xy: 477, 1176 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-switch-medium rotate: false - xy: 1523, 511 + xy: 902, 1433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-switch-small rotate: false - xy: 1005, 278 + xy: 749, 976 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-switch-tiny rotate: false - xy: 1255, 215 + xy: 931, 1183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-switch-xlarge rotate: false - xy: 501, 566 + xy: 251, 832 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-tainted-water-large rotate: false - xy: 1279, 681 + xy: 519, 1218 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-tainted-water-medium rotate: false - xy: 1421, 375 + xy: 936, 1433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tainted-water-small rotate: false - xy: 901, 148 + xy: 775, 976 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-tainted-water-tiny rotate: false - xy: 1273, 233 + xy: 913, 1165 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-tainted-water-xlarge rotate: false - xy: 351, 366 + xy: 251, 782 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-tar-large rotate: false - xy: 1489, 849 + xy: 561, 1260 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-tar-medium rotate: false - xy: 1455, 409 + xy: 970, 1433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tar-small rotate: false - xy: 927, 174 + xy: 801, 976 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-tar-tiny rotate: false - xy: 1291, 251 + xy: 931, 1165 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-tar-xlarge rotate: false - xy: 401, 416 + xy: 251, 732 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-tendrils-large rotate: false - xy: 1447, 807 + xy: 603, 1302 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-tendrils-medium rotate: false - xy: 1489, 443 + xy: 482, 270 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tendrils-small rotate: false - xy: 953, 200 + xy: 827, 976 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-tendrils-tiny rotate: false - xy: 1309, 269 + xy: 949, 1183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-tendrils-xlarge rotate: false - xy: 451, 466 + xy: 251, 682 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-tetrative-reconstructor-large rotate: false - xy: 1405, 765 + xy: 645, 1344 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-tetrative-reconstructor-medium rotate: false - xy: 1523, 477 + xy: 482, 236 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tetrative-reconstructor-small rotate: false - xy: 979, 226 + xy: 853, 976 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-tetrative-reconstructor-tiny rotate: false - xy: 1327, 287 + xy: 967, 1183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-tetrative-reconstructor-xlarge rotate: false - xy: 501, 516 + xy: 251, 632 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thermal-generator-large rotate: false - xy: 1363, 723 + xy: 687, 1386 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thermal-generator-medium rotate: false - xy: 1557, 511 + xy: 482, 202 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thermal-generator-small rotate: false - xy: 1005, 252 + xy: 879, 974 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thermal-generator-tiny rotate: false - xy: 1237, 179 + xy: 949, 1165 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thermal-generator-xlarge rotate: false - xy: 551, 566 + xy: 251, 582 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thermal-pump-large rotate: false - xy: 1321, 681 + xy: 351, 1008 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thermal-pump-medium rotate: false - xy: 1455, 375 + xy: 480, 168 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thermal-pump-small rotate: false - xy: 927, 148 + xy: 719, 950 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thermal-pump-tiny rotate: false - xy: 1255, 197 + xy: 967, 1165 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thermal-pump-xlarge rotate: false - xy: 351, 316 + xy: 251, 532 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thorium-reactor-large rotate: false - xy: 1531, 849 + xy: 393, 1050 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thorium-reactor-medium rotate: false - xy: 1489, 409 + xy: 479, 134 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thorium-reactor-small rotate: false - xy: 953, 174 + xy: 745, 950 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thorium-reactor-tiny rotate: false - xy: 1273, 215 + xy: 917, 1147 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thorium-reactor-xlarge rotate: false - xy: 401, 366 + xy: 251, 482 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thorium-wall-large rotate: false - xy: 1489, 807 + xy: 435, 1092 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thorium-wall-large-large rotate: false - xy: 1447, 765 + xy: 477, 1134 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thorium-wall-large-medium rotate: false - xy: 1523, 443 + xy: 479, 100 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thorium-wall-large-small rotate: false - xy: 979, 200 + xy: 771, 950 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thorium-wall-large-tiny rotate: false - xy: 1291, 233 + xy: 917, 1129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thorium-wall-large-xlarge rotate: false - xy: 451, 416 + xy: 251, 432 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thorium-wall-medium rotate: false - xy: 1557, 477 + xy: 479, 66 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thorium-wall-small rotate: false - xy: 1005, 226 + xy: 797, 950 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thorium-wall-tiny rotate: false - xy: 1309, 251 + xy: 935, 1147 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thorium-wall-xlarge rotate: false - xy: 501, 466 + xy: 251, 382 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thruster-large rotate: false - xy: 1405, 723 + xy: 519, 1176 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thruster-medium rotate: false - xy: 1591, 511 + xy: 479, 32 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thruster-small rotate: false - xy: 953, 148 + xy: 823, 950 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thruster-tiny rotate: false - xy: 1327, 269 + xy: 953, 1147 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thruster-xlarge rotate: false - xy: 551, 516 + xy: 251, 332 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-titanium-conveyor-large rotate: false - xy: 1363, 681 + xy: 561, 1218 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-titanium-conveyor-medium rotate: false - xy: 1489, 375 + xy: 487, 304 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-conveyor-small rotate: false - xy: 979, 174 + xy: 849, 950 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-titanium-conveyor-tiny rotate: false - xy: 1345, 287 + xy: 917, 1111 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-titanium-conveyor-xlarge rotate: false - xy: 601, 566 + xy: 251, 282 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-titanium-wall-large rotate: false - xy: 1573, 849 + xy: 603, 1260 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-titanium-wall-large-large rotate: false - xy: 1531, 807 + xy: 645, 1302 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-titanium-wall-large-medium rotate: false - xy: 1523, 409 + xy: 679, 1096 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-large-small rotate: false - xy: 1005, 200 + xy: 875, 948 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-titanium-wall-large-tiny rotate: false - xy: 1255, 179 + xy: 935, 1129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-titanium-wall-large-xlarge rotate: false - xy: 351, 266 + xy: 251, 232 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-titanium-wall-medium rotate: false - xy: 1557, 443 + xy: 713, 1072 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-small rotate: false - xy: 979, 148 + xy: 715, 924 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-titanium-wall-tiny rotate: false - xy: 1273, 197 + xy: 953, 1129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-titanium-wall-xlarge rotate: false - xy: 401, 316 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-turbine-generator-large - rotate: false - xy: 1489, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-turbine-generator-medium - rotate: false - xy: 1591, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-turbine-generator-small - rotate: false - xy: 1005, 174 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-turbine-generator-tiny - rotate: false - xy: 1291, 215 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-turbine-generator-xlarge - rotate: false - xy: 451, 366 + xy: 251, 182 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-underflow-gate-large rotate: false - xy: 1447, 723 + xy: 687, 1344 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-underflow-gate-medium rotate: false - xy: 1625, 511 + xy: 747, 1054 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-underflow-gate-small rotate: false - xy: 1005, 148 + xy: 741, 924 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-underflow-gate-tiny rotate: false - xy: 1309, 233 + xy: 935, 1111 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-underflow-gate-xlarge rotate: false - xy: 501, 416 + xy: 251, 132 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-unloader-large rotate: false - xy: 1405, 681 + xy: 351, 966 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-unloader-medium rotate: false - xy: 1523, 375 + xy: 781, 1054 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-unloader-small rotate: false - xy: 909, 122 + xy: 767, 924 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-unloader-tiny rotate: false - xy: 1327, 251 + xy: 953, 1111 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-unloader-xlarge rotate: false - xy: 551, 466 + xy: 251, 82 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-vault-large rotate: false - xy: 1615, 849 + xy: 393, 1008 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-vault-medium rotate: false - xy: 1557, 409 + xy: 815, 1054 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-vault-small rotate: false - xy: 909, 96 + xy: 793, 924 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-vault-tiny rotate: false - xy: 1345, 269 + xy: 971, 1147 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-vault-xlarge rotate: false - xy: 601, 516 + xy: 251, 32 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-water-extractor-large rotate: false - xy: 1573, 807 + xy: 435, 1050 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-water-extractor-medium rotate: false - xy: 1591, 443 + xy: 591, 977 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-water-extractor-small rotate: false - xy: 935, 122 + xy: 819, 924 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-water-extractor-tiny rotate: false - xy: 1363, 287 + xy: 971, 1129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-water-extractor-xlarge rotate: false - xy: 651, 566 + xy: 281, 1643 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-water-large rotate: false - xy: 1531, 765 + xy: 477, 1092 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-water-medium rotate: false - xy: 1625, 477 + xy: 868, 1399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-water-small rotate: false - xy: 909, 70 + xy: 845, 924 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-water-tiny rotate: false - xy: 1273, 179 + xy: 971, 1111 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-water-xlarge rotate: false - xy: 351, 216 + xy: 281, 1593 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-wave-large rotate: false - xy: 1489, 723 + xy: 519, 1134 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-wave-medium rotate: false - xy: 1659, 511 + xy: 902, 1399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-wave-small rotate: false - xy: 935, 96 + xy: 871, 922 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-wave-tiny rotate: false - xy: 1291, 197 + xy: 931, 1093 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-wave-xlarge rotate: false - xy: 401, 266 + xy: 301, 1543 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-white-tree-dead-large rotate: false - xy: 1447, 681 + xy: 561, 1176 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-white-tree-dead-medium rotate: false - xy: 1557, 375 + xy: 936, 1399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-white-tree-dead-small rotate: false - xy: 961, 122 + xy: 705, 898 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-white-tree-dead-tiny rotate: false - xy: 1309, 215 + xy: 931, 1075 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-white-tree-dead-xlarge rotate: false - xy: 451, 316 + xy: 301, 1493 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-white-tree-large rotate: false - xy: 1657, 849 + xy: 603, 1218 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-white-tree-medium rotate: false - xy: 1591, 409 + xy: 970, 1399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-white-tree-small rotate: false - xy: 909, 44 + xy: 731, 898 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-white-tree-tiny rotate: false - xy: 1327, 233 + xy: 949, 1093 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-white-tree-xlarge rotate: false - xy: 501, 366 + xy: 301, 1443 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 button rotate: false - xy: 919, 594 + xy: 351, 600 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17608,7 +18112,7 @@ button index: -1 button-disabled rotate: false - xy: 695, 1 + xy: 435, 937 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17616,7 +18120,7 @@ button-disabled index: -1 button-down rotate: false - xy: 733, 1 + xy: 477, 979 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17624,7 +18128,7 @@ button-down index: -1 button-edge-1 rotate: false - xy: 771, 1 + xy: 519, 1021 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17632,7 +18136,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 1867, 862 + xy: 561, 1070 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17640,7 +18144,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 1825, 820 + xy: 603, 1113 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17648,7 +18152,15 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 1783, 778 + xy: 645, 1155 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-disabled + rotate: false + xy: 645, 1155 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17656,7 +18168,7 @@ button-edge-4 index: -1 button-edge-over-4 rotate: false - xy: 1741, 736 + xy: 687, 1198 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17664,7 +18176,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 1699, 694 + xy: 351, 803 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17672,7 +18184,7 @@ button-over index: -1 button-red rotate: false - xy: 1905, 862 + xy: 393, 853 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17680,7 +18192,7 @@ button-red index: -1 button-right rotate: false - xy: 881, 623 + xy: 351, 745 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17688,7 +18200,7 @@ button-right index: -1 button-right-down rotate: false - xy: 1943, 862 + xy: 435, 908 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17696,7 +18208,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 881, 652 + xy: 351, 774 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17704,7 +18216,7 @@ button-right-over index: -1 button-select rotate: false - xy: 935, 70 + xy: 757, 898 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -17712,7 +18224,7 @@ button-select index: -1 button-square rotate: false - xy: 919, 623 + xy: 351, 658 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17720,7 +18232,7 @@ button-square index: -1 button-square-down rotate: false - xy: 919, 652 + xy: 351, 716 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17728,7 +18240,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 881, 594 + xy: 351, 687 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17736,7 +18248,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 957, 652 + xy: 351, 629 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17744,77 +18256,77 @@ button-trans index: -1 check-disabled rotate: false - xy: 1625, 443 + xy: 516, 270 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 1659, 477 + xy: 516, 236 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 1591, 375 + xy: 516, 202 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 1625, 409 + xy: 514, 168 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 1659, 443 + xy: 513, 134 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 1625, 375 + xy: 513, 100 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 771, 916 + xy: 1005, 1873 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 crater rotate: false - xy: 131, 538 + xy: 131, 1562 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 cursor rotate: false - xy: 877, 452 + xy: 689, 926 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 discord-banner rotate: false - xy: 771, 978 + xy: 771, 2002 size: 84, 45 orig: 84, 45 offset: 0, 0 index: -1 flat-down-base rotate: false - xy: 957, 623 + xy: 351, 571 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17822,14 +18334,14 @@ flat-down-base index: -1 info-banner rotate: false - xy: 259, 869 + xy: 259, 1893 size: 84, 45 orig: 84, 45 offset: 0, 0 index: -1 inventory rotate: false - xy: 961, 80 + xy: 783, 882 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -17837,168 +18349,168 @@ inventory index: -1 item-blast-compound-icon rotate: false - xy: 1659, 409 + xy: 513, 66 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-icon rotate: false - xy: 1659, 375 + xy: 513, 32 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-icon rotate: false - xy: 1081, 341 + xy: 587, 943 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-icon rotate: false - xy: 1115, 341 + xy: 861, 1156 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-icon rotate: false - xy: 1149, 341 + xy: 857, 1122 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-icon rotate: false - xy: 1183, 341 + xy: 853, 1088 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-icon rotate: false - xy: 1217, 341 + xy: 849, 1054 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-icon rotate: false - xy: 1251, 341 + xy: 629, 1011 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-icon rotate: false - xy: 1285, 341 + xy: 625, 977 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-icon rotate: false - xy: 1319, 341 + xy: 621, 943 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-icon rotate: false - xy: 1353, 341 + xy: 633, 1045 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-icon rotate: false - xy: 1387, 341 + xy: 637, 1079 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-icon rotate: false - xy: 1421, 341 + xy: 671, 1062 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-icon rotate: false - xy: 1455, 341 + xy: 667, 1028 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-icon rotate: false - xy: 1489, 341 + xy: 663, 994 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-icon rotate: false - xy: 1523, 341 + xy: 659, 960 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-icon rotate: false - xy: 1557, 341 + xy: 655, 926 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-icon rotate: false - xy: 1591, 341 + xy: 511, 945 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-icon rotate: false - xy: 1625, 341 + xy: 507, 911 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-icon rotate: false - xy: 1659, 341 + xy: 545, 934 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-node rotate: false - xy: 1697, 545 + xy: 541, 900 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logo rotate: false - xy: 1, 916 + xy: 1, 1940 size: 768, 107 orig: 768, 107 offset: 0, 0 index: -1 nomap rotate: false - xy: 1, 658 + xy: 1, 1682 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 pane rotate: false - xy: 957, 594 + xy: 351, 513 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18006,7 +18518,7 @@ pane index: -1 pane-2 rotate: false - xy: 995, 652 + xy: 351, 542 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18014,7 +18526,7 @@ pane-2 index: -1 scroll rotate: false - xy: 1013, 111 + xy: 835, 887 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -18022,7 +18534,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 43, 2 + xy: 435, 882 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -18030,70 +18542,70 @@ scroll-horizontal index: -1 scroll-knob-horizontal-black rotate: false - xy: 1, 2 + xy: 151, 6 size: 40, 24 orig: 40, 24 offset: 0, 0 index: -1 scroll-knob-vertical-black rotate: false - xy: 987, 106 + xy: 809, 882 size: 24, 40 orig: 24, 40 offset: 0, 0 index: -1 scroll-knob-vertical-thin rotate: false - xy: 1761, 512 + xy: 991, 1267 size: 12, 40 orig: 12, 40 offset: 0, 0 index: -1 selection rotate: false - xy: 821, 975 + xy: 309, 1890 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 1051, 584 + xy: 1022, 1449 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 1717, 620 + xy: 529, 792 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 1717, 580 + xy: 525, 752 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 1748, 628 + xy: 525, 712 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-vertical rotate: false - xy: 309, 866 + xy: 821, 1999 size: 8, 1 orig: 8, 1 offset: 0, 0 index: -1 underline rotate: false - xy: 1071, 652 + xy: 351, 368 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18101,7 +18613,7 @@ underline index: -1 underline-2 rotate: false - xy: 995, 623 + xy: 351, 484 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18109,7 +18621,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 1033, 652 + xy: 351, 455 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18117,7 +18629,7 @@ underline-disabled index: -1 underline-red rotate: false - xy: 995, 594 + xy: 351, 426 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18125,7 +18637,7 @@ underline-red index: -1 underline-white rotate: false - xy: 1033, 623 + xy: 351, 397 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18133,847 +18645,960 @@ underline-white index: -1 unit-alpha-large rotate: false - xy: 1615, 807 + xy: 645, 1260 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-alpha-medium rotate: false - xy: 1693, 511 + xy: 499, 877 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-alpha-small rotate: false - xy: 935, 44 + xy: 861, 896 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-alpha-tiny rotate: false - xy: 1345, 251 + xy: 967, 1093 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-alpha-xlarge rotate: false - xy: 551, 416 + xy: 301, 1393 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-antumbra-large rotate: false - xy: 1573, 765 - size: 40, 40 - orig: 40, 40 + xy: 729, 1554 + size: 36, 40 + orig: 36, 40 offset: 0, 0 index: -1 unit-antumbra-medium rotate: false - xy: 1693, 477 - size: 32, 32 - orig: 32, 32 + xy: 525, 678 + size: 28, 32 + orig: 28, 32 offset: 0, 0 index: -1 unit-antumbra-small rotate: false - xy: 961, 54 - size: 24, 24 - orig: 24, 24 + xy: 277, 6 + size: 21, 24 + orig: 21, 24 offset: 0, 0 index: -1 unit-antumbra-tiny rotate: false - xy: 1363, 269 - size: 16, 16 - orig: 16, 16 + xy: 991, 1363 + size: 14, 16 + orig: 14, 16 offset: 0, 0 index: -1 unit-antumbra-xlarge rotate: false - xy: 601, 466 - size: 48, 48 - orig: 48, 48 + xy: 301, 312 + size: 43, 48 + orig: 43, 48 offset: 0, 0 index: -1 unit-arkyid-large rotate: false - xy: 1531, 723 + xy: 687, 1302 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-arkyid-medium rotate: false - xy: 1693, 443 + xy: 499, 843 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-arkyid-small rotate: false - xy: 987, 80 + xy: 887, 896 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-arkyid-tiny rotate: false - xy: 1381, 287 + xy: 949, 1075 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-arkyid-xlarge rotate: false - xy: 651, 516 + xy: 301, 1343 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-atrax-large rotate: false - xy: 1489, 681 - size: 40, 40 - orig: 40, 40 + xy: 193, 1 + size: 40, 29 + orig: 40, 29 offset: 0, 0 index: -1 unit-atrax-medium rotate: false - xy: 1693, 409 - size: 32, 32 - orig: 32, 32 + xy: 343, 3 + size: 32, 23 + orig: 32, 23 offset: 0, 0 index: -1 unit-atrax-small rotate: false - xy: 1013, 85 - size: 24, 24 - orig: 24, 24 + xy: 705, 879 + size: 24, 17 + orig: 24, 17 offset: 0, 0 index: -1 unit-atrax-tiny rotate: false - xy: 1291, 179 - size: 16, 16 - orig: 16, 16 + xy: 1007, 2000 + size: 16, 11 + orig: 16, 11 offset: 0, 0 index: -1 unit-atrax-xlarge rotate: false - xy: 701, 566 - size: 48, 48 - orig: 48, 48 + xy: 301, 1307 + size: 48, 34 + orig: 48, 34 offset: 0, 0 index: -1 unit-beta-large rotate: false - xy: 1699, 849 + xy: 351, 924 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-beta-medium rotate: false - xy: 1693, 375 + xy: 533, 866 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-beta-small rotate: false - xy: 987, 54 + xy: 897, 922 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-beta-tiny rotate: false - xy: 1309, 197 + xy: 967, 1075 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-beta-xlarge rotate: false - xy: 351, 166 + xy: 301, 1257 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-bryde-large rotate: false - xy: 1657, 807 + xy: 393, 966 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-bryde-medium rotate: false - xy: 1693, 341 + xy: 495, 809 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-bryde-small rotate: false - xy: 1013, 59 + xy: 901, 948 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-bryde-tiny rotate: false - xy: 1327, 215 + xy: 945, 1057 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-bryde-xlarge rotate: false - xy: 401, 216 + xy: 301, 1207 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-crawler-large rotate: false - xy: 1615, 765 + xy: 435, 1008 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-crawler-medium rotate: false - xy: 1817, 744 + xy: 491, 775 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-crawler-small rotate: false - xy: 913, 18 + xy: 905, 974 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-crawler-tiny rotate: false - xy: 1345, 233 + xy: 945, 1039 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-crawler-xlarge rotate: false - xy: 451, 266 + xy: 301, 1157 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-large rotate: false - xy: 1573, 723 + xy: 477, 1050 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-dagger-medium rotate: false - xy: 1779, 710 + xy: 491, 741 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-dagger-small rotate: false - xy: 939, 18 + xy: 731, 872 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-dagger-tiny rotate: false - xy: 1363, 251 + xy: 963, 1057 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-dagger-xlarge rotate: false - xy: 501, 316 + xy: 301, 1107 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-eclipse-large rotate: false - xy: 1531, 681 + xy: 519, 1092 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-eclipse-medium rotate: false - xy: 1813, 710 + xy: 491, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-eclipse-small rotate: false - xy: 965, 28 + xy: 757, 872 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-eclipse-tiny rotate: false - xy: 1381, 269 + xy: 945, 1021 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-eclipse-xlarge rotate: false - xy: 551, 366 + xy: 301, 1057 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-flare-large rotate: false - xy: 1741, 849 + xy: 561, 1134 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-flare-medium rotate: false - xy: 1737, 668 + xy: 491, 673 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-flare-small rotate: false - xy: 991, 28 + xy: 723, 846 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-flare-tiny rotate: false - xy: 1399, 287 + xy: 963, 1039 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-flare-xlarge rotate: false - xy: 601, 416 + xy: 301, 1007 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-fortress-large rotate: false - xy: 1699, 807 - size: 40, 40 - orig: 40, 40 + xy: 603, 1184 + size: 40, 32 + orig: 40, 32 offset: 0, 0 index: -1 unit-fortress-medium rotate: false - xy: 1863, 794 - size: 32, 32 - orig: 32, 32 + xy: 411, 5 + size: 32, 25 + orig: 32, 25 offset: 0, 0 index: -1 unit-fortress-small rotate: false - xy: 1017, 33 - size: 24, 24 - orig: 24, 24 + xy: 749, 851 + size: 24, 19 + orig: 24, 19 offset: 0, 0 index: -1 unit-fortress-tiny rotate: false - xy: 1309, 179 - size: 16, 16 - orig: 16, 16 + xy: 909, 1000 + size: 16, 12 + orig: 16, 12 offset: 0, 0 index: -1 unit-fortress-xlarge rotate: false - xy: 651, 466 - size: 48, 48 - orig: 48, 48 + xy: 301, 967 + size: 48, 38 + orig: 48, 38 offset: 0, 0 index: -1 unit-gamma-large rotate: false - xy: 1657, 765 + xy: 645, 1218 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-gamma-medium rotate: false - xy: 1897, 794 + xy: 491, 639 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-gamma-small rotate: false - xy: 1031, 320 + xy: 723, 820 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-gamma-tiny rotate: false - xy: 1327, 197 + xy: 963, 1021 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-gamma-xlarge rotate: false - xy: 701, 516 + xy: 301, 917 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-horizon-large rotate: false - xy: 1615, 723 + xy: 687, 1260 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-horizon-medium rotate: false - xy: 1931, 794 + xy: 491, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-horizon-small rotate: false - xy: 1031, 294 + xy: 749, 825 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-horizon-tiny rotate: false - xy: 1345, 215 + xy: 945, 1003 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-horizon-xlarge rotate: false - xy: 351, 116 + xy: 301, 867 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mace-large rotate: false - xy: 1573, 681 + xy: 351, 882 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mace-medium rotate: false - xy: 1727, 511 + xy: 491, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mace-small rotate: false - xy: 1031, 268 + xy: 913, 896 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mace-tiny rotate: false - xy: 1363, 233 + xy: 963, 1003 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mace-xlarge rotate: false - xy: 401, 166 + xy: 301, 817 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mega-large rotate: false - xy: 1783, 849 + xy: 393, 924 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mega-medium rotate: false - xy: 1727, 477 + xy: 491, 537 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mega-small rotate: false - xy: 1031, 242 + xy: 923, 922 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mega-tiny rotate: false - xy: 1381, 251 + xy: 985, 1183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mega-xlarge rotate: false - xy: 451, 216 + xy: 301, 767 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-minke-large rotate: false - xy: 1741, 807 - size: 40, 40 - orig: 40, 40 + xy: 989, 1957 + size: 34, 40 + orig: 34, 40 offset: 0, 0 index: -1 unit-minke-medium rotate: false - xy: 1727, 443 - size: 32, 32 - orig: 32, 32 + xy: 525, 534 + size: 27, 32 + orig: 27, 32 offset: 0, 0 index: -1 unit-minke-small rotate: false - xy: 1031, 216 - size: 24, 24 - orig: 24, 24 + xy: 309, 1696 + size: 20, 24 + orig: 20, 24 offset: 0, 0 index: -1 unit-minke-tiny rotate: false - xy: 1399, 269 - size: 16, 16 - orig: 16, 16 + xy: 991, 1327 + size: 13, 16 + orig: 13, 16 offset: 0, 0 index: -1 unit-minke-xlarge rotate: false - xy: 501, 266 - size: 48, 48 - orig: 48, 48 + xy: 301, 212 + size: 41, 48 + orig: 41, 48 offset: 0, 0 index: -1 unit-mono-large rotate: false - xy: 1699, 765 + xy: 435, 966 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mono-medium rotate: false - xy: 1727, 409 + xy: 491, 503 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mono-small rotate: false - xy: 1031, 190 + xy: 927, 948 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mono-tiny rotate: false - xy: 1417, 287 + xy: 985, 1165 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mono-xlarge rotate: false - xy: 551, 316 + xy: 301, 717 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-nova-large rotate: false - xy: 1657, 723 + xy: 477, 1008 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-nova-medium rotate: false - xy: 1727, 375 + xy: 491, 469 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-nova-small rotate: false - xy: 1031, 164 + xy: 783, 856 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-nova-tiny rotate: false - xy: 1327, 179 + xy: 989, 1147 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-nova-xlarge rotate: false - xy: 601, 366 + xy: 301, 667 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-poly-large rotate: false - xy: 1615, 681 + xy: 519, 1050 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-poly-medium rotate: false - xy: 1727, 341 + xy: 491, 435 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-poly-small rotate: false - xy: 965, 2 + xy: 809, 856 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-poly-tiny rotate: false - xy: 1345, 197 + xy: 989, 1129 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-poly-xlarge rotate: false - xy: 651, 416 + xy: 301, 617 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-pulsar-large rotate: false - xy: 1825, 849 - size: 40, 40 - orig: 40, 40 + xy: 561, 1099 + size: 40, 33 + orig: 40, 33 offset: 0, 0 index: -1 unit-pulsar-medium rotate: false - xy: 1775, 676 - size: 32, 32 - orig: 32, 32 + xy: 491, 407 + size: 32, 26 + orig: 32, 26 offset: 0, 0 index: -1 unit-pulsar-small rotate: false - xy: 991, 2 - size: 24, 24 - orig: 24, 24 + xy: 835, 866 + size: 24, 19 + orig: 24, 19 offset: 0, 0 index: -1 unit-pulsar-tiny rotate: false - xy: 1363, 215 - size: 16, 16 - orig: 16, 16 + xy: 989, 1114 + size: 16, 13 + orig: 16, 13 offset: 0, 0 index: -1 unit-pulsar-xlarge rotate: false - xy: 701, 466 - size: 48, 48 - orig: 48, 48 + xy: 301, 576 + size: 48, 39 + orig: 48, 39 offset: 0, 0 index: -1 unit-quasar-large rotate: false - xy: 1783, 807 + xy: 603, 1142 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-quasar-medium rotate: false - xy: 1809, 676 + xy: 491, 373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-quasar-small rotate: false - xy: 1017, 7 + xy: 861, 870 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-quasar-tiny rotate: false - xy: 1381, 233 + xy: 1007, 1369 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-quasar-xlarge rotate: false - xy: 351, 66 + xy: 301, 526 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +unit-reign-large + rotate: false + xy: 235, 4 + size: 40, 26 + orig: 40, 26 + offset: 0, 0 + index: -1 +unit-reign-medium + rotate: false + xy: 445, 10 + size: 31, 20 + orig: 31, 20 + offset: 0, 0 + index: -1 +unit-reign-small + rotate: false + xy: 723, 803 + size: 24, 15 + orig: 24, 15 + offset: 0, 0 + index: -1 +unit-reign-tiny + rotate: false + xy: 771, 1940 + size: 15, 10 + orig: 15, 10 + offset: 0, 0 + index: -1 +unit-reign-xlarge + rotate: false + xy: 301, 493 + size: 48, 31 + orig: 48, 31 + offset: 0, 0 + index: -1 unit-risso-large rotate: false - xy: 1741, 765 - size: 40, 40 - orig: 40, 40 + xy: 729, 1454 + size: 35, 40 + orig: 35, 40 offset: 0, 0 index: -1 unit-risso-medium rotate: false - xy: 1847, 710 - size: 32, 32 - orig: 32, 32 + xy: 525, 644 + size: 28, 32 + orig: 28, 32 offset: 0, 0 index: -1 unit-risso-small rotate: false - xy: 1057, 315 - size: 24, 24 - orig: 24, 24 + xy: 775, 830 + size: 21, 24 + orig: 21, 24 offset: 0, 0 index: -1 unit-risso-tiny rotate: false - xy: 1399, 251 - size: 16, 16 - orig: 16, 16 + xy: 991, 1345 + size: 14, 16 + orig: 14, 16 offset: 0, 0 index: -1 unit-risso-xlarge rotate: false - xy: 401, 116 - size: 48, 48 - orig: 48, 48 + xy: 301, 262 + size: 43, 48 + orig: 43, 48 + offset: 0, 0 + index: -1 +unit-scepter-large + rotate: false + xy: 645, 1184 + size: 40, 32 + orig: 40, 32 + offset: 0, 0 + index: -1 +unit-scepter-medium + rotate: false + xy: 491, 345 + size: 32, 26 + orig: 32, 26 + offset: 0, 0 + index: -1 +unit-scepter-small + rotate: false + xy: 749, 804 + size: 24, 19 + orig: 24, 19 + offset: 0, 0 + index: -1 +unit-scepter-tiny + rotate: false + xy: 1007, 1354 + size: 16, 13 + orig: 16, 13 + offset: 0, 0 + index: -1 +unit-scepter-xlarge + rotate: false + xy: 301, 452 + size: 48, 39 + orig: 48, 39 offset: 0, 0 index: -1 unit-spiroct-large rotate: false - xy: 1699, 723 - size: 40, 40 - orig: 40, 40 + xy: 687, 1227 + size: 40, 31 + orig: 40, 31 offset: 0, 0 index: -1 unit-spiroct-medium rotate: false - xy: 1843, 676 - size: 32, 32 - orig: 32, 32 + xy: 478, 5 + size: 31, 25 + orig: 31, 25 offset: 0, 0 index: -1 unit-spiroct-small rotate: false - xy: 1057, 289 - size: 24, 24 - orig: 24, 24 + xy: 887, 875 + size: 24, 19 + orig: 24, 19 offset: 0, 0 index: -1 unit-spiroct-tiny rotate: false - xy: 1417, 269 - size: 16, 16 - orig: 16, 16 + xy: 927, 1000 + size: 15, 12 + orig: 15, 12 offset: 0, 0 index: -1 unit-spiroct-xlarge rotate: false - xy: 451, 166 - size: 48, 48 - orig: 48, 48 + xy: 301, 412 + size: 48, 38 + orig: 48, 38 + offset: 0, 0 + index: -1 +unit-toxopid-large + rotate: false + xy: 729, 1412 + size: 33, 40 + orig: 33, 40 + offset: 0, 0 + index: -1 +unit-toxopid-medium + rotate: false + xy: 525, 437 + size: 26, 32 + orig: 26, 32 + offset: 0, 0 + index: -1 +unit-toxopid-small + rotate: false + xy: 775, 804 + size: 20, 24 + orig: 20, 24 + offset: 0, 0 + index: -1 +unit-toxopid-tiny + rotate: false + xy: 991, 1309 + size: 13, 16 + orig: 13, 16 + offset: 0, 0 + index: -1 +unit-toxopid-xlarge + rotate: false + xy: 351, 832 + size: 40, 48 + orig: 40, 48 offset: 0, 0 index: -1 unit-zenith-large rotate: false - xy: 1657, 681 + xy: 393, 882 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-zenith-medium rotate: false - xy: 1965, 794 + xy: 533, 832 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-zenith-small rotate: false - xy: 1083, 315 + xy: 913, 870 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-zenith-tiny rotate: false - xy: 1435, 287 + xy: 1007, 1336 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-zenith-xlarge rotate: false - xy: 501, 216 + xy: 301, 362 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +wavepane + rotate: false + xy: 729, 1525 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 white-pane rotate: false - xy: 1033, 594 + xy: 729, 1496 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18981,14 +19606,14 @@ white-pane index: -1 whiteui rotate: false - xy: 821, 928 + xy: 414, 304 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 1779, 613 + xy: 525, 471 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 baba9e3f2e..eb4d7af007 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 86703232a8..c9d980580b 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 2a9667623a..905331d4e6 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 47b3a43b45..2e848b79c9 100644 Binary files a/core/assets/sprites/fallback/sprites4.png and b/core/assets/sprites/fallback/sprites4.png differ diff --git a/core/assets/sprites/fallback/sprites5.png b/core/assets/sprites/fallback/sprites5.png index ce24c31d04..055343ee62 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 83f8d322f0..4c7b69db4e 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 fdc7006712..73e70ba07d 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/sprites.atlas b/core/assets/sprites/sprites.atlas index 56b31cceef..cc38c419f9 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -1,6480 +1,6648 @@ sprites.png -size: 4096,2048 +size: 4096,4096 format: rgba8888 filter: nearest,nearest repeat: none core-silo rotate: false - xy: 1735, 999 + xy: 1563, 2663 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 launch-pad rotate: false - xy: 2917, 1065 + xy: 795, 2305 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large rotate: false - xy: 2059, 778 + xy: 2017, 2871 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 launch-pad-light rotate: false - xy: 3015, 1065 + xy: 697, 2111 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launchpod rotate: false - xy: 3727, 847 + xy: 991, 2265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 force-projector rotate: false - xy: 2277, 288 + xy: 2411, 2398 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 force-projector-top rotate: false - xy: 2313, 190 + xy: 2513, 2524 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 3991, 847 + xy: 1123, 2463 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 3991, 781 + xy: 1123, 2397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender rotate: false - xy: 3987, 167 + xy: 1761, 2157 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender-top rotate: false - xy: 4021, 167 + xy: 1795, 2165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-dome rotate: false - xy: 2807, 967 + xy: 3399, 3269 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-top rotate: false - xy: 2905, 967 + xy: 2751, 3239 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 3239, 703 + xy: 1123, 2331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 3305, 703 + xy: 1123, 2265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 3831, 65 + xy: 845, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-loader rotate: false - xy: 1823, 53 + xy: 3527, 3399 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader rotate: false - xy: 1961, 445 + xy: 609, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 3661, 287 + xy: 783, 1399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 3837, 473 + xy: 889, 1501 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 3871, 473 + xy: 855, 1467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 3905, 473 + xy: 817, 1399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 3939, 473 + xy: 851, 1433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-0 rotate: false - xy: 3025, 182 + xy: 791, 1977 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-full rotate: false - xy: 3025, 182 + xy: 791, 1977 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-1 rotate: false - xy: 2135, 352 + xy: 791, 1943 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-2 rotate: false - xy: 1847, 19 + xy: 825, 1977 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-3 rotate: false - xy: 1881, 19 + xy: 825, 1943 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-0 rotate: false - xy: 1915, 19 + xy: 791, 1909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-1 rotate: false - xy: 1949, 19 + xy: 859, 1977 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-2 rotate: false - xy: 1983, 19 + xy: 859, 1943 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-3 rotate: false - xy: 2017, 19 + xy: 825, 1909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-0 rotate: false - xy: 2051, 19 + xy: 791, 1875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-1 rotate: false - xy: 2085, 19 + xy: 893, 1977 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-2 rotate: false - xy: 2119, 19 + xy: 893, 1943 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-3 rotate: false - xy: 2153, 19 + xy: 859, 1909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-0 rotate: false - xy: 2637, 117 + xy: 825, 1875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-1 rotate: false - xy: 2637, 83 + xy: 927, 1977 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-2 rotate: false - xy: 2637, 49 + xy: 927, 1943 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-3 rotate: false - xy: 2671, 111 + xy: 893, 1909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-0 rotate: false - xy: 2671, 77 + xy: 859, 1875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-1 rotate: false - xy: 2671, 43 + xy: 927, 1909 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-2 rotate: false - xy: 4057, 945 + xy: 893, 1875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-3 rotate: false - xy: 4057, 911 + xy: 927, 1875 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 3735, 439 + xy: 2585, 2244 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 3769, 439 + xy: 2619, 2252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 3803, 439 + xy: 2653, 2252 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 3837, 439 + xy: 2687, 2260 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 3871, 439 + xy: 2187, 2213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 3905, 439 + xy: 2221, 2214 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 3939, 439 + xy: 2255, 2214 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 3973, 439 + xy: 2289, 2214 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 4007, 447 + xy: 2323, 2214 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 4041, 447 + xy: 2357, 2220 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 3719, 389 + xy: 2391, 2214 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 3711, 355 + xy: 2425, 2214 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 3711, 321 + xy: 2459, 2214 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 3753, 405 + xy: 2493, 2202 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 3787, 405 + xy: 2527, 2202 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 3821, 405 + xy: 2561, 2202 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 3855, 405 + xy: 2595, 2210 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 3889, 405 + xy: 2629, 2218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 3923, 405 + xy: 2663, 2218 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor rotate: false - xy: 3355, 195 + xy: 1813, 2089 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-0 rotate: false - xy: 3355, 161 + xy: 1813, 2055 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-1 rotate: false - xy: 3389, 181 + xy: 1847, 2089 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-2 rotate: false - xy: 3423, 181 + xy: 1847, 2055 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-edge rotate: false - xy: 3457, 181 + xy: 1779, 2029 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-stack rotate: false - xy: 3389, 147 + xy: 1813, 2021 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 3523, 77 + xy: 1063, 1933 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 3557, 77 + xy: 1131, 1967 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 3591, 77 + xy: 1029, 1865 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 3625, 77 + xy: 1063, 1899 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 3659, 77 + xy: 1097, 1933 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 3489, 53 + xy: 1063, 1865 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 3523, 43 + xy: 1097, 1899 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 3557, 43 + xy: 1131, 1933 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 3591, 43 + xy: 1097, 1865 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 3625, 43 + xy: 1131, 1899 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 3659, 43 + xy: 1131, 1865 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 3693, 49 + xy: 961, 1831 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 3727, 31 + xy: 995, 1831 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 3761, 31 + xy: 1029, 1831 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 3795, 31 + xy: 1063, 1831 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 3829, 31 + xy: 1097, 1831 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 3863, 31 + xy: 1131, 1831 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 3897, 31 + xy: 959, 1797 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 3931, 31 + xy: 959, 1763 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cross rotate: false - xy: 3889, 371 + xy: 2561, 2168 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 distributor rotate: false - xy: 3463, 781 + xy: 3501, 3333 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 inverted-sorter rotate: false - xy: 3915, 337 + xy: 3929, 3441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 3681, 213 + xy: 3737, 2931 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver-base rotate: false - xy: 3701, 1077 + xy: 893, 2207 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 3749, 133 + xy: 1829, 2123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 payload-conveyor rotate: false - xy: 3003, 967 + xy: 2849, 3239 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-edge rotate: false - xy: 3101, 967 + xy: 2947, 3239 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-top rotate: false - xy: 2579, 869 + xy: 2769, 3141 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-top rotate: false - xy: 2579, 869 + xy: 2769, 3141 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router rotate: false - xy: 2579, 771 + xy: 2769, 3043 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-edge rotate: false - xy: 2677, 869 + xy: 2867, 3141 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-over rotate: false - xy: 2677, 771 + xy: 2867, 3043 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 3919, 133 + xy: 1745, 2089 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 3953, 133 + xy: 1779, 2097 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 3987, 133 + xy: 1711, 2055 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 4021, 133 + xy: 1745, 2055 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 3797, 99 + xy: 817, 771 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 3899, 65 + xy: 845, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 underflow-gate rotate: false - xy: 4033, 31 + xy: 993, 1763 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-drill rotate: false - xy: 3365, 1435 + xy: 259, 235 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rim rotate: false - xy: 3495, 1435 + xy: 259, 105 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 3625, 1435 + xy: 453, 1413 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 3755, 1435 + xy: 445, 1283 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 drill-top rotate: false - xy: 3529, 781 + xy: 991, 2529 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -turbine-generator-liquid +steam-generator-liquid rotate: false - xy: 3529, 781 + xy: 991, 2529 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 2525, 1065 + xy: 795, 2501 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rim rotate: false - xy: 2623, 1065 + xy: 697, 2307 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 2721, 1065 + xy: 795, 2403 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 2819, 1065 + xy: 697, 2209 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 3925, 847 + xy: 991, 2001 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 3991, 913 + xy: 1057, 2001 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 3925, 781 + xy: 1123, 2529 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 3995, 1077 + xy: 795, 2011 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 2513, 967 + xy: 893, 2011 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 2611, 967 + xy: 2509, 2328 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 2709, 967 + xy: 2607, 2328 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 3899, 715 + xy: 1255, 2497 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 3965, 715 + xy: 1321, 2563 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 4031, 715 + xy: 1189, 2365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 2477, 216 + xy: 1453, 2135 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 2477, 150 + xy: 1519, 2201 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 2543, 216 + xy: 1585, 2267 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 2543, 150 + xy: 1453, 2069 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border rotate: false - xy: 3443, 215 + xy: 789, 1807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 3092, 41 + xy: 891, 1705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 2705, 48 + xy: 2051, 2213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 3693, 423 + xy: 851, 1365 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 2775, 869 + xy: 2965, 3141 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 3701, 465 + xy: 855, 1501 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 3735, 473 + xy: 821, 1467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 3735, 473 + xy: 821, 1467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 3769, 473 + xy: 817, 1433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 3803, 473 + xy: 783, 1365 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 4041, 481 + xy: 817, 1365 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 3653, 247 + xy: 851, 1399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 3647, 213 + xy: 885, 1433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 3647, 179 + xy: 923, 1467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 3647, 179 + xy: 923, 1467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 3647, 179 + xy: 923, 1467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 3685, 389 + xy: 885, 1399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 3677, 355 + xy: 919, 1433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 3677, 321 + xy: 885, 1365 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 3695, 287 + xy: 919, 1399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 3695, 287 + xy: 919, 1399 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 3687, 253 + xy: 919, 1365 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 3715, 185 + xy: 1551, 1935 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate rotate: false - xy: 3817, 201 + xy: 2595, 2142 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate-top rotate: false - xy: 3851, 201 + xy: 2629, 2150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 3885, 201 + xy: 2663, 2150 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 3919, 201 + xy: 2697, 2158 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 3953, 201 + xy: 4057, 3373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 3113, 1065 + xy: 795, 2207 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 3211, 1077 + xy: 795, 2109 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 3309, 1077 + xy: 893, 2501 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 3851, 167 + xy: 1693, 2163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump-liquid rotate: false - xy: 3885, 167 + xy: 1727, 2191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-liquid rotate: false - xy: 3885, 167 + xy: 1727, 2191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-pump-liquid rotate: false - xy: 3885, 167 + xy: 1727, 2191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 3783, 133 + xy: 2697, 2090 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 3817, 133 + xy: 1711, 2123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 3851, 133 + xy: 1711, 2089 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 3885, 133 + xy: 1745, 2123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-cap rotate: false - xy: 3457, 147 + xy: 777, 585 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-0 rotate: false - xy: 3491, 155 + xy: 777, 551 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-1 rotate: false - xy: 3491, 121 + xy: 777, 517 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-2 rotate: false - xy: 3525, 145 + xy: 777, 483 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-3 rotate: false - xy: 3559, 145 + xy: 777, 449 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-4 rotate: false - xy: 3593, 145 + xy: 1863, 2157 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 3559, 111 + xy: 1881, 2021 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 3593, 111 + xy: 792, 839 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 3627, 111 + xy: 792, 805 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 3661, 111 + xy: 783, 771 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 3635, 649 + xy: 1189, 2233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 3493, 979 + xy: 3161, 2955 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -data-processor-top +hyper-processor rotate: false - xy: 2157, 680 + xy: 2611, 2426 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +large-logic-display + rotate: false + xy: 1207, 2629 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 logic-display rotate: false - xy: 3407, 1077 + xy: 893, 2403 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor rotate: false - xy: 3793, 913 + xy: 1057, 2331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -logic-processor-3 - rotate: false - xy: 3505, 1077 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 memory-cell rotate: false - xy: 3953, 167 + xy: 1727, 2157 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 4055, 167 + xy: 1829, 2157 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor rotate: false - xy: 3715, 151 + xy: 1795, 2131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch rotate: false - xy: 3421, 79 + xy: 1097, 1967 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch-on rotate: false - xy: 3455, 79 + xy: 995, 1865 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery rotate: false - xy: 4057, 877 + xy: 791, 1841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large rotate: false - xy: 1431, 162 + xy: 2277, 2888 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-large-top rotate: false - xy: 1431, 64 + xy: 2375, 2986 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-top rotate: false - xy: 4057, 843 + xy: 825, 1841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 3973, 473 + xy: 923, 1501 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 4007, 481 + xy: 889, 1467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator rotate: false - xy: 2157, 582 + xy: 2117, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-liquid rotate: false - xy: 2157, 484 + xy: 2219, 2594 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-top rotate: false - xy: 2183, 386 + xy: 2317, 2594 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode rotate: false - xy: 3923, 371 + xy: 2595, 2176 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 diode-arrow rotate: false - xy: 3957, 371 + xy: 2629, 2184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator rotate: false - xy: 3813, 337 + xy: 3967, 3475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-top rotate: false - xy: 3847, 337 + xy: 4001, 3475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor rotate: false - xy: 3565, 1175 + xy: 1889, 3171 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-bottom rotate: false - xy: 3695, 1305 + xy: 1887, 3041 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-light rotate: false - xy: 3695, 1175 + xy: 2019, 3131 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-0 rotate: false - xy: 3825, 1305 + xy: 2017, 3001 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-1 rotate: false - xy: 3825, 1175 + xy: 2149, 3131 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-2 rotate: false - xy: 3955, 1305 + xy: 2147, 3001 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-3 rotate: false - xy: 3955, 1175 + xy: 1887, 2911 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 power-node rotate: false - xy: 3627, 145 + xy: 1863, 2123 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 2995, 216 + xy: 1255, 2431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source rotate: false - xy: 3661, 145 + xy: 1881, 2089 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 3525, 111 + xy: 1881, 2055 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 3701, 649 + xy: 1255, 2299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 3831, 99 + xy: 817, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 3865, 65 + xy: 845, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 3395, 979 + xy: 3063, 2973 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +steam-generator + rotate: false + xy: 1387, 2267 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-cap + rotate: false + xy: 1453, 2333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-top + rotate: false + xy: 1519, 2399 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine0 + rotate: false + xy: 1387, 2201 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine1 + rotate: false + xy: 1453, 2267 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 surge-tower rotate: false - xy: 3127, 177 + xy: 1519, 2333 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 1863, 449 + xy: 1453, 2201 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 3591, 979 + xy: 3259, 2955 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 3689, 979 + xy: 3357, 3151 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-top rotate: false - xy: 3787, 979 + xy: 3357, 3053 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -turbine-generator - rotate: false - xy: 361, 21 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-cap - rotate: false - xy: 427, 21 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-top - rotate: false - xy: 2449, 282 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-turbine0 - rotate: false - xy: 2515, 282 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-turbine1 - rotate: false - xy: 2411, 216 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 alloy-smelter rotate: false - xy: 1493, 260 + xy: 2377, 3084 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 1591, 249 + xy: 2277, 2986 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-mixer rotate: false - xy: 2789, 464 + xy: 645, 533 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-forge rotate: false - xy: 1693, 347 + xy: 2473, 2888 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 coal-centrifuge rotate: false - xy: 2665, 299 + xy: 707, 25 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-bottom rotate: false - xy: 3331, 781 + xy: 737, 1137 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 3397, 847 + xy: 737, 1071 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 3463, 913 + xy: 737, 1005 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator rotate: false - xy: 3397, 781 + xy: 737, 939 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 3463, 847 + xy: 732, 873 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 3529, 913 + xy: 773, 25 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 disassembler rotate: false - xy: 2179, 288 + xy: 2415, 2594 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-liquid rotate: false - xy: 2215, 190 + xy: 2219, 2496 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-spinner rotate: false - xy: 2215, 92 + xy: 2317, 2496 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press rotate: false - xy: 3661, 913 + xy: 1057, 2529 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 incinerator rotate: false - xy: 3881, 337 + xy: 3895, 3441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 3755, 235 + xy: 3703, 2991 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 4061, 235 + xy: 3703, 2923 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln rotate: false - xy: 3595, 781 + xy: 991, 2397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-top rotate: false - xy: 3661, 847 + xy: 1057, 2463 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 3661, 847 + xy: 1057, 2463 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 4055, 201 + xy: 3737, 2897 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-void rotate: false - xy: 3749, 167 + xy: 2629, 2116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 3919, 167 + xy: 1761, 2191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press rotate: false - xy: 3799, 1077 + xy: 893, 2109 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 3503, 715 + xy: 1123, 2067 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 3569, 715 + xy: 1123, 2001 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 3635, 715 + xy: 1189, 2563 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 3701, 715 + xy: 1189, 2497 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 3767, 715 + xy: 1255, 2563 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 3695, 117 + xy: 783, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 3695, 83 + xy: 783, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 3437, 649 + xy: 1189, 2299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator rotate: false - xy: 3119, 507 + xy: 1255, 2035 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 3061, 441 + xy: 1321, 2101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-spinner rotate: false - xy: 3061, 375 + xy: 1321, 2035 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-crucible rotate: false - xy: 3199, 967 + xy: 3161, 3053 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-crucible-top rotate: false - xy: 3297, 979 + xy: 3259, 3053 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 3061, 309 + xy: 1387, 2465 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press rotate: false - xy: 3061, 243 + xy: 1453, 2465 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame0 rotate: false - xy: 3127, 441 + xy: 1387, 2399 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame1 rotate: false - xy: 3127, 375 + xy: 1519, 2465 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame2 rotate: false - xy: 3127, 309 + xy: 1387, 2333 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-liquid rotate: false - xy: 3127, 243 + xy: 1453, 2399 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-top rotate: false - xy: 3061, 177 + xy: 1585, 2465 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -rock1 +boulder1 rotate: false - xy: 3559, 499 + xy: 1517, 1969 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -rock2 +boulder2 rotate: false - xy: 3851, 549 + xy: 3595, 2897 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder1 + rotate: false + xy: 1701, 2483 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder2 + rotate: false + xy: 1701, 2433 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-boulder1 rotate: false - xy: 3865, 99 + xy: 817, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-boulder2 rotate: false - xy: 3899, 99 + xy: 817, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder1 rotate: false - xy: 3763, 65 + xy: 811, 465 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder2 rotate: false - xy: 3797, 65 + xy: 811, 431 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -snowrock1 +snow-boulder1 rotate: false - xy: 3509, 399 + xy: 2251, 2248 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -snowrock2 +snow-boulder2 rotate: false - xy: 3559, 449 + xy: 2301, 2298 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-cluster1 rotate: false - xy: 1607, 11 + xy: 747, 1551 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster2 rotate: false - xy: 1649, 11 + xy: 745, 1509 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster3 rotate: false - xy: 1691, 11 + xy: 745, 1467 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 white-tree rotate: false - xy: 1, 411 + xy: 1, 2459 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead rotate: false - xy: 1322, 1727 + xy: 1322, 3775 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead-shadow rotate: false - xy: 1, 1699 + xy: 1, 3747 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 white-tree-shadow rotate: false - xy: 1, 1699 + xy: 1, 3747 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 container rotate: false - xy: 2797, 266 + xy: 2669, 2891 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation rotate: false - xy: 2383, 1016 + xy: 389, 235 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-foundation-team rotate: false - xy: 1001, 339 + xy: 389, 105 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus rotate: false - xy: 1573, 999 + xy: 3471, 3611 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-nucleus-team rotate: false - xy: 1573, 837 + xy: 1477, 2987 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard rotate: false - xy: 1791, 347 + xy: 3755, 3401 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard-team rotate: false - xy: 1885, 249 + xy: 1921, 2467 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 unloader rotate: false - xy: 3693, 15 + xy: 1027, 1797 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-center rotate: false - xy: 2841, 74 + xy: 959, 1695 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault rotate: false - xy: 3983, 979 + xy: 3357, 2955 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-heat rotate: false - xy: 2179, 254 + xy: 3343, 3773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-1 rotate: false - xy: 4057, 809 + xy: 859, 1841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-2 rotate: false - xy: 2855, 464 + xy: 645, 467 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-3 rotate: false - xy: 1529, 151 + xy: 2277, 2790 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-4 rotate: false - xy: 3885, 1435 + xy: 445, 1153 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 hail-heat rotate: false - xy: 1481, 22 + xy: 3857, 3539 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 3661, 781 + xy: 1057, 2397 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 2351, 756 + xy: 1887, 2781 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 2873, 869 + xy: 3063, 3169 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 3833, 649 + xy: 1189, 2167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 3899, 649 + xy: 1255, 2233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 3965, 649 + xy: 1321, 2299 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-heat rotate: false - xy: 3967, 99 + xy: 811, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 2609, 216 + xy: 1585, 2201 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 additive-reconstructor rotate: false - xy: 1595, 347 + xy: 3195, 3249 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 additive-reconstructor-top rotate: false - xy: 2481, 788 + xy: 3293, 3249 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory rotate: false - xy: 2481, 690 + xy: 2279, 3084 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 command-center rotate: false - xy: 2731, 266 + xy: 2671, 2957 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 exponential-reconstructor rotate: false - xy: 1129, 791 + xy: 807, 3097 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 exponential-reconstructor-top rotate: false - xy: 775, 243 + xy: 1033, 3323 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-in-3 rotate: false - xy: 2353, 658 + xy: 2415, 2496 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 factory-in-5 rotate: false - xy: 2059, 1070 + xy: 3041, 3451 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 factory-in-7 rotate: false - xy: 743, 17 + xy: 807, 2871 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-in-9 rotate: false - xy: 323, 1409 + xy: 2804, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 factory-out-3 rotate: false - xy: 2353, 560 + xy: 2215, 2398 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 factory-out-5 rotate: false - xy: 2221, 1232 + xy: 2061, 3261 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 factory-out-7 rotate: false - xy: 839, 469 + xy: 1033, 3097 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-out-9 rotate: false - xy: 323, 1119 + xy: 1, 719 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 factory-top-3 rotate: false - xy: 2451, 592 + xy: 2313, 2398 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ground-factory rotate: false - xy: 2451, 494 + xy: 2513, 2426 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor rotate: false - xy: 2059, 908 + xy: 3203, 3449 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 multiplicative-reconstructor-top rotate: false - xy: 2221, 1070 + xy: 3365, 3449 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory rotate: false - xy: 3897, 1077 + xy: 697, 2013 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rally-point rotate: false - xy: 3503, 649 + xy: 1255, 2365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-base rotate: false - xy: 3763, 99 + xy: 783, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point rotate: false - xy: 3569, 649 + xy: 1321, 2431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tetrative-reconstructor rotate: false - xy: 323, 829 + xy: 3094, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 tetrative-reconstructor-top rotate: false - xy: 323, 539 + xy: 1, 429 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 3957, 405 + xy: 2697, 2226 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 2863, 266 + xy: 2669, 2825 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door rotate: false - xy: 3991, 371 + xy: 2663, 2184 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large rotate: false - xy: 3529, 847 + xy: 1013, 2595 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 3595, 913 + xy: 1079, 2595 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-open rotate: false - xy: 4025, 379 + xy: 2697, 2192 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 4055, 133 + xy: 1779, 2063 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 3437, 715 + xy: 1123, 2133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-wall rotate: false - xy: 3423, 147 + xy: 1847, 2021 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large rotate: false - xy: 3833, 715 + xy: 1189, 2431 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-gigantic rotate: false - xy: 1261, 401 + xy: 2279, 3182 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge2 rotate: false - xy: 3167, 869 + xy: 3161, 3151 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge3 rotate: false - xy: 3167, 771 + xy: 3259, 3151 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-large1 rotate: false - xy: 3059, 639 + xy: 1255, 2167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large2 rotate: false - xy: 3125, 639 + xy: 1321, 2233 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large3 rotate: false - xy: 3049, 573 + xy: 1189, 2035 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large4 rotate: false - xy: 3115, 573 + xy: 1255, 2101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall2 rotate: false - xy: 4001, 99 + xy: 811, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 4035, 99 + xy: 811, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 3729, 65 + xy: 811, 499 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 3729, 65 + xy: 811, 499 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 3387, 79 + xy: 1029, 1933 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 3191, 637 + xy: 1585, 2399 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 3489, 87 + xy: 1029, 1899 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 229, 21 + xy: 1519, 2267 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster rotate: false - xy: 1261, 271 + xy: 2491, 3312 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-wall rotate: false - xy: 3965, 31 + xy: 993, 1797 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large rotate: false - xy: 295, 21 + xy: 1585, 2333 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 bullet rotate: false - xy: 3251, 177 + xy: 1639, 3095 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 2675, 245 + xy: 1831, 3029 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 casing rotate: false - xy: 2049, 1538 + xy: 3557, 3315 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 circle-end rotate: false - xy: 1455, 542 + xy: 595, 2318 size: 100, 199 orig: 100, 199 offset: 0, 0 index: -1 circle-mid rotate: false - xy: 4094, 1845 + xy: 4086, 3896 size: 1, 199 orig: 1, 199 offset: 0, 0 index: -1 circle-shadow rotate: false - xy: 2252, 1556 + xy: 2330, 3604 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 error rotate: false - xy: 2824, 116 + xy: 1801, 2433 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 laser rotate: false - xy: 1125, 481 + xy: 3057, 2993 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 laser-end rotate: false - xy: 2429, 420 + xy: 673, 1773 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 minelaser rotate: false - xy: 3365, 653 + xy: 2273, 3262 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 2503, 420 + xy: 673, 1699 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 missile rotate: false - xy: 2313, 776 + xy: 2019, 3263 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 missile-back rotate: false - xy: 1733, 15 + xy: 745, 1429 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 parallax-laser rotate: false - xy: 317, 361 + xy: 691, 2022 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 parallax-laser-end rotate: false - xy: 2577, 422 + xy: 673, 1625 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 particle rotate: false - xy: 1565, 11 + xy: 747, 1593 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 scale_marker rotate: false - xy: 1, 1 + xy: 2351, 2248 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 shell rotate: false - xy: 1771, 15 + xy: 745, 1391 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 1809, 15 + xy: 745, 1353 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 transfer rotate: false - xy: 543, 263 + xy: 285, 379 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 3999, 31 + xy: 959, 1729 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white rotate: false - xy: 1557, 542 + xy: 660, 987 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 alpha-wreck0 rotate: false - xy: 3297, 587 + xy: 3653, 3045 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-wreck1 rotate: false - xy: 3301, 537 + xy: 3653, 2995 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-wreck2 rotate: false - xy: 3309, 487 + xy: 3653, 2945 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 antumbra-wreck0 rotate: false - xy: 1355, 985 + xy: 1259, 3065 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck1 rotate: false - xy: 1355, 743 + xy: 1251, 2823 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck2 rotate: false - xy: 1613, 1485 + xy: 1485, 3533 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 arc rotate: false - xy: 229, 87 + xy: 3309, 3773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 arkyid-wreck0 rotate: false - xy: 3105, 1435 + xy: 453, 1673 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 arkyid-wreck1 rotate: false - xy: 3964, 1789 + xy: 453, 1543 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 arkyid-wreck2 rotate: false - xy: 3235, 1435 + xy: 291, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 atrax-wreck0 rotate: false - xy: 1391, 272 + xy: 583, 1705 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-wreck1 rotate: false - xy: 3059, 705 + xy: 583, 1639 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-wreck2 rotate: false - xy: 3149, 705 + xy: 583, 1573 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 beta-wreck0 rotate: false - xy: 3309, 229 + xy: 1585, 2101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 beta-wreck1 rotate: false - xy: 3305, 179 + xy: 1584, 2051 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 beta-wreck2 rotate: false - xy: 2587, 100 + xy: 1503, 2019 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-additive-reconstructor-full rotate: false - xy: 1529, 53 + xy: 2375, 2888 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-air-factory-full rotate: false - xy: 1627, 151 + xy: 2375, 2790 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-arc-full rotate: false - xy: 3409, 215 + xy: 893, 1841 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-basalt-full + rotate: false + xy: 927, 1841 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-drill-full rotate: false - xy: 2525, 1293 + xy: 445, 1023 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -block-char-full +block-boulder-full rotate: false - xy: 3477, 215 - size: 32, 32 - orig: 32, 32 + xy: 1367, 1961 + size: 48, 48 + orig: 48, 48 offset: 0, 0 index: -1 -block-cliffs-full +block-char-full rotate: false - xy: 3511, 223 + xy: 789, 1773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conduit-full rotate: false - xy: 2413, 8 + xy: 823, 1807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conveyor-full rotate: false - xy: 3659, 423 + xy: 789, 1739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 3659, 423 + xy: 789, 1739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-foundation-full rotate: false - xy: 2525, 1163 + xy: 1401, 2531 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-core-nucleus-full rotate: false - xy: 1573, 1323 + xy: 3900, 3509 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 block-core-shard-full rotate: false - xy: 1627, 53 + xy: 2475, 3084 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-craters-full rotate: false - xy: 3559, 281 + xy: 857, 1807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cryofluidmixer-full rotate: false - xy: 2921, 464 + xy: 717, 751 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cultivator-full rotate: false - xy: 2665, 365 + xy: 717, 685 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cyclone-full rotate: false - xy: 1689, 249 + xy: 2473, 2986 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +block-dacite-boulder-full + rotate: false + xy: 1417, 1961 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dacite-full + rotate: false + xy: 823, 1773 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-wall-full + rotate: false + xy: 789, 1705 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 block-dark-metal-full rotate: false - xy: 3593, 281 + xy: 891, 1807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-full rotate: false - xy: 3025, 148 + xy: 857, 1773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dunerocks-full +block-dirt-full rotate: false - xy: 3024, 114 + xy: 823, 1739 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-full + rotate: false + xy: 789, 1671 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dune-wall-full + rotate: false + xy: 925, 1807 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-full rotate: false - xy: 3024, 80 + xy: 891, 1773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-exponential-reconstructor-full rotate: false - xy: 1129, 1243 + xy: 323, 2489 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 block-fuse-full rotate: false - xy: 1725, 151 + xy: 2473, 2790 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-grass-full rotate: false - xy: 3059, 143 + xy: 857, 1739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ground-factory-full rotate: false - xy: 1725, 53 + xy: 2277, 2692 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-hail-full rotate: false - xy: 3093, 143 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-full - rotate: false - xy: 3127, 143 + xy: 823, 1705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hotrock-full rotate: false - xy: 3058, 109 + xy: 789, 1637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-full rotate: false - xy: 3092, 109 + xy: 925, 1773 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-snow-full rotate: false - xy: 3126, 109 + xy: 891, 1739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-icerocks-full +block-ice-wall-full rotate: false - xy: 3058, 75 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-full - rotate: false - xy: 3092, 75 + xy: 857, 1705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-impact-reactor-full rotate: false - xy: 2655, 1293 + xy: 549, 2585 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-lancer-full rotate: false - xy: 2987, 480 + xy: 717, 619 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-laser-drill-full rotate: false - xy: 1787, 249 + xy: 2375, 2692 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-liquid-router-full rotate: false - xy: 3126, 75 + xy: 823, 1671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-tank-full rotate: false - xy: 1823, 151 + xy: 2473, 2692 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-magmarock-full rotate: false - xy: 3024, 46 + xy: 789, 1603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mass-driver-full rotate: false - xy: 1863, 613 + xy: 3625, 3369 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-mechanical-drill-full rotate: false - xy: 2215, 26 + xy: 711, 553 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-meltdown-full rotate: false - xy: 2655, 1163 + xy: 679, 2599 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-metal-floor-damaged-full rotate: false - xy: 3058, 41 + xy: 925, 1739 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-moss-full rotate: false - xy: 3126, 41 + xy: 857, 1671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-multiplicative-reconstructor-full rotate: false - xy: 1573, 1161 + xy: 3309, 3611 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 block-naval-factory-full rotate: false - xy: 1863, 515 + xy: 2573, 3112 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-oil-extractor-full rotate: false - xy: 1961, 641 + xy: 2671, 3121 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-ore-coal-full rotate: false - xy: 2587, 16 + xy: 823, 1637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-full rotate: false - xy: 2621, 15 + xy: 789, 1569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-full rotate: false - xy: 3651, 389 + xy: 925, 1705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-full rotate: false - xy: 3643, 355 + xy: 891, 1671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-full rotate: false - xy: 3643, 321 + xy: 857, 1637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-full rotate: false - xy: 3551, 247 + xy: 823, 1603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-parallax-full rotate: false - xy: 2281, 26 + xy: 711, 487 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-payload-conveyor-full rotate: false - xy: 1961, 543 + xy: 217, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-icon rotate: false - xy: 1961, 543 + xy: 217, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-payload-router-full rotate: false - xy: 2059, 680 + xy: 315, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon rotate: false - xy: 2059, 680 + xy: 315, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-pebbles-full rotate: false - xy: 3585, 247 + xy: 925, 1671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-weaver-full rotate: false - xy: 2347, 26 + xy: 711, 421 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-plated-conduit-full rotate: false - xy: 3545, 213 + xy: 891, 1637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pneumatic-drill-full rotate: false - xy: 2731, 398 + xy: 645, 401 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-pulse-conduit-full rotate: false - xy: 3579, 213 + xy: 857, 1603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulverizer-full rotate: false - xy: 3511, 189 + xy: 823, 1569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-repair-point-full rotate: false - xy: 3545, 179 + xy: 925, 1637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ripple-full rotate: false - xy: 2059, 582 + xy: 413, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -block-rock-full +block-salt-wall-full rotate: false - xy: 2587, 50 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rocks-full - rotate: false - xy: 3579, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-saltrocks-full - rotate: false - xy: 3627, 281 + xy: 891, 1603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-salvo-full rotate: false - xy: 2797, 398 + xy: 649, 335 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-sand-boulder-full rotate: false - xy: 3619, 247 + xy: 857, 1569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-full rotate: false - xy: 3613, 213 + xy: 925, 1603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sandrocks-full +block-sand-wall-full rotate: false - xy: 3613, 179 + xy: 891, 1569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scatter-full rotate: false - xy: 2863, 398 + xy: 649, 269 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-scorch-full rotate: false - xy: 2705, 82 + xy: 925, 1569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-full rotate: false - xy: 2739, 82 + xy: 2685, 2294 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall1 rotate: false - xy: 2739, 82 + xy: 2685, 2294 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-huge-full rotate: false - xy: 2059, 484 + xy: 511, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge1 rotate: false - xy: 2059, 484 + xy: 511, 7 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-scrap-wall-large-full rotate: false - xy: 2929, 398 + xy: 649, 203 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-segment-full rotate: false - xy: 2995, 414 + xy: 649, 137 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-shale-boulder-full rotate: false - xy: 2773, 82 + xy: 2085, 2213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-full rotate: false - xy: 2739, 48 + xy: 2119, 2213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shalerocks-full +block-shale-wall-full rotate: false - xy: 2807, 82 + xy: 2153, 2213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shrubs-full rotate: false - xy: 2773, 48 + xy: 789, 1535 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snow-full +block-snow-boulder-full rotate: false - xy: 2807, 48 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-full - rotate: false - xy: 1431, 14 + xy: 1467, 1961 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snowrocks-full +block-snow-full rotate: false - xy: 2655, 9 + xy: 823, 1535 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-wall-full + rotate: false + xy: 857, 1535 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spectre-full rotate: false - xy: 2785, 1293 + xy: 809, 2599 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-spore-cluster-full rotate: false - xy: 1359, 1 + xy: 655, 2543 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-moss-full rotate: false - xy: 2689, 9 + xy: 891, 1535 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-press-full rotate: false - xy: 2731, 332 + xy: 715, 355 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -block-sporerocks-full +block-spore-wall-full rotate: false - xy: 2723, 14 + xy: 925, 1535 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +block-steam-generator-full + rotate: false + xy: 715, 289 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 block-stone-full rotate: false - xy: 2757, 14 + xy: 787, 1501 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-full + rotate: false + xy: 787, 1467 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-swarmer-full rotate: false - xy: 2797, 332 + xy: 715, 223 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-tendrils-full rotate: false - xy: 2791, 14 + xy: 783, 1433 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tetrative-reconstructor-full rotate: false - xy: 1, 121 + xy: 1, 2169 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 block-titanium-conveyor-full rotate: false - xy: 2825, 14 + xy: 821, 1501 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 2825, 14 + xy: 821, 1501 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-turbine-generator-full - rotate: false - xy: 2863, 332 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 block-water-extractor-full rotate: false - xy: 2929, 332 + xy: 715, 157 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-wave-full rotate: false - xy: 2995, 348 + xy: 715, 91 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 bryde-wreck0 rotate: false - xy: 2537, 1423 + xy: 291, 495 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-wreck1 rotate: false - xy: 2679, 1423 + xy: 453, 2347 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-wreck2 rotate: false - xy: 2821, 1423 + xy: 453, 2205 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 core-foundation-team-crux rotate: false - xy: 2375, 886 + xy: 421, 365 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-foundation-team-sharded rotate: false - xy: 3045, 1293 + xy: 1531, 2531 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-team-crux rotate: false - xy: 1735, 1323 + xy: 1469, 2825 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-nucleus-team-sharded rotate: false - xy: 1735, 1161 + xy: 1401, 2661 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-team-crux rotate: false - xy: 1889, 347 + xy: 2573, 3014 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard-team-sharded rotate: false - xy: 1987, 347 + xy: 2671, 3023 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-1-0 rotate: false - xy: 3729, 287 + xy: 3853, 3379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-1 rotate: false - xy: 3721, 253 + xy: 2001, 2195 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-2 rotate: false - xy: 3991, 405 + xy: 2357, 2186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-3 rotate: false - xy: 4025, 413 + xy: 2391, 2180 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-4 rotate: false - xy: 3753, 371 + xy: 2425, 2180 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-5 rotate: false - xy: 3787, 371 + xy: 2459, 2180 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-6 rotate: false - xy: 3821, 371 + xy: 2493, 2168 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-7 rotate: false - xy: 3855, 371 + xy: 2527, 2168 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-2-0 rotate: false - xy: 2929, 266 + xy: 2669, 2759 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-1 rotate: false - xy: 2995, 282 + xy: 2669, 2693 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-2 rotate: false - xy: 3265, 901 + xy: 2669, 2627 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-3 rotate: false - xy: 3265, 835 + xy: 2709, 2561 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-4 rotate: false - xy: 3265, 769 + xy: 2709, 2495 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-5 rotate: false - xy: 3331, 913 + xy: 2709, 2429 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-6 rotate: false - xy: 3331, 847 + xy: 737, 1269 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-7 rotate: false - xy: 3397, 913 + xy: 737, 1203 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-3-0 rotate: false - xy: 1983, 249 + xy: 2571, 2916 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-1 rotate: false - xy: 1921, 151 + xy: 2571, 2818 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-2 rotate: false - xy: 1921, 53 + xy: 2571, 2720 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-3 rotate: false - xy: 2019, 151 + xy: 2571, 2622 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-4 rotate: false - xy: 2019, 53 + xy: 2023, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-5 rotate: false - xy: 2081, 249 + xy: 2121, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-6 rotate: false - xy: 2117, 151 + xy: 2023, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-7 rotate: false - xy: 2117, 53 + xy: 2121, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-4-0 rotate: false - xy: 3045, 1163 + xy: 1661, 2533 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-1 rotate: false - xy: 3175, 1305 + xy: 1791, 2533 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-2 rotate: false - xy: 3175, 1175 + xy: 519, 235 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-3 rotate: false - xy: 3305, 1305 + xy: 519, 105 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-4 rotate: false - xy: 3305, 1175 + xy: 445, 893 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-5 rotate: false - xy: 3435, 1305 + xy: 433, 763 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-6 rotate: false - xy: 3435, 1175 + xy: 433, 633 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-7 rotate: false - xy: 3565, 1305 + xy: 433, 503 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-5-0 rotate: false - xy: 1735, 837 + xy: 1631, 2825 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-1 rotate: false - xy: 1897, 1355 + xy: 1725, 2663 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-2 rotate: false - xy: 1897, 1193 + xy: 2069, 3423 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-3 rotate: false - xy: 1897, 1031 + xy: 2231, 3442 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-4 rotate: false - xy: 1897, 869 + xy: 2393, 3442 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-5 rotate: false - xy: 2059, 1394 + xy: 2555, 3451 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-6 rotate: false - xy: 2059, 1232 + xy: 2717, 3451 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-7 rotate: false - xy: 2221, 1394 + xy: 2879, 3451 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-6-0 rotate: false - xy: 2455, 1565 + xy: 2533, 3613 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-1 rotate: false - xy: 2649, 1565 + xy: 2727, 3613 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-2 rotate: false - xy: 2843, 1565 + xy: 2921, 3613 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-3 rotate: false - xy: 3037, 1565 + xy: 3115, 3613 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-4 rotate: false - xy: 3231, 1565 + xy: 1703, 3471 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-5 rotate: false - xy: 3425, 1565 + xy: 1695, 3277 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-6 rotate: false - xy: 3619, 1565 + xy: 1693, 3083 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-7 rotate: false - xy: 3813, 1565 + xy: 1013, 2661 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-7-0 rotate: false - xy: 1387, 1501 + xy: 581, 3549 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-1 rotate: false - xy: 871, 727 + xy: 807, 3549 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-2 rotate: false - xy: 1129, 1017 + xy: 581, 3323 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-3 rotate: false - xy: 613, 469 + xy: 1033, 3549 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-4 rotate: false - xy: 323, 313 + xy: 581, 3097 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-5 rotate: false - xy: 291, 87 + xy: 807, 3323 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-6 rotate: false - xy: 549, 243 + xy: 1259, 3549 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-7-7 rotate: false - xy: 517, 17 + xy: 581, 2871 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 cracks-8-0 rotate: false - xy: 613, 1469 + xy: 1, 171 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-1 rotate: false - xy: 613, 1211 + xy: 3384, 3773 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-2 rotate: false - xy: 871, 1469 + xy: 3656, 3839 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-3 rotate: false - xy: 613, 953 + xy: 3642, 3581 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-4 rotate: false - xy: 871, 1211 + xy: 323, 3489 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-5 rotate: false - xy: 1129, 1469 + xy: 323, 3231 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-6 rotate: false - xy: 613, 695 + xy: 323, 2973 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-8-7 rotate: false - xy: 871, 953 + xy: 323, 2715 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 cracks-9-0 rotate: false - xy: 1644, 1759 + xy: 1644, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-1 rotate: false - xy: 1934, 1759 + xy: 1, 1879 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-2 rotate: false - xy: 2224, 1759 + xy: 1934, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-3 rotate: false - xy: 2514, 1759 + xy: 1, 1589 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-4 rotate: false - xy: 2804, 1759 + xy: 2224, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-5 rotate: false - xy: 3094, 1759 + xy: 1, 1299 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-6 rotate: false - xy: 3384, 1759 + xy: 2514, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-7 rotate: false - xy: 3674, 1759 + xy: 1, 1009 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 crawler-wreck0 rotate: false - xy: 2929, 216 + xy: 1651, 2331 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-wreck1 rotate: false - xy: 2725, 166 + xy: 1651, 2281 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-wreck2 rotate: false - xy: 2775, 166 + xy: 1651, 2231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 cyclone rotate: false - xy: 2085, 386 + xy: 2019, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dagger-wreck0 rotate: false - xy: 2975, 166 + xy: 1801, 2483 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-wreck1 rotate: false - xy: 2724, 116 + xy: 1701, 2333 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-wreck2 rotate: false - xy: 2774, 116 + xy: 1751, 2383 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 duo rotate: false - xy: 3745, 337 + xy: 3899, 3475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 eclipse-wreck0 rotate: false - xy: 1, 1055 + xy: 1, 3103 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck1 rotate: false - xy: 678, 1727 + xy: 678, 3775 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck2 rotate: false - xy: 1, 733 + xy: 1, 2781 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 flare-wreck0 rotate: false - xy: 2974, 58 + xy: 1851, 2425 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flare-wreck1 rotate: false - xy: 3347, 599 + xy: 1701, 2233 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flare-wreck2 rotate: false - xy: 3397, 599 + xy: 1751, 2275 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 fortress-wreck0 rotate: false - xy: 1557, 547 + xy: 595, 2236 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-wreck1 rotate: false - xy: 1659, 629 + xy: 595, 2154 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-wreck2 rotate: false - xy: 1659, 547 + xy: 595, 2072 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fuse rotate: false - xy: 2313, 92 + xy: 2611, 2524 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 gamma-wreck0 rotate: false - xy: 2529, 34 + xy: 1387, 2011 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 gamma-wreck1 rotate: false - xy: 1757, 449 + xy: 1445, 2011 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 gamma-wreck2 rotate: false - xy: 3181, 579 + xy: 3625, 3311 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 hail rotate: false - xy: 3779, 337 + xy: 3933, 3475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 horizon-wreck0 rotate: false - xy: 2975, 546 + xy: 1793, 2858 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-wreck1 rotate: false - xy: 2281, 411 + xy: 675, 1921 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-wreck2 rotate: false - xy: 2355, 420 + xy: 675, 1847 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 item-blast-compound-large rotate: false - xy: 3323, 661 + xy: 1145, 2619 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-blast-compound-medium rotate: false - xy: 3983, 337 + xy: 3997, 3441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 2059, 458 + xy: 3501, 3423 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-blast-compound-tiny rotate: false - xy: 3729, 133 + xy: 3161, 3249 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-blast-compound-xlarge rotate: false - xy: 3597, 599 + xy: 1851, 2325 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-coal-large rotate: false - xy: 3559, 357 + xy: 2601, 2286 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-coal-medium rotate: false - xy: 3797, 303 + xy: 3929, 3407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-small rotate: false - xy: 2841, 48 + xy: 4062, 3509 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-coal-tiny rotate: false - xy: 2647, 332 + xy: 2001, 2449 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-coal-xlarge rotate: false - xy: 3647, 599 + xy: 1751, 2225 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-copper-large rotate: false - xy: 3609, 399 + xy: 2643, 2286 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-copper-medium rotate: false - xy: 3865, 303 + xy: 3997, 3407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-small rotate: false - xy: 291, 385 + xy: 1644, 3781 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-copper-tiny rotate: false - xy: 2647, 314 + xy: 745, 1335 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-copper-xlarge rotate: false - xy: 3697, 599 + xy: 1801, 2233 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-graphite-large rotate: false - xy: 3659, 457 + xy: 3857, 3497 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-graphite-medium rotate: false - xy: 3933, 303 + xy: 4031, 3441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-small rotate: false - xy: 517, 287 + xy: 1207, 2829 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-graphite-tiny rotate: false - xy: 2647, 296 + xy: 1233, 2837 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-graphite-xlarge rotate: false - xy: 3747, 599 + xy: 1851, 2275 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-lead-large rotate: false - xy: 3709, 507 + xy: 3853, 3455 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-lead-medium rotate: false - xy: 4059, 413 + xy: 3887, 3373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-small rotate: false - xy: 1644, 1733 + xy: 323, 2463 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-lead-tiny rotate: false - xy: 1847, 1 + xy: 763, 1335 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-lead-xlarge rotate: false - xy: 3797, 599 + xy: 1851, 2225 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-metaglass-large rotate: false - xy: 4001, 557 + xy: 3853, 3413 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-metaglass-medium rotate: false - xy: 3763, 269 + xy: 3955, 3373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-small rotate: false - xy: 1387, 1475 + xy: 259, 403 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-metaglass-tiny rotate: false - xy: 1865, 1 + xy: 691, 1995 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-metaglass-xlarge rotate: false - xy: 3847, 599 + xy: 1901, 2417 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-phase-fabric-large rotate: false - xy: 3509, 257 + xy: 1651, 2189 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-phase-fabric-medium rotate: false - xy: 3831, 269 + xy: 4023, 3373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-small rotate: false - xy: 1831, 1491 + xy: 549, 2493 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-phase-fabric-tiny rotate: false - xy: 1883, 1 + xy: 709, 1995 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-phase-fabric-xlarge rotate: false - xy: 3897, 599 + xy: 1951, 2417 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-plastanium-large rotate: false - xy: 3559, 315 + xy: 1645, 2147 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-plastanium-medium rotate: false - xy: 3899, 269 + xy: 4062, 3637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-small rotate: false - xy: 871, 701 + xy: 2539, 3184 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-plastanium-tiny rotate: false - xy: 1901, 1 + xy: 727, 1995 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-plastanium-xlarge rotate: false - xy: 3947, 599 + xy: 1901, 2367 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-pyratite-large rotate: false - xy: 3601, 357 + xy: 1635, 2105 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-pyratite-medium rotate: false - xy: 3967, 269 + xy: 4062, 3569 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-small rotate: false - xy: 1097, 927 + xy: 1793, 2832 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-pyratite-tiny rotate: false - xy: 1919, 1 + xy: 781, 1335 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-pyratite-xlarge rotate: false - xy: 3997, 599 + xy: 1901, 2317 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-sand-large rotate: false - xy: 3751, 507 + xy: 2501, 2236 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-sand-medium rotate: false - xy: 4001, 269 + xy: 3703, 3161 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-small rotate: false - xy: 1001, 247 + xy: 649, 111 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-sand-tiny rotate: false - xy: 1937, 1 + xy: 1897, 3647 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-sand-xlarge rotate: false - xy: 4047, 599 + xy: 1951, 2367 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-scrap-large rotate: false - xy: 4043, 557 + xy: 2543, 2236 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-scrap-medium rotate: false - xy: 4051, 345 + xy: 3703, 3093 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-small rotate: false - xy: 2027, 843 + xy: 2737, 2997 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-scrap-tiny rotate: false - xy: 1955, 1 + xy: 2127, 3586 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-scrap-xlarge rotate: false - xy: 3351, 549 + xy: 1901, 2267 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-silicon-large rotate: false - xy: 3601, 315 + xy: 749, 1971 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-silicon-medium rotate: false - xy: 4035, 269 + xy: 3703, 3025 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-small rotate: false - xy: 2451, 730 + xy: 3723, 3441 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-silicon-tiny rotate: false - xy: 1973, 1 + xy: 1639, 2988 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-silicon-xlarge rotate: false - xy: 3401, 549 + xy: 1951, 2317 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-spore-pod-large rotate: false - xy: 3793, 507 + xy: 749, 1929 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-spore-pod-medium rotate: false - xy: 3823, 235 + xy: 3737, 3169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-small rotate: false - xy: 3964, 1763 + xy: 394, 3749 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-spore-pod-tiny rotate: false - xy: 1991, 1 + xy: 707, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-spore-pod-xlarge rotate: false - xy: 3451, 549 + xy: 1951, 2267 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-surge-alloy-large rotate: false - xy: 3835, 507 + xy: 749, 1887 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-surge-alloy-medium rotate: false - xy: 3891, 235 + xy: 3737, 3101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 1929, 489 + xy: 39, 3 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-surge-alloy-tiny rotate: false - xy: 2009, 1 + xy: 1831, 3011 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-surge-alloy-xlarge rotate: false - xy: 3501, 549 + xy: 1901, 2217 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-thorium-large rotate: false - xy: 3877, 507 + xy: 749, 1845 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-thorium-medium rotate: false - xy: 3959, 235 + xy: 3737, 3033 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 2189, 882 + xy: 1869, 2199 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-thorium-tiny rotate: false - xy: 2027, 1 + xy: 1367, 2017 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-thorium-xlarge rotate: false - xy: 3551, 549 + xy: 1951, 2217 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-titanium-large rotate: false - xy: 3919, 507 + xy: 747, 1803 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-titanium-medium rotate: false - xy: 4027, 235 + xy: 3737, 2965 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 1401, 17 + xy: 777, 423 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-titanium-tiny rotate: false - xy: 2045, 1 + xy: 1901, 2515 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-titanium-xlarge rotate: false - xy: 3601, 549 + xy: 2001, 2397 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lancer rotate: false - xy: 3727, 913 + xy: 991, 2331 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 liquid-cryofluid-large rotate: false - xy: 3961, 507 + xy: 747, 1761 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-cryofluid-medium rotate: false - xy: 3715, 219 + xy: 1517, 1935 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-small rotate: false - xy: 432, 1701 + xy: 798, 879 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-cryofluid-tiny rotate: false - xy: 2063, 1 + xy: 3045, 3271 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-cryofluid-xlarge rotate: false - xy: 3359, 431 + xy: 2001, 2279 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-oil-large rotate: false - xy: 4003, 515 + xy: 747, 1719 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-oil-medium rotate: false - xy: 3783, 201 + xy: 1835, 2191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-small rotate: false - xy: 263, 95 + xy: 993, 1737 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-oil-tiny rotate: false - xy: 2081, 1 + xy: 3045, 3253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-oil-xlarge rotate: false - xy: 3409, 499 + xy: 2101, 2397 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-slag-large rotate: false - xy: 4045, 515 + xy: 747, 1677 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-slag-medium rotate: false - xy: 4021, 201 + xy: 1677, 2079 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-small rotate: false - xy: 2187, 27 + xy: 1027, 1771 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-slag-tiny rotate: false - xy: 2099, 1 + xy: 217, 111 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-slag-xlarge rotate: false - xy: 3701, 549 + xy: 2051, 2347 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-water-large rotate: false - xy: 1523, 11 + xy: 747, 1635 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-water-medium rotate: false - xy: 3817, 167 + xy: 2697, 2124 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-small rotate: false - xy: 2187, 1 + xy: 1061, 1805 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-water-tiny rotate: false - xy: 2117, 1 + xy: 655, 2525 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-water-xlarge rotate: false - xy: 3359, 381 + xy: 2001, 2229 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mace-wreck0 rotate: false - xy: 3859, 847 + xy: 991, 2067 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-wreck1 rotate: false - xy: 3925, 913 + xy: 1057, 2133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-wreck2 rotate: false - xy: 3859, 781 + xy: 1057, 2067 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver rotate: false - xy: 3603, 1077 + xy: 893, 2305 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mega-wreck0 rotate: false - xy: 1391, 440 + xy: 1921, 2565 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-wreck1 rotate: false - xy: 1391, 338 + xy: 3195, 3347 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-wreck2 rotate: false - xy: 1493, 440 + xy: 3297, 3347 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 meltdown rotate: false - xy: 2221, 814 + xy: 2147, 2871 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 minke-wreck0 rotate: false - xy: 1897, 739 - size: 128, 128 - orig: 128, 128 + xy: 583, 1367 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 minke-wreck1 rotate: false - xy: 1195, 531 - size: 128, 128 - orig: 128, 128 + xy: 575, 1264 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 minke-wreck2 rotate: false - xy: 1131, 401 - size: 128, 128 - orig: 128, 128 + xy: 575, 1161 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 mono-wreck0 rotate: false - xy: 3409, 399 + xy: 2101, 2297 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mono-wreck1 rotate: false - xy: 3459, 449 + xy: 2151, 2347 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mono-wreck2 rotate: false - xy: 3509, 499 + xy: 2101, 2247 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 nova-wreck0 rotate: false - xy: 3243, 521 + xy: 3537, 3225 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 nova-wreck1 rotate: false - xy: 3193, 463 + xy: 3537, 3167 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 nova-wreck2 rotate: false - xy: 3193, 405 + xy: 3537, 3109 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 parallax rotate: false - xy: 3371, 715 + xy: 1123, 2199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 poly-wreck0 rotate: false - xy: 3193, 231 + xy: 3537, 2935 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 poly-wreck1 rotate: false - xy: 3193, 173 + xy: 3595, 3225 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 poly-wreck2 rotate: false - xy: 3251, 463 + xy: 3595, 3167 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 pulsar-wreck0 rotate: false - xy: 1697, 497 + xy: 1585, 2151 size: 58, 48 orig: 58, 48 offset: 0, 0 index: -1 pulsar-wreck1 rotate: false - xy: 2375, 296 + xy: 3497, 3283 size: 58, 48 orig: 58, 48 offset: 0, 0 index: -1 pulsar-wreck2 rotate: false - xy: 2411, 100 + xy: 1189, 1985 size: 58, 48 orig: 58, 48 offset: 0, 0 index: -1 quasar-wreck0 rotate: false - xy: 2811, 612 + xy: 3455, 3187 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-wreck1 rotate: false - xy: 2811, 530 + xy: 3455, 3105 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-wreck2 rotate: false - xy: 2893, 612 + xy: 3455, 3023 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 +reign-wreck0 + rotate: false + xy: 581, 2729 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck1 + rotate: false + xy: 1477, 3149 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck2 + rotate: false + xy: 797, 2729 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 repair-point rotate: false - xy: 3729, 99 + xy: 783, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ripple rotate: false - xy: 2775, 771 + xy: 2965, 3043 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 risso-wreck0 rotate: false - xy: 2971, 771 - size: 96, 96 - orig: 96, 96 + xy: 665, 977 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 risso-wreck1 rotate: false - xy: 3069, 869 - size: 96, 96 - orig: 96, 96 + xy: 660, 897 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 risso-wreck2 rotate: false - xy: 3069, 771 - size: 96, 96 - orig: 96, 96 + xy: 660, 817 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 salvo rotate: false - xy: 3767, 649 + xy: 1321, 2365 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scatter rotate: false - xy: 4031, 649 + xy: 1189, 2101 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +scepter-wreck0 + rotate: false + xy: 3914, 3813 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck1 + rotate: false + xy: 3900, 3671 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck2 + rotate: false + xy: 1897, 3443 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 scorch rotate: false - xy: 3933, 99 + xy: 817, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 segment rotate: false - xy: 3053, 507 + xy: 1321, 2167 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spectre rotate: false - xy: 1131, 271 + xy: 2409, 3182 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spiroct-wreck0 rotate: false - xy: 2675, 694 + xy: 2769, 2966 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-wreck1 rotate: false - xy: 2771, 694 + xy: 2865, 2966 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-wreck2 rotate: false - xy: 2867, 694 + xy: 2961, 2966 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 splash-0 rotate: false - xy: 3967, 65 + xy: 845, 465 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-1 rotate: false - xy: 4001, 65 + xy: 845, 431 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-10 rotate: false - xy: 3455, 113 + xy: 961, 1865 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-11 rotate: false - xy: 3353, 93 + xy: 995, 1899 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-2 rotate: false - xy: 4035, 65 + xy: 798, 905 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-3 rotate: false - xy: 3251, 143 + xy: 961, 1967 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-4 rotate: false - xy: 3285, 143 + xy: 995, 1967 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-5 rotate: false - xy: 3319, 145 + xy: 961, 1933 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-6 rotate: false - xy: 3353, 127 + xy: 1029, 1967 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-7 rotate: false - xy: 3319, 111 + xy: 961, 1899 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-8 rotate: false - xy: 3387, 113 + xy: 995, 1933 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-9 rotate: false - xy: 3421, 113 + xy: 1063, 1967 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 swarmer rotate: false - xy: 3257, 637 + xy: 1387, 2135 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +toxopid-wreck0 + rotate: false + xy: 291, 2075 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck1 + rotate: false + xy: 291, 1883 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck2 + rotate: false + xy: 291, 1691 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 unit-alpha-full rotate: false - xy: 3901, 549 + xy: 2301, 2248 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-antumbra-full rotate: false - xy: 1831, 1517 + xy: 1477, 3291 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 unit-arkyid-full rotate: false - xy: 1187, 141 + xy: 2621, 3321 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 unit-atrax-full rotate: false - xy: 2351, 494 + xy: 575, 1095 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 unit-beta-full rotate: false - xy: 3409, 249 + xy: 2401, 2348 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-bryde-full rotate: false - xy: 2963, 1423 + xy: 453, 2063 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 unit-crawler-full rotate: false - xy: 3459, 299 + xy: 2351, 2254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-full rotate: false - xy: 3509, 349 + xy: 2401, 2298 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-eclipse-full rotate: false - xy: 1000, 1727 + xy: 1000, 3775 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 unit-flare-full rotate: false - xy: 3559, 399 + xy: 2451, 2348 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-fortress-full rotate: false - xy: 1493, 358 + xy: 3399, 3367 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 unit-gamma-full rotate: false - xy: 3251, 347 + xy: 3595, 2947 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 unit-horizon-full rotate: false - xy: 2375, 346 + xy: 673, 1551 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 unit-mace-full rotate: false - xy: 2411, 150 + xy: 1387, 2069 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-mega-full rotate: false - xy: 1595, 445 + xy: 3093, 3267 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 unit-minke-full rotate: false - xy: 1187, 11 - size: 128, 128 - orig: 128, 128 + xy: 575, 992 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 unit-mono-full rotate: false - xy: 3609, 441 + xy: 2451, 2298 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-nova-full rotate: false - xy: 3251, 289 + xy: 3653, 3253 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 unit-poly-full rotate: false - xy: 3251, 231 + xy: 3653, 3195 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 unit-pulsar-full rotate: false - xy: 1697, 447 + xy: 1249, 1985 size: 58, 48 orig: 58, 48 offset: 0, 0 index: -1 unit-quasar-full rotate: false - xy: 2893, 530 + xy: 3455, 2941 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 +unit-reign-full + rotate: false + xy: 1703, 3665 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 unit-risso-full rotate: false - xy: 3885, 979 - size: 96, 96 - orig: 96, 96 + xy: 645, 665 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +unit-scepter-full + rotate: false + xy: 1889, 3301 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 unit-spiroct-full rotate: false - xy: 2963, 694 + xy: 595, 1995 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 +unit-toxopid-full + rotate: false + xy: 291, 1499 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 unit-zenith-full rotate: false - xy: 1, 7 + xy: 1887, 2667 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 wave rotate: false - xy: 2581, 282 + xy: 1519, 2135 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 zenith-wreck0 rotate: false - xy: 1317, 157 + xy: 2979, 3337 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-wreck1 rotate: false - xy: 1317, 43 + xy: 3527, 3497 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-wreck2 rotate: false - xy: 1341, 629 + xy: 3641, 3467 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 3949, 337 + xy: 3963, 3441 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 3763, 303 + xy: 3895, 3407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 3831, 303 + xy: 3963, 3407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 3899, 303 + xy: 4035, 3475 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 3967, 303 + xy: 4031, 3407 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 4059, 379 + xy: 3921, 3373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 3797, 269 + xy: 3989, 3373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 3865, 269 + xy: 1677, 2113 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 3933, 269 + xy: 4062, 3603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 4001, 303 + xy: 4062, 3535 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 4017, 337 + xy: 3703, 3127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 4035, 303 + xy: 3703, 3059 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod rotate: false - xy: 3789, 235 + xy: 3703, 2957 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 3857, 235 + xy: 3737, 3135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 3925, 235 + xy: 3737, 3067 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 3993, 235 + xy: 3737, 2999 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 3681, 179 + xy: 3695, 2889 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 3749, 201 + xy: 1801, 2199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 3987, 201 + xy: 1693, 2197 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 3783, 167 + xy: 2663, 2116 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blank rotate: false - xy: 4094, 2046 + xy: 3642, 4028 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 circle rotate: false - xy: 2049, 1556 + xy: 2127, 3604 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 shape-3 rotate: false - xy: 2609, 151 + xy: 1519, 2070 size: 63, 63 orig: 63, 63 offset: 0, 0 index: -1 alpha rotate: false - xy: 2675, 195 + xy: 3653, 3145 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-cell rotate: false - xy: 2674, 145 + xy: 3653, 3095 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 antumbra rotate: false - xy: 969, 1 + xy: 1259, 3307 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-cell rotate: false - xy: 1355, 1227 + xy: 1033, 2855 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 arkyid rotate: false - xy: 3964, 1919 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -chaos-array - rotate: false - xy: 3964, 1919 + xy: 453, 1933 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 arkyid-cell rotate: false - xy: 4007, 1723 - size: 88, 64 - orig: 88, 64 + xy: 453, 1803 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 arkyid-foot rotate: false - xy: 2449, 348 + xy: 673, 1479 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-joint-base rotate: false - xy: 2521, 348 + xy: 673, 1407 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-leg rotate: false - xy: 2255, 756 + xy: 2513, 2634 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 arkyid-leg-base rotate: false - xy: 1001, 273 + xy: 549, 2519 size: 104, 64 orig: 104, 64 offset: 0, 0 index: -1 atrax rotate: false - xy: 4007, 1657 + xy: 583, 1837 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-base rotate: false - xy: 2723, 464 + xy: 645, 599 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 atrax-cell rotate: false - xy: 4007, 1591 + xy: 583, 1771 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-foot rotate: false - xy: 1317, 1 + xy: 217, 129 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 atrax-joint rotate: false - xy: 1427, 601 + xy: 3625, 3283 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 atrax-leg rotate: false - xy: 356, 1699 + xy: 356, 3747 size: 36, 26 orig: 36, 26 offset: 0, 0 index: -1 atrax-leg-base rotate: false - xy: 394, 1699 + xy: 1, 1 size: 36, 26 orig: 36, 26 offset: 0, 0 index: -1 beta rotate: false - xy: 3309, 329 + xy: 3711, 3203 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 beta-cell rotate: false - xy: 3309, 279 + xy: 2223, 3262 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 bryde rotate: false - xy: 2383, 1288 + xy: 291, 779 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-cell rotate: false - xy: 2383, 1146 + xy: 291, 637 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 -chaos-array-base - rotate: false - xy: 2785, 1163 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -chaos-array-cell - rotate: false - xy: 2915, 1293 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -chaos-array-leg - rotate: false - xy: 2915, 1163 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 crawler rotate: false - xy: 2729, 216 + xy: 3645, 2895 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-base rotate: false - xy: 2779, 216 + xy: 1651, 2481 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-cell rotate: false - xy: 2829, 216 + xy: 1651, 2431 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-leg rotate: false - xy: 2879, 216 + xy: 1651, 2381 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger rotate: false - xy: 2825, 166 + xy: 1751, 2483 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-base rotate: false - xy: 2875, 166 + xy: 1701, 2383 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-leg rotate: false - xy: 2925, 166 + xy: 1751, 2433 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 eclipse rotate: false - xy: 1, 1377 + xy: 1, 3425 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-cell rotate: false - xy: 356, 1727 + xy: 356, 3775 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 -eradicator - rotate: false - xy: 2221, 944 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -eradicator-base - rotate: false - xy: 1573, 711 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -eradicator-cell - rotate: false - xy: 1727, 711 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -eradicator-leg - rotate: false - xy: 2383, 1430 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 flare rotate: false - xy: 2924, 66 + xy: 1801, 2383 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 fortress rotate: false - xy: 1325, 547 + xy: 3093, 3369 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 3595, 847 + xy: 991, 2463 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-cell rotate: false - xy: 1557, 629 + xy: 3755, 3499 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 4015, 1447 + xy: 563, 708 size: 80, 60 orig: 80, 60 offset: 0, 0 index: -1 gamma rotate: false - xy: 2413, 42 + xy: 3567, 3341 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 gamma-cell rotate: false - xy: 2529, 92 + xy: 1309, 1977 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 horizon rotate: false - xy: 2505, 893 + xy: 939, 2655 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-cell rotate: false - xy: 2975, 620 + xy: 1793, 2932 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 mace rotate: false - xy: 3727, 781 + xy: 991, 2199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-base rotate: false - xy: 3793, 847 + xy: 1057, 2265 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-cell rotate: false - xy: 3859, 913 + xy: 991, 2133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mace-leg rotate: false - xy: 3793, 781 + xy: 1057, 2199 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mega rotate: false - xy: 1761, 609 + xy: 2539, 3210 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-cell rotate: false - xy: 1761, 507 + xy: 2641, 3219 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 minke rotate: false - xy: 1097, 661 - size: 128, 128 - orig: 128, 128 + xy: 583, 1470 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 minke-cell rotate: false - xy: 1065, 531 + xy: 2017, 2741 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 mono rotate: false - xy: 3751, 549 + xy: 2101, 2347 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mono-cell rotate: false - xy: 3359, 331 + xy: 2051, 2247 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 nova rotate: false - xy: 3239, 579 + xy: 3683, 3311 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 nova-base rotate: false - xy: 3409, 349 + xy: 2201, 2348 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 nova-cell rotate: false - xy: 3185, 521 + xy: 3567, 3283 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 nova-leg rotate: false - xy: 3459, 399 + xy: 2201, 2298 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 poly rotate: false - xy: 3193, 347 + xy: 3537, 3051 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 poly-cell rotate: false - xy: 3193, 289 + xy: 3537, 2993 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 power-cell rotate: false - xy: 3251, 405 + xy: 3595, 3109 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 pulsar rotate: false - xy: 549, 489 + xy: 732, 823 size: 58, 48 orig: 58, 48 offset: 0, 0 index: -1 pulsar-base rotate: false - xy: 3509, 449 + xy: 2251, 2348 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 pulsar-cell rotate: false - xy: 1065, 481 + xy: 939, 2605 size: 58, 48 orig: 58, 48 offset: 0, 0 index: -1 pulsar-leg rotate: false - xy: 3371, 649 + xy: 1321, 2497 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 quasar rotate: false - xy: 2647, 612 + xy: 563, 626 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-base rotate: false - xy: 2647, 530 + xy: 563, 544 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-cell rotate: false - xy: 2729, 612 + xy: 563, 462 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-leg rotate: false - xy: 2729, 530 + xy: 551, 380 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 +reign + rotate: false + xy: 1, 29 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-base + rotate: false + xy: 291, 1373 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +reign-cell + rotate: false + xy: 291, 1247 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +reign-leg + rotate: false + xy: 291, 1121 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 risso rotate: false - xy: 2873, 771 - size: 96, 96 - orig: 96, 96 + xy: 665, 1057 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 risso-cell rotate: false - xy: 2971, 869 + xy: 3063, 3071 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +scepter + rotate: false + xy: 3914, 3955 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-base + rotate: false + xy: 2147, 2741 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scepter-cell + rotate: false + xy: 2231, 3312 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scepter-leg + rotate: false + xy: 2361, 3312 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 spiroct rotate: false - xy: 2255, 485 + xy: 1639, 3006 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-cell rotate: false - xy: 2579, 694 + xy: 1735, 3006 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-foot rotate: false - xy: 1815, 459 + xy: 3045, 3289 size: 46, 46 orig: 46, 46 offset: 0, 0 index: -1 spiroct-joint rotate: false - xy: 3933, 65 + xy: 845, 499 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spiroct-leg rotate: false - xy: 2189, 778 + xy: 2219, 2705 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 spiroct-leg-base rotate: false - xy: 2085, 350 + xy: 2351, 2362 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 +toxopid + rotate: false + xy: 291, 2267 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-cannon + rotate: false + xy: 1919, 3585 + size: 206, 220 + orig: 206, 220 + offset: 0, 0 + index: -1 +toxopid-cell + rotate: false + xy: 291, 995 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +toxopid-foot + rotate: false + xy: 583, 1903 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +toxopid-joint-base + rotate: false + xy: 645, 745 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +toxopid-leg + rotate: false + xy: 291, 921 + size: 150, 72 + orig: 150, 72 + offset: 0, 0 + index: -1 +toxopid-leg-base + rotate: false + xy: 3384, 4031 + size: 270, 64 + orig: 270, 64 + offset: 0, 0 + index: -1 vanguard rotate: false - xy: 3659, 499 + xy: 2401, 2248 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 vanguard-cell rotate: false - xy: 3951, 549 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -antumbra-missiles - rotate: false - xy: 3309, 437 + xy: 2451, 2248 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 artillery rotate: false - xy: 3309, 379 + xy: 3711, 3253 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 artillery-mount rotate: false - xy: 2593, 350 + xy: 673, 1335 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 beam-weapon rotate: false - xy: 4015, 1509 + xy: 563, 770 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 -chaos - rotate: false - xy: 2471, 12 - size: 56, 136 - orig: 56, 136 - offset: 0, 0 - index: -1 -eradication - rotate: false - xy: 2255, 562 - size: 96, 192 - orig: 96, 192 - offset: 0, 0 - index: -1 eruption rotate: false - xy: 2874, 108 + xy: 1851, 2475 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flakgun rotate: false - xy: 2924, 116 + xy: 1701, 2283 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flamethrower rotate: false - xy: 2974, 108 + xy: 1751, 2325 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 heal-shotgun-weapon rotate: false - xy: 3447, 599 + xy: 1801, 2333 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 heal-weapon rotate: false - xy: 3497, 599 + xy: 1851, 2375 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 heal-weapon-mount rotate: false - xy: 3547, 599 + xy: 1801, 2283 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 large-artillery rotate: false - xy: 3359, 481 + xy: 2001, 2329 size: 48, 66 orig: 48, 66 offset: 0, 0 index: -1 large-bullet-mount rotate: false - xy: 2651, 431 + xy: 665, 1236 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-laser-mount rotate: false - xy: 2549, 496 + xy: 697, 2405 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 +large-purple-mount + rotate: false + xy: 665, 1137 + size: 70, 97 + orig: 70, 97 + offset: 0, 0 + index: -1 large-weapon rotate: false - xy: 3651, 549 + xy: 2051, 2397 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles rotate: false - xy: 3409, 449 + xy: 2151, 2397 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles-mount rotate: false - xy: 3459, 499 + xy: 2051, 2297 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-purple-weapon rotate: false - xy: 3801, 549 + xy: 2151, 2297 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-weapon rotate: false - xy: 3359, 281 + xy: 2151, 2247 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +reign-weapon + rotate: false + xy: 575, 852 + size: 83, 138 + orig: 83, 138 + offset: 0, 0 + index: -1 +scepter-weapon + rotate: false + xy: 3595, 3005 + size: 56, 102 + orig: 56, 102 + offset: 0, 0 + index: -1 small-basic-weapon rotate: false - xy: 3359, 231 + xy: 2201, 2248 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-mount-weapon rotate: false - xy: 3409, 299 + xy: 2251, 2298 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-weapon rotate: false - xy: 3459, 349 + xy: 2301, 2348 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spiroct-weapon rotate: false - xy: 3609, 491 + xy: 2351, 2304 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 weapon rotate: false - xy: 3459, 249 + xy: 2501, 2278 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 zenith-missiles rotate: false - xy: 3509, 299 + xy: 2551, 2278 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 zenith rotate: false - xy: 1227, 677 + xy: 2751, 3337 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-cell rotate: false - xy: 115, 7 + xy: 2865, 3337 size: 112, 112 orig: 112, 112 offset: 0, 0 @@ -6771,863 +6939,926 @@ size: 4096,256 format: rgba8888 filter: nearest,nearest repeat: none -char1 - rotate: false - xy: 2311, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char2 - rotate: false - xy: 101, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char3 - rotate: false - xy: 2345, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliff - rotate: false - xy: 135, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliffs1 - rotate: false - xy: 2379, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal1 - rotate: false - xy: 169, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal2 - rotate: false - xy: 2413, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal3 - rotate: false - xy: 203, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper1 - rotate: false - xy: 2447, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper2 - rotate: false - xy: 237, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper3 - rotate: false - xy: 2481, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters1 - rotate: false - xy: 271, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters2 - rotate: false - xy: 2515, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters3 - rotate: false - xy: 305, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters4 - rotate: false - xy: 2549, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters5 - rotate: false - xy: 339, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters6 - rotate: false - xy: 2583, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal-large - rotate: false - xy: 1569, 83 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dark-metal1 - rotate: false - xy: 373, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal2 - rotate: false - xy: 2617, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1 - rotate: false - xy: 407, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1-edge +basalt-edge rotate: false xy: 1, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dark-panel-2 +basalt1 rotate: false - xy: 2651, 213 + xy: 51, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-2-edge +basalt2 + rotate: false + xy: 1717, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt3 + rotate: false + xy: 2063, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +char1 + rotate: false + xy: 2113, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +char2 + rotate: false + xy: 85, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +char3 + rotate: false + xy: 1751, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cliff + rotate: false + xy: 2063, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +coal1 + rotate: false + xy: 2147, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +coal2 + rotate: false + xy: 119, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +coal3 + rotate: false + xy: 1785, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper1 + rotate: false + xy: 2181, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper2 + rotate: false + xy: 153, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper3 + rotate: false + xy: 1819, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters1 + rotate: false + xy: 2215, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters2 + rotate: false + xy: 187, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters3 + rotate: false + xy: 1853, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters4 + rotate: false + xy: 2249, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters5 + rotate: false + xy: 221, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters6 + rotate: false + xy: 1887, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-edge rotate: false xy: 1, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dark-panel-3 - rotate: false - xy: 441, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-3-edge - rotate: false - xy: 99, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-4 - rotate: false - xy: 2685, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-4-edge - rotate: false - xy: 99, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-5 - rotate: false - xy: 475, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-5-edge - rotate: false - xy: 197, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-6 - rotate: false - xy: 2719, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-6-edge - rotate: false - xy: 197, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-edge - rotate: false - xy: 295, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-tainted-water - rotate: false - xy: 2787, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water-edge - rotate: false - xy: 295, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-tainted-water1 - rotate: false - xy: 577, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water2 - rotate: false - xy: 2821, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water3 - rotate: false - xy: 611, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water - rotate: false - xy: 2855, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water-edge - rotate: false - xy: 393, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-water1 - rotate: false - xy: 645, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water2 - rotate: false - xy: 2889, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water3 - rotate: false - xy: 679, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand1 - rotate: false - xy: 509, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand2 - rotate: false - xy: 2753, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand3 - rotate: false - xy: 543, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater - rotate: false - xy: 2923, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater-edge - rotate: false - xy: 393, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dunerocks-large +dacite-wall-large rotate: false xy: 1667, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -dunerocks1 +dacite-wall1 rotate: false - xy: 713, 17 + xy: 2317, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dunerocks2 +dacite-wall2 rotate: false - xy: 2957, 213 + xy: 289, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -edge +dacite1 rotate: false - xy: 747, 17 + xy: 2283, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -edge-stencil +dacite2 + rotate: false + xy: 255, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite3 + rotate: false + xy: 1921, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-metal-large + rotate: false + xy: 1667, 115 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dark-metal1 + rotate: false + xy: 1955, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-metal2 + rotate: false + xy: 2351, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-1 + rotate: false + xy: 323, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-1-edge + rotate: false + xy: 99, 149 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-2 + rotate: false + xy: 1989, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-2-edge + rotate: false + xy: 99, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-3 + rotate: false + xy: 2385, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-3-edge + rotate: false + xy: 197, 149 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-4 + rotate: false + xy: 357, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-4-edge + rotate: false + xy: 197, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-5 + rotate: false + xy: 2023, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-5-edge + rotate: false + xy: 295, 149 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-6 + rotate: false + xy: 2419, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-6-edge + rotate: false + xy: 295, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +darksand-edge + rotate: false + xy: 393, 149 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +darksand-tainted-water + rotate: false + xy: 2487, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water-edge + rotate: false + xy: 393, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +darksand-tainted-water1 + rotate: false + xy: 459, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water2 + rotate: false + xy: 2521, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water3 + rotate: false + xy: 493, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water + rotate: false + xy: 2555, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water-edge rotate: false xy: 491, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -edgier +darksand-water1 rotate: false - xy: 2991, 213 + xy: 527, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -grass-edge +darksand-water2 + rotate: false + xy: 2589, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water3 + rotate: false + xy: 561, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand1 + rotate: false + xy: 391, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand2 + rotate: false + xy: 2453, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand3 + rotate: false + xy: 425, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +deepwater + rotate: false + xy: 2623, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +deepwater-edge rotate: false xy: 491, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -grass1 - rotate: false - xy: 781, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass2 - rotate: false - xy: 3025, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass3 - rotate: false - xy: 815, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-edge +dirt-edge rotate: false xy: 589, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -holostone1 - rotate: false - xy: 3059, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone2 - rotate: false - xy: 849, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone3 - rotate: false - xy: 3093, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock1 - rotate: false - xy: 883, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock2 - rotate: false - xy: 3127, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock3 - rotate: false - xy: 917, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-edge - rotate: false - xy: 589, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-snow-edge - rotate: false - xy: 687, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ice-snow1 - rotate: false - xy: 985, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow2 - rotate: false - xy: 3229, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow3 - rotate: false - xy: 1019, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice1 - rotate: false - xy: 3161, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice2 - rotate: false - xy: 951, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice3 - rotate: false - xy: 3195, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icerocks-large +dirt-wall-large rotate: false xy: 1733, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -icerocks1 +dirt-wall1 rotate: false - xy: 3263, 213 + xy: 2691, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icerocks2 +dirt-wall2 rotate: false - xy: 1053, 17 + xy: 663, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ignarock-edge +dirt1 + rotate: false + xy: 595, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt2 + rotate: false + xy: 2657, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt3 + rotate: false + xy: 629, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dune-wall-large + rotate: false + xy: 1733, 115 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dune-wall1 + rotate: false + xy: 2725, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dune-wall2 + rotate: false + xy: 697, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +edge + rotate: false + xy: 2759, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +edge-stencil + rotate: false + xy: 589, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +edgier + rotate: false + xy: 731, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass-edge + rotate: false + xy: 687, 149 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +grass1 + rotate: false + xy: 2793, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass2 + rotate: false + xy: 765, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass3 + rotate: false + xy: 2827, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock1 + rotate: false + xy: 799, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock2 + rotate: false + xy: 2861, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock3 + rotate: false + xy: 833, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-edge rotate: false xy: 687, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -ignarock1 - rotate: false - xy: 3297, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock2 - rotate: false - xy: 1087, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock3 - rotate: false - xy: 3331, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead1 - rotate: false - xy: 1121, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead2 - rotate: false - xy: 3365, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lead3 - rotate: false - xy: 1155, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock1 - rotate: false - xy: 3399, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock2 - rotate: false - xy: 1189, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock3 - rotate: false - xy: 3433, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor - rotate: false - xy: 1223, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2 - rotate: false - xy: 3467, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2-edge +ice-snow-edge rotate: false xy: 785, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -metal-floor-3 +ice-snow1 rotate: false - xy: 1257, 17 + xy: 901, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -metal-floor-3-edge +ice-snow2 + rotate: false + xy: 2963, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-snow3 + rotate: false + xy: 935, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall-large + rotate: false + xy: 1799, 181 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +ice-wall1 + rotate: false + xy: 2997, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall2 + rotate: false + xy: 969, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice1 + rotate: false + xy: 2895, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice2 + rotate: false + xy: 867, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice3 + rotate: false + xy: 2929, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead1 + rotate: false + xy: 3031, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead2 + rotate: false + xy: 1003, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead3 + rotate: false + xy: 3065, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock1 + rotate: false + xy: 1037, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock2 + rotate: false + xy: 3099, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock3 + rotate: false + xy: 1071, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor + rotate: false + xy: 3133, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-2 + rotate: false + xy: 1105, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-2-edge rotate: false xy: 785, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -metal-floor-5 +metal-floor-3 rotate: false - xy: 3501, 213 + xy: 3167, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -metal-floor-5-edge +metal-floor-3-edge rotate: false xy: 883, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -metal-floor-damaged-edge +metal-floor-5 + rotate: false + xy: 1139, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-5-edge rotate: false xy: 883, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -metal-floor-damaged1 - rotate: false - xy: 1291, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged2 - rotate: false - xy: 3535, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged3 - rotate: false - xy: 1325, 17 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-edge +metal-floor-damaged-edge rotate: false xy: 981, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -moss-edge +metal-floor-damaged1 + rotate: false + xy: 3201, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-damaged2 + rotate: false + xy: 1173, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-damaged3 + rotate: false + xy: 3235, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-edge rotate: false xy: 981, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +moss-edge + rotate: false + xy: 1079, 149 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 moss1 rotate: false - xy: 3569, 213 + xy: 1207, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss2 rotate: false - xy: 1359, 17 + xy: 3269, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss3 rotate: false - xy: 3603, 213 + xy: 1241, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal1 rotate: false - xy: 1393, 17 + xy: 3303, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal2 rotate: false - xy: 3637, 213 + xy: 1275, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal3 rotate: false - xy: 1427, 17 + xy: 3337, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper1 rotate: false - xy: 3671, 213 + xy: 1309, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper2 rotate: false - xy: 1461, 17 + xy: 3371, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper3 rotate: false - xy: 3705, 213 + xy: 1343, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead1 rotate: false - xy: 1495, 17 + xy: 3405, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead2 rotate: false - xy: 3739, 213 + xy: 1377, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead3 rotate: false - xy: 1529, 17 + xy: 3439, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap1 rotate: false - xy: 3773, 213 + xy: 1411, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap2 rotate: false - xy: 3807, 213 + xy: 3473, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap3 rotate: false - xy: 3841, 213 + xy: 1445, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium1 rotate: false - xy: 3875, 213 + xy: 3507, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium2 rotate: false - xy: 3909, 213 + xy: 1479, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium3 rotate: false - xy: 3943, 213 + xy: 3541, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium1 rotate: false - xy: 3977, 213 + xy: 1513, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium2 rotate: false - xy: 4011, 213 + xy: 3575, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium3 rotate: false - xy: 4045, 213 + xy: 1547, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles1 rotate: false - xy: 1569, 49 + xy: 3609, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles2 rotate: false - xy: 1635, 115 + xy: 1581, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles3 rotate: false - xy: 1603, 49 + xy: 3643, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -7639,499 +7870,499 @@ pine orig: 48, 48 offset: 0, 0 index: -1 -rocks-large - rotate: false - xy: 1799, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rocks1 - rotate: false - xy: 1563, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rocks2 - rotate: false - xy: 1597, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 salt rotate: false - xy: 2261, 163 + xy: 1615, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-edge rotate: false - xy: 1079, 149 + xy: 1079, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -saltrocks-large +salt-wall-large rotate: false - xy: 1865, 181 + xy: 1799, 115 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -saltrocks1 +salt-wall1 rotate: false - xy: 2311, 179 + xy: 3677, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -saltrocks2 +salt-wall2 rotate: false - xy: 2345, 179 + xy: 3711, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-edge rotate: false - xy: 1079, 51 + xy: 1177, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +sand-wall-large + rotate: false + xy: 1865, 181 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +sand-wall1 + rotate: false + xy: 3847, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-wall2 + rotate: false + xy: 3881, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 sand-water rotate: false - xy: 2481, 179 + xy: 3915, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-edge rotate: false - xy: 1177, 149 + xy: 1177, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sand-water1 rotate: false - xy: 2515, 179 + xy: 3949, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water2 rotate: false - xy: 2549, 179 + xy: 3983, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water3 rotate: false - xy: 2583, 179 + xy: 4017, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand1 rotate: false - xy: 2379, 179 + xy: 3745, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand2 rotate: false - xy: 2413, 179 + xy: 3779, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand3 rotate: false - xy: 2447, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-large - rotate: false - xy: 1931, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sandrocks1 - rotate: false - xy: 2617, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks2 - rotate: false - xy: 2651, 179 + xy: 3813, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap1 rotate: false - xy: 2685, 179 + xy: 4051, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap2 rotate: false - xy: 2719, 179 + xy: 1649, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap3 rotate: false - xy: 2753, 179 + xy: 1683, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-edge rotate: false - xy: 1177, 51 + xy: 1275, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +shale-wall-large + rotate: false + xy: 1865, 115 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +shale-wall1 + rotate: false + xy: 1819, 47 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-wall2 + rotate: false + xy: 1853, 47 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 shale1 rotate: false - xy: 2787, 179 + xy: 1717, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale2 rotate: false - xy: 2821, 179 + xy: 1751, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale3 rotate: false - xy: 2855, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shalerocks-large - rotate: false - xy: 1997, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shalerocks1 - rotate: false - xy: 2889, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shalerocks2 - rotate: false - xy: 2923, 179 + xy: 1785, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-large rotate: false - xy: 2063, 181 + xy: 1931, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shrubs1 rotate: false - xy: 2957, 179 + xy: 1887, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs2 rotate: false - xy: 2991, 179 + xy: 1921, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag rotate: false - xy: 3025, 179 + xy: 1955, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-edge rotate: false - xy: 1275, 149 + xy: 1275, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-edge rotate: false - xy: 1275, 51 + xy: 1373, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-pine rotate: false - xy: 2261, 197 + xy: 1667, 65 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +snow-wall-large + rotate: false + xy: 1931, 115 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +snow-wall1 + rotate: false + xy: 2097, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snow-wall2 + rotate: false + xy: 2131, 179 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 snow1 rotate: false - xy: 3059, 179 + xy: 1989, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow2 rotate: false - xy: 3093, 179 + xy: 2023, 47 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow3 rotate: false - xy: 3127, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snowrocks-large - rotate: false - xy: 2129, 181 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -snowrocks1 - rotate: false - xy: 3161, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snowrocks2 - rotate: false - xy: 3195, 179 + xy: 2097, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn rotate: false - xy: 3229, 179 + xy: 2131, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-edge rotate: false - xy: 1373, 149 + xy: 1373, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 spore-moss1 rotate: false - xy: 3263, 179 + xy: 2165, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss2 rotate: false - xy: 3297, 179 + xy: 2165, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss3 rotate: false - xy: 3331, 179 + xy: 2199, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-pine rotate: false - xy: 51, 1 + xy: 2063, 197 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -sporerocks-large +spore-wall-large rotate: false - xy: 2195, 181 + xy: 1997, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks1 +spore-wall1 rotate: false - xy: 3365, 179 + xy: 2199, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -sporerocks2 +spore-wall2 rotate: false - xy: 3399, 179 + xy: 2233, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-edge rotate: false - xy: 1373, 51 + xy: 1471, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +stone-wall-large + rotate: false + xy: 1997, 115 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall1 + rotate: false + xy: 2301, 179 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone-wall2 + rotate: false + xy: 2301, 145 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 stone1 rotate: false - xy: 3433, 179 + xy: 2233, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone2 rotate: false - xy: 3467, 179 + xy: 2267, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone3 rotate: false - xy: 3501, 179 + xy: 2267, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water rotate: false - xy: 3535, 179 + xy: 2335, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-edge rotate: false - xy: 1471, 149 + xy: 1471, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tar rotate: false - xy: 3569, 179 + xy: 2335, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-edge rotate: false - xy: 1471, 51 + xy: 1569, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tendrils1 rotate: false - xy: 3603, 179 + xy: 2369, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils2 rotate: false - xy: 3637, 179 + xy: 2369, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils3 rotate: false - xy: 3671, 179 + xy: 2403, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 3705, 179 + xy: 2403, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 3739, 179 + xy: 2437, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 3773, 179 + xy: 2437, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 3807, 179 + xy: 2471, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 3841, 179 + xy: 2471, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 3875, 179 + xy: 2505, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water rotate: false - xy: 3909, 179 + xy: 2505, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-edge rotate: false - xy: 1569, 149 + xy: 1569, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 @@ -8144,2155 +8375,2218 @@ filter: nearest,nearest repeat: none additive-reconstructor-icon-editor rotate: false - xy: 1973, 389 + xy: 2167, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory-icon-editor rotate: false - xy: 2071, 389 + xy: 2265, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-icon-editor rotate: false - xy: 2169, 389 + xy: 2363, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-icon-editor rotate: false - xy: 1085, 227 + xy: 255, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-icon-editor rotate: false - xy: 1631, 225 + xy: 289, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt-icon-editor + rotate: false + xy: 323, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt1 + rotate: false + xy: 323, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-editor rotate: false - xy: 1119, 227 + xy: 357, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-editor rotate: false - xy: 2267, 389 + xy: 2461, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill-icon-editor rotate: false - xy: 163, 35 + xy: 163, 51 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-mixer-icon-editor rotate: false - xy: 4031, 421 + xy: 4029, 437 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border-editor rotate: false - xy: 1665, 225 + xy: 391, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-forge-icon-editor rotate: false - xy: 2365, 389 + xy: 2559, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-loader-icon-editor rotate: false - xy: 2463, 389 + xy: 2657, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader-icon-editor rotate: false - xy: 2561, 389 + xy: 2755, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +boulder-icon-editor + rotate: false + xy: 3751, 355 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 bridge-conduit-icon-editor rotate: false - xy: 1699, 225 + xy: 425, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 1733, 225 + xy: 459, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 1767, 225 + xy: 493, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 1767, 225 + xy: 493, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear-editor rotate: false - xy: 645, 194 + xy: 645, 210 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 cliff-icon-editor rotate: false - xy: 1801, 225 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliffs-icon-editor - rotate: false - xy: 1847, 257 + xy: 553, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal-centrifuge-icon-editor rotate: false - xy: 4031, 355 + xy: 1553, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 combustion-generator-icon-editor rotate: false - xy: 1881, 257 + xy: 587, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +command-center-icon-editor + rotate: false + xy: 1619, 307 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 conduit-icon-editor rotate: false - xy: 1915, 257 + xy: 651, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 1847, 291 + xy: 1685, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 1979, 289 + xy: 685, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 2013, 289 + xy: 719, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 1913, 291 + xy: 1751, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-icon-editor rotate: false - xy: 1323, 357 + xy: 1517, 373 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-icon-editor rotate: false - xy: 1, 3 + xy: 1, 19 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-icon-editor rotate: false - xy: 2659, 389 + xy: 2853, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 craters-icon-editor rotate: false - xy: 2047, 289 + xy: 753, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters1 rotate: false - xy: 2047, 289 + xy: 753, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cryofluidmixer-icon-editor rotate: false - xy: 1979, 323 + xy: 1817, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 2045, 323 + xy: 1883, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone-icon-editor rotate: false - xy: 2757, 389 + xy: 2951, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +dacite-boulder-icon-editor + rotate: false + xy: 3801, 355 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-icon-editor + rotate: false + xy: 787, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite1 + rotate: false + xy: 787, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-wall-icon-editor + rotate: false + xy: 821, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 dark-metal-icon-editor rotate: false - xy: 2081, 289 + xy: 855, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-editor rotate: false - xy: 2115, 289 + xy: 889, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-1 rotate: false - xy: 2115, 289 + xy: 889, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-editor rotate: false - xy: 2149, 289 + xy: 1141, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-2 rotate: false - xy: 2149, 289 + xy: 1141, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-editor rotate: false - xy: 2183, 289 + xy: 1175, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-3 rotate: false - xy: 2183, 289 + xy: 1175, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-editor rotate: false - xy: 2217, 289 + xy: 1209, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-4 rotate: false - xy: 2217, 289 + xy: 1209, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-editor rotate: false - xy: 2251, 289 + xy: 1243, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-5 rotate: false - xy: 2251, 289 + xy: 1243, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-editor rotate: false - xy: 2285, 289 + xy: 1277, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-6 rotate: false - xy: 2285, 289 + xy: 1277, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-editor rotate: false - xy: 2319, 289 + xy: 4029, 403 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand1 rotate: false - xy: 2319, 289 + xy: 4029, 403 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-editor rotate: false - xy: 2353, 289 + xy: 4063, 403 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-editor rotate: false - xy: 2387, 289 + xy: 1357, 209 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 2421, 289 + xy: 1391, 209 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 2421, 289 + xy: 1391, 209 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-icon-editor rotate: false - xy: 2855, 389 + xy: 3049, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode-icon-editor rotate: false - xy: 2455, 289 + xy: 1425, 209 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-icon-editor + rotate: false + xy: 1459, 209 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt1 + rotate: false + xy: 1459, 209 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-wall-icon-editor + rotate: false + xy: 1493, 209 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 disassembler-icon-editor rotate: false - xy: 2953, 389 + xy: 3147, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 distributor-icon-editor rotate: false - xy: 2111, 323 + xy: 1949, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 2489, 289 + xy: 1311, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 2177, 323 + xy: 2015, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -dunerocks-icon-editor +dune-wall-icon-editor rotate: false - xy: 2523, 289 + xy: 3751, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 2557, 289 + xy: 3785, 321 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt2 + rotate: false + xy: 3819, 321 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt3 + rotate: false + xy: 3853, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 2591, 289 + xy: 3887, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 2625, 289 + xy: 3921, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters2 rotate: false - xy: 2659, 289 + xy: 3955, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 2693, 289 + xy: 1337, 175 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite2 + rotate: false + xy: 1337, 141 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite3 + rotate: false + xy: 1371, 175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water1 rotate: false - xy: 2795, 289 + xy: 1405, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water2 rotate: false - xy: 2829, 289 + xy: 1439, 175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water3 rotate: false - xy: 2863, 289 + xy: 1439, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water1 rotate: false - xy: 2897, 289 + xy: 1473, 175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water2 rotate: false - xy: 2931, 289 + xy: 1473, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water3 rotate: false - xy: 2965, 289 + xy: 1507, 175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand2 rotate: false - xy: 2727, 289 + xy: 1371, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand3 rotate: false - xy: 2761, 289 + xy: 1405, 175 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt2 + rotate: false + xy: 1507, 141 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt3 + rotate: false + xy: 2147, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 2999, 289 + xy: 2147, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 2999, 289 + xy: 2147, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 3033, 289 + xy: 2181, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 3067, 289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone1 - rotate: false - xy: 3101, 289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-icon-editor - rotate: false - xy: 3101, 289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone2 - rotate: false - xy: 3135, 289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone3 - rotate: false - xy: 3169, 289 + xy: 2181, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 3203, 289 + xy: 2215, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 3203, 289 + xy: 2215, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 3237, 289 + xy: 2215, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 3271, 289 + xy: 2249, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 3407, 289 + xy: 2317, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 3407, 289 + xy: 2317, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 3441, 289 + xy: 2317, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 3475, 289 + xy: 2351, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 3305, 289 + xy: 2249, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 3305, 289 + xy: 2249, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 3339, 289 + xy: 2283, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 3373, 289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock1 - rotate: false - xy: 3509, 289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock-icon-editor - rotate: false - xy: 3509, 289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock2 - rotate: false - xy: 3543, 289 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock3 - rotate: false - xy: 3577, 289 + xy: 2283, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 3611, 289 + xy: 2351, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 3611, 289 + xy: 2351, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 3645, 289 + xy: 2385, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 3679, 289 + xy: 2385, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 3713, 289 + xy: 2419, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 3713, 289 + xy: 2419, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 3747, 289 + xy: 2419, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 3747, 289 + xy: 2419, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 3781, 289 + xy: 2453, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 3781, 289 + xy: 2453, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 3815, 289 + xy: 2453, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 3815, 289 + xy: 2453, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 3849, 289 + xy: 2487, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 3849, 289 + xy: 2487, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 3883, 289 + xy: 2487, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 3917, 289 + xy: 2521, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss1 rotate: false - xy: 3951, 289 + xy: 2521, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-editor rotate: false - xy: 3951, 289 + xy: 2521, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss2 rotate: false - xy: 3985, 289 + xy: 2555, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss3 rotate: false - xy: 163, 1 + xy: 2555, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal1 rotate: false - xy: 197, 1 + xy: 2589, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal2 rotate: false - xy: 231, 1 + xy: 2589, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal3 rotate: false - xy: 265, 1 + xy: 2623, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper1 rotate: false - xy: 299, 1 + xy: 2623, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper2 rotate: false - xy: 333, 1 + xy: 2657, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper3 rotate: false - xy: 367, 1 + xy: 2657, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead1 rotate: false - xy: 401, 1 + xy: 2691, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead2 rotate: false - xy: 435, 1 + xy: 2691, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead3 rotate: false - xy: 469, 1 + xy: 2725, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap1 rotate: false - xy: 503, 1 + xy: 2725, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap2 rotate: false - xy: 915, 65 + xy: 2759, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap3 rotate: false - xy: 915, 31 + xy: 2759, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium1 rotate: false - xy: 4025, 321 + xy: 2793, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium2 rotate: false - xy: 4059, 321 + xy: 2793, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium3 rotate: false - xy: 4019, 287 + xy: 2827, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium1 rotate: false - xy: 4053, 287 + xy: 2827, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium2 rotate: false - xy: 1835, 223 + xy: 2861, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium3 rotate: false - xy: 1869, 223 + xy: 2861, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles1 rotate: false - xy: 1903, 223 + xy: 2895, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles2 rotate: false - xy: 945, 177 + xy: 2895, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles3 rotate: false - xy: 945, 143 + xy: 2929, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-salt rotate: false - xy: 979, 177 + xy: 2929, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-editor rotate: false - xy: 979, 177 + xy: 2929, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water1 rotate: false - xy: 979, 109 + xy: 2997, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water2 rotate: false - xy: 1013, 143 + xy: 3031, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water3 rotate: false - xy: 1047, 177 + xy: 3031, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand1 rotate: false - xy: 945, 109 + xy: 2963, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-editor rotate: false - xy: 945, 109 + xy: 2963, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand2 rotate: false - xy: 979, 143 + xy: 2963, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand3 rotate: false - xy: 1013, 177 + xy: 2997, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale1 rotate: false - xy: 1013, 109 + xy: 3065, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-editor rotate: false - xy: 1013, 109 + xy: 3065, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale2 rotate: false - xy: 1047, 143 + xy: 3065, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale3 rotate: false - xy: 1047, 109 + xy: 3099, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-slag rotate: false - xy: 949, 75 + xy: 3099, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-icon-editor rotate: false - xy: 949, 75 + xy: 3099, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow1 rotate: false - xy: 949, 41 + xy: 3133, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow2 rotate: false - xy: 983, 75 + xy: 3133, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow3 rotate: false - xy: 983, 41 + xy: 3167, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spawn rotate: false - xy: 1017, 75 + xy: 3167, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss1 rotate: false - xy: 1017, 41 + xy: 3201, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-editor rotate: false - xy: 1017, 41 + xy: 3201, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss2 rotate: false - xy: 1051, 75 + xy: 3201, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss3 rotate: false - xy: 1051, 41 + xy: 3235, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 1489, 175 + xy: 3235, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 1489, 175 + xy: 3235, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 1523, 175 + xy: 3269, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 1557, 175 + xy: 3269, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tainted-water rotate: false - xy: 1591, 183 + xy: 3303, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-editor rotate: false - xy: 1591, 183 + xy: 3303, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 1085, 193 + xy: 3303, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 1085, 193 + xy: 3303, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils1 rotate: false - xy: 1119, 193 + xy: 3337, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils2 rotate: false - xy: 1081, 159 + xy: 3337, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils3 rotate: false - xy: 1081, 125 + xy: 3371, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 1115, 159 + xy: 3371, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 1115, 159 + xy: 3371, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 exponential-reconstructor-icon-editor rotate: false - xy: 935, 261 + xy: 935, 277 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 force-projector-icon-editor rotate: false - xy: 3051, 389 + xy: 3245, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fuse-icon-editor rotate: false - xy: 3149, 389 + xy: 3343, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press-icon-editor rotate: false - xy: 2243, 323 + xy: 2081, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ground-factory-icon-editor rotate: false - xy: 3247, 389 + xy: 3441, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hail-icon-editor rotate: false - xy: 1115, 125 + xy: 3405, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icerocks-icon-editor +hyper-processor-icon-editor rotate: false - xy: 1153, 193 + xy: 3539, 405 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +ice-wall-icon-editor + rotate: false + xy: 3405, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-icon-editor rotate: false - xy: 1149, 159 + xy: 3439, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-editor rotate: false - xy: 293, 35 + xy: 293, 51 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 incinerator-icon-editor rotate: false - xy: 1187, 193 + xy: 3439, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter-icon-editor rotate: false - xy: 1149, 125 + xy: 3473, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 1183, 159 + xy: 3473, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 1221, 193 + xy: 3507, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction-icon-editor rotate: false - xy: 1183, 125 + xy: 3507, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-editor rotate: false - xy: 2309, 323 + xy: 1553, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-editor rotate: false - xy: 2375, 323 + xy: 1619, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +large-logic-display-icon-editor + rotate: false + xy: 1161, 309 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 laser-drill-icon-editor rotate: false - xy: 3345, 389 + xy: 3637, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-editor rotate: false - xy: 3443, 389 + xy: 3735, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large-icon-editor rotate: false - xy: 1453, 357 + xy: 1647, 373 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 liquid-junction-icon-editor rotate: false - xy: 1217, 159 + xy: 3541, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 1255, 193 + xy: 3541, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 1217, 125 + xy: 3575, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 3541, 389 + xy: 3833, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-void-icon-editor rotate: false - xy: 1251, 159 + xy: 3575, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-display-icon-editor rotate: false - xy: 3639, 389 + xy: 3931, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor-icon-editor rotate: false - xy: 2441, 323 + xy: 1685, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 3737, 389 + xy: 553, 83 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 2507, 323 + xy: 1751, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 1289, 193 + xy: 3609, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-editor rotate: false - xy: 423, 35 + xy: 423, 51 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 melter-icon-editor rotate: false - xy: 1323, 193 + xy: 3609, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 memory-cell-icon-editor rotate: false - xy: 1251, 125 + xy: 3643, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 2573, 323 + xy: 1817, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-icon-editor rotate: false - xy: 1285, 159 + xy: 3643, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 1285, 125 + xy: 3677, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor-icon-editor rotate: false - xy: 1319, 159 + xy: 3677, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 3835, 389 + xy: 651, 115 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor-icon-editor rotate: false - xy: 1161, 325 + xy: 1355, 341 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory-icon-editor rotate: false - xy: 3933, 389 + xy: 749, 115 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 553, 67 + xy: 847, 115 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-icon-editor rotate: false - xy: 651, 99 + xy: 945, 179 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 2639, 323 + xy: 1883, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 1319, 125 + xy: 3711, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 parallax-icon-editor rotate: false - xy: 2705, 323 + xy: 1949, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 payload-conveyor-icon-editor rotate: false - xy: 749, 99 + xy: 1043, 179 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon-editor rotate: false - xy: 847, 99 + xy: 945, 81 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 1353, 159 + xy: 3711, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 1353, 125 + xy: 2147, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 1387, 159 + xy: 2181, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 1387, 125 + xy: 2215, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 2771, 323 + xy: 2015, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 2837, 323 + xy: 2081, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 935, 211 + xy: 3851, 355 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 2903, 323 + xy: 2167, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-conveyor-icon-editor rotate: false - xy: 1421, 159 + xy: 2249, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-icon-editor rotate: false - xy: 1455, 159 + xy: 2283, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large-icon-editor rotate: false - xy: 2969, 323 + xy: 2233, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plated-conduit-icon-editor rotate: false - xy: 1421, 125 + xy: 2317, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 3035, 323 + xy: 2299, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 1455, 125 + xy: 2351, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 3101, 323 + xy: 2365, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 1489, 141 + xy: 2385, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 1523, 141 + xy: 2419, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 1557, 141 + xy: 2453, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 1591, 149 + xy: 2487, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 3167, 323 + xy: 2431, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 1085, 91 + xy: 2521, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point-icon-editor rotate: false - xy: 3233, 323 + xy: 2497, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ripple-icon-editor rotate: false - xy: 1161, 227 + xy: 1043, 81 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -rock-icon-editor - rotate: false - xy: 1489, 209 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rocks-icon-editor - rotate: false - xy: 1085, 57 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 rotary-pump-icon-editor rotate: false - xy: 3299, 323 + xy: 2563, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 1119, 91 + xy: 2555, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 3365, 323 + xy: 2629, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -saltrocks-icon-editor +salt-wall-icon-editor rotate: false - xy: 1119, 57 + xy: 2589, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 3431, 323 + xy: 2695, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-editor rotate: false - xy: 1153, 91 + xy: 2623, 237 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-wall-icon-editor + rotate: false + xy: 2657, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 1153, 57 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-icon-editor - rotate: false - xy: 1187, 91 + xy: 2691, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-editor rotate: false - xy: 3497, 323 + xy: 2761, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-icon-editor rotate: false - xy: 1187, 57 + xy: 2725, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-editor rotate: false - xy: 1583, 357 + xy: 1777, 373 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge-icon-editor rotate: false - xy: 1259, 227 + xy: 1161, 211 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 1221, 91 + xy: 2759, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 3563, 323 + xy: 2827, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 segment-icon-editor rotate: false - xy: 3629, 323 + xy: 2893, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 3695, 323 + xy: 2959, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-editor rotate: false - xy: 1221, 57 + xy: 2793, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shalerocks-icon-editor +shale-wall-icon-editor rotate: false - xy: 1255, 91 + xy: 2827, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 1255, 57 + xy: 2861, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 1289, 91 + xy: 2895, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-crucible-icon-editor rotate: false - xy: 1357, 259 + xy: 1259, 211 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 3761, 323 + xy: 3025, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +snow-boulder-icon-editor + rotate: false + xy: 3901, 355 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 snow-icon-editor rotate: false - xy: 1289, 57 + xy: 2929, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-editor rotate: false - xy: 985, 211 + xy: 3951, 355 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -snowrock-icon-editor +snow-wall-icon-editor rotate: false - xy: 1539, 209 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrocks-icon-editor - rotate: false - xy: 1323, 91 + xy: 2963, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 1323, 57 + xy: 2997, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 1455, 259 + xy: 1141, 113 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 1357, 91 + xy: 3031, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 1357, 57 + xy: 3065, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-editor rotate: false - xy: 1713, 357 + xy: 1907, 373 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spore-cluster-icon-editor rotate: false - xy: 1589, 217 + xy: 213, 9 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-pine-icon-editor rotate: false - xy: 1035, 211 + xy: 163, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 3827, 323 + xy: 3091, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks-icon-editor +spore-wall-icon-editor rotate: false - xy: 1391, 91 + xy: 3099, 237 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +steam-generator-icon-editor + rotate: false + xy: 3157, 339 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall-icon-editor + rotate: false + xy: 3133, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 3893, 323 + xy: 3223, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 1391, 57 + xy: 3167, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 3959, 323 + xy: 3289, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 553, 1 + xy: 3355, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 switch-icon-editor rotate: false - xy: 1425, 91 + xy: 3201, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils-icon-editor rotate: false - xy: 1425, 57 + xy: 3235, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tetrative-reconstructor-icon-editor rotate: false - xy: 645, 197 + xy: 645, 213 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 thermal-generator-icon-editor rotate: false - xy: 651, 33 + xy: 3421, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 1553, 259 + xy: 1239, 113 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 1651, 259 + xy: 1357, 243 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 1459, 91 + xy: 3269, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 717, 33 + xy: 3487, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster-icon-editor rotate: false - xy: 1843, 357 + xy: 2037, 373 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-conveyor-icon-editor rotate: false - xy: 1459, 57 + xy: 3303, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 1493, 107 + xy: 3337, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 783, 33 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-icon-editor - rotate: false - xy: 849, 33 + xy: 3553, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 underflow-gate-icon-editor rotate: false - xy: 1493, 73 + xy: 3371, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 1527, 107 + xy: 3405, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 1749, 259 + xy: 1455, 243 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 1357, 193 + xy: 3619, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 1423, 193 + xy: 3685, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 white-tree-dead-icon-editor rotate: false - xy: 1, 165 + xy: 1, 181 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-icon-editor rotate: false - xy: 323, 165 + xy: 323, 181 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 sprites5.png -size: 4096,512 +size: 2048,2048 format: rgba8888 filter: nearest,nearest repeat: none alpha-bg rotate: false - xy: 1, 16 + xy: 1, 528 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 bar rotate: false - xy: 2847, 167 + xy: 1830, 463 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -10300,7 +10594,7 @@ bar index: -1 bar-top rotate: false - xy: 2818, 167 + xy: 569, 37 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 @@ -10308,7287 +10602,7497 @@ bar-top index: -1 block-additive-reconstructor-large rotate: false - xy: 909, 321 + xy: 2007, 983 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-additive-reconstructor-medium rotate: false - xy: 821, 432 + xy: 1951, 731 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-additive-reconstructor-small rotate: false - xy: 781, 178 + xy: 781, 690 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-additive-reconstructor-tiny rotate: false - xy: 309, 186 + xy: 920, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-additive-reconstructor-xlarge rotate: false - xy: 131, 96 + xy: 1, 478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-air-factory-large rotate: false - xy: 959, 371 + xy: 2007, 941 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-air-factory-medium rotate: false - xy: 3343, 337 + xy: 919, 564 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-air-factory-small rotate: false - xy: 999, 80 + xy: 979, 328 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-air-factory-tiny rotate: false - xy: 257, 28 + xy: 301, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-air-factory-xlarge rotate: false - xy: 771, 416 + xy: 131, 608 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-alloy-smelter-large rotate: false - xy: 859, 221 + xy: 351, 24 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-alloy-smelter-medium rotate: false - xy: 3377, 337 + xy: 915, 530 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-alloy-smelter-small rotate: false - xy: 999, 54 + xy: 569, 11 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-alloy-smelter-tiny rotate: false - xy: 1025, 29 + xy: 319, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-alloy-smelter-xlarge rotate: false - xy: 259, 307 + xy: 771, 928 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-arc-large rotate: false - xy: 909, 279 + xy: 551, 238 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-arc-medium rotate: false - xy: 3411, 337 + xy: 915, 496 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-small rotate: false - xy: 999, 28 + xy: 1977, 703 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-arc-tiny rotate: false - xy: 1753, 81 + xy: 337, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-arc-xlarge rotate: false - xy: 131, 46 + xy: 259, 819 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-armored-conveyor-large rotate: false - xy: 1001, 371 + xy: 651, 333 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-armored-conveyor-medium rotate: false - xy: 3445, 337 + xy: 915, 462 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-small rotate: false - xy: 2883, 198 + xy: 2003, 703 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-armored-conveyor-tiny rotate: false - xy: 309, 168 + xy: 331, 598 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-armored-conveyor-xlarge rotate: false - xy: 181, 96 + xy: 1, 428 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-basalt-large + rotate: false + xy: 701, 384 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-basalt-medium + rotate: false + xy: 915, 428 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-basalt-small + rotate: false + xy: 1987, 677 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-basalt-tiny + rotate: false + xy: 2029, 711 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-basalt-xlarge + rotate: false + xy: 51, 478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-battery-large rotate: false - xy: 859, 179 + xy: 451, 74 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-large rotate: false - xy: 1043, 371 + xy: 644, 291 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-medium rotate: false - xy: 3479, 337 + xy: 1979, 899 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-large-small rotate: false - xy: 2876, 172 + xy: 2022, 881 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-large-tiny rotate: false - xy: 257, 10 + xy: 1204, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-battery-large-xlarge rotate: false - xy: 259, 257 + xy: 131, 558 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-battery-medium rotate: false - xy: 3513, 337 + xy: 2013, 907 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-small rotate: false - xy: 1028, 151 + xy: 2022, 855 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-tiny rotate: false - xy: 1771, 81 + xy: 309, 672 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-battery-xlarge rotate: false - xy: 181, 46 + xy: 181, 608 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-blast-drill-large rotate: false - xy: 1085, 371 + xy: 393, 24 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-drill-medium rotate: false - xy: 3547, 337 + xy: 1988, 865 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-drill-small rotate: false - xy: 1054, 151 + xy: 2013, 677 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-drill-tiny rotate: false - xy: 1789, 81 + xy: 331, 580 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-blast-drill-xlarge rotate: false - xy: 259, 207 + xy: 259, 769 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-blast-mixer-large rotate: false - xy: 1127, 371 + xy: 501, 143 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-mixer-medium rotate: false - xy: 3581, 337 + xy: 1988, 831 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-mixer-small rotate: false - xy: 1028, 125 + xy: 1993, 651 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-mixer-tiny rotate: false - xy: 1807, 81 + xy: 1222, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-blast-mixer-xlarge rotate: false - xy: 259, 157 + xy: 1, 378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-block-forge-large rotate: false - xy: 1169, 371 + xy: 496, 101 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-forge-medium rotate: false - xy: 3615, 337 + xy: 1987, 797 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-forge-small rotate: false - xy: 1080, 151 + xy: 1993, 625 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-forge-tiny rotate: false - xy: 1825, 81 + xy: 1240, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-block-forge-xlarge rotate: false - xy: 857, 463 + xy: 51, 428 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-block-loader-large rotate: false - xy: 1211, 371 + xy: 493, 59 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-loader-medium rotate: false - xy: 3649, 337 + xy: 1986, 763 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-loader-small rotate: false - xy: 1054, 125 + xy: 1993, 599 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-loader-tiny rotate: false - xy: 1843, 81 + xy: 1258, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-block-loader-xlarge rotate: false - xy: 907, 463 + xy: 181, 558 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-block-unloader-large rotate: false - xy: 1253, 371 + xy: 451, 32 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-unloader-medium rotate: false - xy: 3683, 337 + xy: 1985, 729 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-unloader-small rotate: false - xy: 1106, 151 + xy: 2019, 651 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-unloader-tiny rotate: false - xy: 1861, 81 + xy: 1276, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-block-unloader-xlarge rotate: false - xy: 957, 463 + xy: 259, 719 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-boulder-large + rotate: false + xy: 493, 17 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-boulder-medium + rotate: false + xy: 1007, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-boulder-small + rotate: false + xy: 2019, 625 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-boulder-tiny + rotate: false + xy: 1294, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-boulder-xlarge + rotate: false + xy: 1, 328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-bridge-conduit-large rotate: false - xy: 1295, 371 + xy: 751, 536 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conduit-medium rotate: false - xy: 3717, 337 + xy: 1041, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conduit-small rotate: false - xy: 1080, 125 + xy: 2019, 599 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conduit-tiny rotate: false - xy: 1879, 81 + xy: 1312, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-bridge-conduit-xlarge rotate: false - xy: 1007, 463 + xy: 51, 378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-bridge-conveyor-large rotate: false - xy: 1337, 371 + xy: 751, 494 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conveyor-medium rotate: false - xy: 3751, 337 + xy: 1075, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conveyor-small rotate: false - xy: 1132, 151 + xy: 1017, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conveyor-tiny rotate: false - xy: 1897, 81 + xy: 1330, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-bridge-conveyor-xlarge rotate: false - xy: 1057, 463 + xy: 259, 669 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-char-large rotate: false - xy: 1379, 371 + xy: 793, 536 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-char-medium rotate: false - xy: 3785, 337 + xy: 1109, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-char-small rotate: false - xy: 1106, 125 + xy: 1043, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-char-tiny rotate: false - xy: 1915, 81 + xy: 1348, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-char-xlarge rotate: false - xy: 1107, 463 + xy: 1, 278 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cliff-large rotate: false - xy: 1421, 371 + xy: 751, 452 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cliff-medium rotate: false - xy: 3819, 337 + xy: 1143, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliff-small rotate: false - xy: 1158, 151 + xy: 1069, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cliff-tiny rotate: false - xy: 1933, 81 + xy: 1366, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cliff-xlarge rotate: false - xy: 1157, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-cliffs-large - rotate: false - xy: 1463, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-cliffs-medium - rotate: false - xy: 3853, 337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-small - rotate: false - xy: 1132, 125 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliffs-tiny - rotate: false - xy: 1951, 81 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cliffs-xlarge - rotate: false - xy: 1207, 463 + xy: 51, 328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-coal-centrifuge-large rotate: false - xy: 1505, 371 + xy: 793, 494 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-coal-centrifuge-medium rotate: false - xy: 3887, 337 + xy: 1177, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-coal-centrifuge-small rotate: false - xy: 1184, 151 + xy: 1095, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-coal-centrifuge-tiny rotate: false - xy: 1969, 81 + xy: 1384, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-coal-centrifuge-xlarge rotate: false - xy: 1257, 463 + xy: 1, 228 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-combustion-generator-large rotate: false - xy: 1547, 371 + xy: 835, 536 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-combustion-generator-medium rotate: false - xy: 3921, 337 + xy: 1211, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-combustion-generator-small rotate: false - xy: 1158, 125 + xy: 1121, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-combustion-generator-tiny rotate: false - xy: 1987, 81 + xy: 1402, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-combustion-generator-xlarge rotate: false - xy: 1307, 463 + xy: 51, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-command-center-large + rotate: false + xy: 793, 452 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-command-center-medium + rotate: false + xy: 1245, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-command-center-small + rotate: false + xy: 1147, 388 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-command-center-tiny + rotate: false + xy: 1420, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-command-center-xlarge + rotate: false + xy: 1, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-conduit-large rotate: false - xy: 1589, 371 + xy: 835, 494 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conduit-medium rotate: false - xy: 3955, 337 + xy: 1279, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conduit-small rotate: false - xy: 1210, 151 + xy: 1173, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conduit-tiny rotate: false - xy: 2005, 81 + xy: 1438, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-conduit-xlarge rotate: false - xy: 1357, 463 + xy: 51, 228 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-container-large rotate: false - xy: 1631, 371 + xy: 835, 452 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-container-medium rotate: false - xy: 3989, 337 + xy: 1313, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-container-small rotate: false - xy: 1184, 125 + xy: 1199, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-container-tiny rotate: false - xy: 2023, 81 + xy: 1456, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-container-xlarge rotate: false - xy: 1407, 463 + xy: 1, 128 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-conveyor-large rotate: false - xy: 1673, 371 + xy: 751, 410 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conveyor-medium rotate: false - xy: 4023, 337 + xy: 1347, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conveyor-small rotate: false - xy: 1236, 151 + xy: 1225, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conveyor-tiny rotate: false - xy: 2041, 81 + xy: 1474, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-conveyor-xlarge rotate: false - xy: 1457, 463 + xy: 51, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-copper-wall-large rotate: false - xy: 1715, 371 + xy: 793, 410 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-large rotate: false - xy: 1757, 371 + xy: 835, 410 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-medium rotate: false - xy: 2925, 279 + xy: 1381, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-large-small rotate: false - xy: 1210, 125 + xy: 1251, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-large-tiny rotate: false - xy: 2059, 81 + xy: 1492, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-copper-wall-large-xlarge rotate: false - xy: 1507, 463 + xy: 1, 78 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-copper-wall-medium rotate: false - xy: 2959, 279 + xy: 1415, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-small rotate: false - xy: 1262, 151 + xy: 1277, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-tiny rotate: false - xy: 2077, 81 + xy: 1510, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-copper-wall-xlarge rotate: false - xy: 1557, 463 + xy: 51, 128 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-foundation-large rotate: false - xy: 1799, 371 + xy: 743, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-foundation-medium rotate: false - xy: 2993, 279 + xy: 1449, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-foundation-small rotate: false - xy: 1236, 125 + xy: 1303, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-foundation-tiny rotate: false - xy: 2095, 81 + xy: 1528, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-foundation-xlarge rotate: false - xy: 1607, 463 + xy: 1, 28 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-nucleus-large rotate: false - xy: 1841, 371 + xy: 785, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-nucleus-medium rotate: false - xy: 3027, 279 + xy: 1483, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-nucleus-small rotate: false - xy: 1288, 151 + xy: 1329, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-nucleus-tiny rotate: false - xy: 2113, 81 + xy: 1546, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-nucleus-xlarge rotate: false - xy: 1657, 463 + xy: 51, 78 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-shard-large rotate: false - xy: 1883, 371 + xy: 827, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-shard-medium rotate: false - xy: 3061, 279 + xy: 1517, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-shard-small rotate: false - xy: 1262, 125 + xy: 1355, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-shard-tiny rotate: false - xy: 2131, 81 + xy: 1564, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-shard-xlarge rotate: false - xy: 1707, 463 + xy: 51, 28 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-craters-large rotate: false - xy: 1925, 371 + xy: 701, 342 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-craters-medium rotate: false - xy: 3095, 279 + xy: 1551, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-craters-small rotate: false - xy: 1314, 151 + xy: 1381, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-craters-tiny rotate: false - xy: 2149, 81 + xy: 1582, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-craters-xlarge rotate: false - xy: 1757, 463 + xy: 857, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cryofluidmixer-large rotate: false - xy: 1967, 371 + xy: 743, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cryofluidmixer-medium rotate: false - xy: 3129, 279 + xy: 1585, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cryofluidmixer-small rotate: false - xy: 1288, 125 + xy: 1407, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cryofluidmixer-tiny rotate: false - xy: 2167, 81 + xy: 1600, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cryofluidmixer-xlarge rotate: false - xy: 1807, 463 + xy: 907, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cultivator-large rotate: false - xy: 2009, 371 + xy: 785, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cultivator-medium rotate: false - xy: 3163, 279 + xy: 1619, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cultivator-small rotate: false - xy: 1340, 151 + xy: 1433, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cultivator-tiny rotate: false - xy: 2185, 81 + xy: 1618, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cultivator-xlarge rotate: false - xy: 1857, 463 + xy: 957, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cyclone-large rotate: false - xy: 2051, 371 + xy: 827, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cyclone-medium rotate: false - xy: 3197, 279 + xy: 1653, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cyclone-small rotate: false - xy: 1314, 125 + xy: 1459, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cyclone-tiny rotate: false - xy: 2203, 81 + xy: 1636, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cyclone-xlarge rotate: false - xy: 1907, 463 + xy: 1007, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dacite-boulder-large + rotate: false + xy: 593, 238 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dacite-boulder-medium + rotate: false + xy: 1687, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-boulder-small + rotate: false + xy: 1485, 388 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dacite-boulder-tiny + rotate: false + xy: 1654, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dacite-boulder-xlarge + rotate: false + xy: 1057, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dacite-large + rotate: false + xy: 644, 249 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dacite-medium + rotate: false + xy: 1721, 618 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-small + rotate: false + xy: 1511, 388 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dacite-tiny + rotate: false + xy: 1672, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dacite-wall-large + rotate: false + xy: 869, 368 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dacite-wall-medium + rotate: false + xy: 965, 576 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-wall-small + rotate: false + xy: 1537, 388 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dacite-wall-tiny + rotate: false + xy: 1690, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dacite-wall-xlarge + rotate: false + xy: 1107, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dacite-xlarge + rotate: false + xy: 1157, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-metal-large rotate: false - xy: 2093, 371 + xy: 869, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-metal-medium rotate: false - xy: 3231, 279 + xy: 1755, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-metal-small rotate: false - xy: 1366, 151 + xy: 1563, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-metal-tiny rotate: false - xy: 2221, 81 + xy: 1708, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-metal-xlarge rotate: false - xy: 1957, 463 + xy: 1207, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-1-large rotate: false - xy: 2135, 371 + xy: 686, 291 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-1-medium rotate: false - xy: 3265, 279 + xy: 915, 394 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-1-small rotate: false - xy: 1340, 125 + xy: 1589, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-1-tiny rotate: false - xy: 2239, 81 + xy: 543, 149 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-1-xlarge rotate: false - xy: 2007, 463 + xy: 1257, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-2-large rotate: false - xy: 2177, 371 + xy: 686, 249 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-2-medium rotate: false - xy: 3299, 279 + xy: 911, 360 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-2-small rotate: false - xy: 1392, 151 + xy: 1615, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-2-tiny rotate: false - xy: 2257, 81 + xy: 561, 149 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-2-xlarge rotate: false - xy: 2057, 463 + xy: 1307, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-3-large rotate: false - xy: 2219, 371 + xy: 728, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-3-medium rotate: false - xy: 3343, 303 + xy: 911, 326 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-3-small rotate: false - xy: 1366, 125 + xy: 1641, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-3-tiny rotate: false - xy: 2275, 81 + xy: 1175, 167 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-3-xlarge rotate: false - xy: 2107, 463 + xy: 1357, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-4-large rotate: false - xy: 2261, 371 + xy: 770, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-4-medium rotate: false - xy: 3377, 303 + xy: 1783, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-4-small rotate: false - xy: 1418, 151 + xy: 1667, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-4-tiny rotate: false - xy: 2293, 81 + xy: 1175, 149 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-4-xlarge rotate: false - xy: 2157, 463 + xy: 1407, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-5-large rotate: false - xy: 2303, 371 + xy: 812, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-5-medium rotate: false - xy: 3411, 303 + xy: 1789, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-5-small rotate: false - xy: 1392, 125 + xy: 1693, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-5-tiny rotate: false - xy: 2311, 81 + xy: 355, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-5-xlarge rotate: false - xy: 2207, 463 + xy: 1457, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-6-large rotate: false - xy: 2345, 371 + xy: 854, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-6-medium rotate: false - xy: 3445, 303 + xy: 1817, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-6-small rotate: false - xy: 1444, 151 + xy: 1719, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-6-tiny rotate: false - xy: 2329, 81 + xy: 373, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-6-xlarge rotate: false - xy: 2257, 463 + xy: 1507, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-darksand-large rotate: false - xy: 2387, 371 + xy: 728, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-medium rotate: false - xy: 3479, 303 + xy: 1823, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-small rotate: false - xy: 1418, 125 + xy: 1745, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-large rotate: false - xy: 2429, 371 + xy: 770, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-tainted-water-medium rotate: false - xy: 3513, 303 + xy: 1851, 660 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-tainted-water-small rotate: false - xy: 1470, 151 + xy: 1771, 394 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-tiny rotate: false - xy: 2347, 81 + xy: 391, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-tainted-water-xlarge rotate: false - xy: 2307, 463 + xy: 1557, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-darksand-tiny rotate: false - xy: 2365, 81 + xy: 409, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-water-large rotate: false - xy: 2471, 371 + xy: 812, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-water-medium rotate: false - xy: 3547, 303 + xy: 1857, 626 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-water-small rotate: false - xy: 1444, 125 + xy: 1010, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-water-tiny rotate: false - xy: 2383, 81 + xy: 1175, 131 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-water-xlarge rotate: false - xy: 2357, 463 + xy: 1607, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-darksand-xlarge rotate: false - xy: 2407, 463 + xy: 1657, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-deepwater-large rotate: false - xy: 2513, 371 + xy: 854, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-deepwater-medium rotate: false - xy: 3581, 303 + xy: 1885, 660 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-deepwater-small rotate: false - xy: 1496, 151 + xy: 1036, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-deepwater-tiny rotate: false - xy: 2401, 81 + xy: 1734, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-deepwater-xlarge rotate: false - xy: 2457, 463 + xy: 1707, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-differential-generator-large rotate: false - xy: 2555, 371 + xy: 896, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-differential-generator-medium rotate: false - xy: 3615, 303 + xy: 1891, 626 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-differential-generator-small rotate: false - xy: 1470, 125 + xy: 1062, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-differential-generator-tiny rotate: false - xy: 2419, 81 + xy: 1833, 575 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-differential-generator-xlarge rotate: false - xy: 2507, 463 + xy: 1757, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-diode-large rotate: false - xy: 2597, 371 + xy: 896, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-diode-medium rotate: false - xy: 3649, 303 + xy: 938, 292 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-diode-small rotate: false - xy: 1522, 151 + xy: 1088, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-diode-tiny rotate: false - xy: 2437, 81 + xy: 1833, 557 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-diode-xlarge rotate: false - xy: 2557, 463 + xy: 1807, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dirt-large + rotate: false + xy: 821, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dirt-medium + rotate: false + xy: 938, 258 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-small + rotate: false + xy: 1114, 362 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dirt-tiny + rotate: false + xy: 1851, 574 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dirt-wall-large + rotate: false + xy: 863, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dirt-wall-medium + rotate: false + xy: 938, 224 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-small + rotate: false + xy: 1140, 362 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dirt-wall-tiny + rotate: false + xy: 1869, 574 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dirt-wall-xlarge + rotate: false + xy: 1857, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dirt-xlarge + rotate: false + xy: 1907, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-disassembler-large rotate: false - xy: 2639, 371 + xy: 905, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-disassembler-medium rotate: false - xy: 3683, 303 + xy: 1909, 696 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-disassembler-small rotate: false - xy: 1496, 125 + xy: 1166, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-disassembler-tiny rotate: false - xy: 2455, 81 + xy: 1887, 574 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-disassembler-xlarge rotate: false - xy: 2607, 463 + xy: 1957, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-distributor-large rotate: false - xy: 2681, 371 + xy: 947, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-distributor-medium rotate: false - xy: 3717, 303 + xy: 1919, 662 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-distributor-small rotate: false - xy: 1548, 151 + xy: 1192, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-distributor-tiny rotate: false - xy: 2473, 81 + xy: 1905, 574 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-distributor-xlarge rotate: false - xy: 2657, 463 + xy: 345, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-door-large rotate: false - xy: 2723, 371 + xy: 989, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-large rotate: false - xy: 2765, 371 + xy: 1031, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-medium rotate: false - xy: 3751, 303 + xy: 1925, 628 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-large-small rotate: false - xy: 1522, 125 + xy: 1218, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-large-tiny rotate: false - xy: 2491, 81 + xy: 1851, 556 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-door-large-xlarge rotate: false - xy: 2707, 463 + xy: 395, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-door-medium rotate: false - xy: 3785, 303 + xy: 1943, 696 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-small rotate: false - xy: 1574, 151 + xy: 1244, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-tiny rotate: false - xy: 2509, 81 + xy: 1869, 556 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-door-xlarge rotate: false - xy: 2757, 463 + xy: 445, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dunerocks-large +block-dune-wall-large rotate: false - xy: 2807, 371 + xy: 1073, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dunerocks-medium +block-dune-wall-medium rotate: false - xy: 3819, 303 + xy: 1953, 662 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dunerocks-small +block-dune-wall-small rotate: false - xy: 1548, 125 + xy: 1270, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dunerocks-tiny +block-dune-wall-tiny rotate: false - xy: 2527, 81 + xy: 1887, 556 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dunerocks-xlarge +block-dune-wall-xlarge rotate: false - xy: 2807, 463 + xy: 495, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-duo-large rotate: false - xy: 2849, 371 + xy: 1115, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-duo-medium rotate: false - xy: 3853, 303 + xy: 1959, 628 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-small rotate: false - xy: 1600, 151 + xy: 1296, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-duo-tiny rotate: false - xy: 2545, 81 + xy: 1905, 556 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-duo-xlarge rotate: false - xy: 2857, 463 + xy: 545, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-exponential-reconstructor-large rotate: false - xy: 2891, 371 + xy: 1157, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-exponential-reconstructor-medium rotate: false - xy: 3887, 303 + xy: 538, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-exponential-reconstructor-small rotate: false - xy: 1574, 125 + xy: 1322, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-exponential-reconstructor-tiny rotate: false - xy: 2563, 81 + xy: 1752, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-exponential-reconstructor-xlarge rotate: false - xy: 2907, 463 + xy: 595, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-force-projector-large rotate: false - xy: 2933, 371 + xy: 1199, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-force-projector-medium rotate: false - xy: 3921, 303 + xy: 538, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-force-projector-small rotate: false - xy: 1626, 151 + xy: 1348, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-force-projector-tiny rotate: false - xy: 2581, 81 + xy: 1833, 539 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-force-projector-xlarge rotate: false - xy: 2957, 463 + xy: 645, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-fuse-large rotate: false - xy: 2975, 371 + xy: 1241, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-fuse-medium rotate: false - xy: 3955, 303 + xy: 535, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-fuse-small rotate: false - xy: 1600, 125 + xy: 1374, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-fuse-tiny rotate: false - xy: 2599, 81 + xy: 1832, 521 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-fuse-xlarge rotate: false - xy: 3007, 463 + xy: 695, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-graphite-press-large rotate: false - xy: 3017, 371 + xy: 1283, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-graphite-press-medium rotate: false - xy: 3989, 303 + xy: 535, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-graphite-press-small rotate: false - xy: 1652, 151 + xy: 1400, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-graphite-press-tiny rotate: false - xy: 2617, 81 + xy: 1832, 503 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-graphite-press-xlarge rotate: false - xy: 3057, 463 + xy: 101, 478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-grass-large rotate: false - xy: 3059, 371 + xy: 1325, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-grass-medium rotate: false - xy: 4023, 303 + xy: 1857, 592 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-grass-small rotate: false - xy: 1626, 125 + xy: 1426, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-grass-tiny rotate: false - xy: 2635, 81 + xy: 1851, 538 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-grass-xlarge rotate: false - xy: 3107, 463 + xy: 101, 428 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ground-factory-large rotate: false - xy: 3101, 371 + xy: 1367, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ground-factory-medium rotate: false - xy: 965, 119 + xy: 1891, 592 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ground-factory-small rotate: false - xy: 1678, 151 + xy: 1452, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ground-factory-tiny rotate: false - xy: 2653, 81 + xy: 1869, 538 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ground-factory-xlarge rotate: false - xy: 3157, 463 + xy: 101, 378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-hail-large rotate: false - xy: 3143, 371 + xy: 1409, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-hail-medium rotate: false - xy: 965, 85 + xy: 1925, 594 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hail-small rotate: false - xy: 1652, 125 + xy: 1478, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-hail-tiny rotate: false - xy: 2671, 81 + xy: 1887, 538 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-hail-xlarge rotate: false - xy: 3207, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-holostone-large - rotate: false - xy: 3185, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-holostone-medium - rotate: false - xy: 965, 51 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-small - rotate: false - xy: 1704, 151 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-holostone-tiny - rotate: false - xy: 2689, 81 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-holostone-xlarge - rotate: false - xy: 3257, 463 + xy: 101, 328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-hotrock-large rotate: false - xy: 3227, 371 + xy: 1451, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-hotrock-medium rotate: false - xy: 965, 17 + xy: 1959, 594 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hotrock-small rotate: false - xy: 1678, 125 + xy: 1504, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-hotrock-tiny rotate: false - xy: 2707, 81 + xy: 1905, 538 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-hotrock-xlarge rotate: false - xy: 3307, 463 + xy: 101, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-hyper-processor-large + rotate: false + xy: 1493, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-hyper-processor-medium + rotate: false + xy: 546, 201 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hyper-processor-small + rotate: false + xy: 1530, 362 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-hyper-processor-tiny + rotate: false + xy: 1850, 520 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-hyper-processor-xlarge + rotate: false + xy: 101, 228 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ice-large rotate: false - xy: 3269, 371 + xy: 1535, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ice-medium rotate: false - xy: 2921, 245 + xy: 580, 204 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-small rotate: false - xy: 1730, 151 + xy: 1556, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ice-snow-large rotate: false - xy: 3311, 371 + xy: 1577, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ice-snow-medium rotate: false - xy: 2955, 245 + xy: 614, 204 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-snow-small rotate: false - xy: 1704, 125 + xy: 1582, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ice-snow-tiny rotate: false - xy: 2725, 81 + xy: 1868, 520 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ice-snow-xlarge rotate: false - xy: 3357, 463 + xy: 101, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ice-tiny rotate: false - xy: 2743, 81 + xy: 1886, 520 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +block-ice-wall-large + rotate: false + xy: 1619, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-wall-medium + rotate: false + xy: 648, 215 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-wall-small + rotate: false + xy: 1608, 362 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-wall-tiny + rotate: false + xy: 1904, 520 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-wall-xlarge + rotate: false + xy: 101, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 block-ice-xlarge rotate: false - xy: 3407, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-icerocks-large - rotate: false - xy: 3353, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-icerocks-medium - rotate: false - xy: 2989, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-icerocks-small - rotate: false - xy: 1756, 151 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-icerocks-tiny - rotate: false - xy: 999, 10 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-icerocks-xlarge - rotate: false - xy: 3457, 463 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ignarock-large - rotate: false - xy: 3395, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ignarock-medium - rotate: false - xy: 3023, 245 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-small - rotate: false - xy: 1730, 125 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ignarock-tiny - rotate: false - xy: 1129, 55 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ignarock-xlarge - rotate: false - xy: 3507, 463 + xy: 101, 78 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-illuminator-large rotate: false - xy: 3437, 371 + xy: 1661, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-illuminator-medium rotate: false - xy: 3057, 245 + xy: 682, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-illuminator-small rotate: false - xy: 1782, 151 + xy: 1634, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-illuminator-tiny rotate: false - xy: 1147, 55 + xy: 1850, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-illuminator-xlarge rotate: false - xy: 3557, 463 + xy: 101, 28 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-impact-reactor-large rotate: false - xy: 3479, 371 + xy: 1703, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-impact-reactor-medium rotate: false - xy: 3091, 245 + xy: 546, 167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-impact-reactor-small rotate: false - xy: 1756, 125 + xy: 1660, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-impact-reactor-tiny rotate: false - xy: 1165, 55 + xy: 1868, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-impact-reactor-xlarge rotate: false - xy: 3607, 463 + xy: 231, 608 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-incinerator-large rotate: false - xy: 3521, 371 + xy: 1745, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-incinerator-medium rotate: false - xy: 3125, 245 + xy: 580, 170 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-incinerator-small rotate: false - xy: 1808, 151 + xy: 1686, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-incinerator-tiny rotate: false - xy: 1183, 55 + xy: 1886, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-incinerator-xlarge rotate: false - xy: 3657, 463 + xy: 231, 558 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-inverted-sorter-large rotate: false - xy: 3563, 371 + xy: 1787, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-inverted-sorter-medium rotate: false - xy: 3159, 245 + xy: 614, 170 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-inverted-sorter-small rotate: false - xy: 1782, 125 + xy: 1712, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-inverted-sorter-tiny rotate: false - xy: 1201, 55 + xy: 1904, 502 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-inverted-sorter-xlarge rotate: false - xy: 3707, 463 + xy: 745, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-item-source-large rotate: false - xy: 3605, 371 + xy: 1829, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-item-source-medium rotate: false - xy: 3193, 245 + xy: 648, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-source-small rotate: false - xy: 1834, 151 + xy: 1738, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-item-source-tiny rotate: false - xy: 1219, 55 + xy: 1859, 484 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-item-source-xlarge rotate: false - xy: 3757, 463 + xy: 151, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-item-void-large rotate: false - xy: 3647, 371 + xy: 1871, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-item-void-medium rotate: false - xy: 3227, 245 + xy: 682, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-void-small rotate: false - xy: 1808, 125 + xy: 1010, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-item-void-tiny rotate: false - xy: 1237, 55 + xy: 1859, 466 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-item-void-xlarge rotate: false - xy: 3807, 463 + xy: 151, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-junction-large rotate: false - xy: 3689, 371 + xy: 1913, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-junction-medium rotate: false - xy: 3261, 245 + xy: 716, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-junction-small rotate: false - xy: 1860, 151 + xy: 1036, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-junction-tiny rotate: false - xy: 1255, 55 + xy: 1877, 484 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-junction-xlarge rotate: false - xy: 3857, 463 + xy: 201, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-kiln-large rotate: false - xy: 3731, 371 + xy: 1955, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-kiln-medium rotate: false - xy: 3295, 245 + xy: 750, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-kiln-small rotate: false - xy: 1834, 125 + xy: 1062, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-kiln-tiny rotate: false - xy: 1273, 55 + xy: 1859, 448 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-kiln-xlarge rotate: false - xy: 3907, 463 + xy: 151, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-lancer-large rotate: false - xy: 3773, 371 + xy: 845, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-lancer-medium rotate: false - xy: 3333, 269 + xy: 784, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-lancer-small rotate: false - xy: 1886, 151 + xy: 1088, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-lancer-tiny rotate: false - xy: 1291, 55 + xy: 1877, 466 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-lancer-xlarge rotate: false - xy: 3957, 463 + xy: 201, 458 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-large-logic-display-large + rotate: false + xy: 887, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-large-logic-display-medium + rotate: false + xy: 818, 208 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-large-logic-display-small + rotate: false + xy: 1114, 336 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-large-logic-display-tiny + rotate: false + xy: 1895, 484 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-large-logic-display-xlarge + rotate: false + xy: 151, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-laser-drill-large rotate: false - xy: 3815, 371 + xy: 929, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-laser-drill-medium rotate: false - xy: 3367, 269 + xy: 852, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-laser-drill-small rotate: false - xy: 1860, 125 + xy: 1140, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-laser-drill-tiny rotate: false - xy: 1309, 55 + xy: 1859, 430 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-laser-drill-xlarge rotate: false - xy: 4007, 463 + xy: 201, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-launch-pad-large rotate: false - xy: 3857, 371 + xy: 971, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-launch-pad-large-large rotate: false - xy: 3899, 371 + xy: 1013, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-launch-pad-large-medium rotate: false - xy: 3401, 269 + xy: 886, 208 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-launch-pad-large-small rotate: false - xy: 1912, 151 + xy: 1166, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-launch-pad-large-tiny rotate: false - xy: 1327, 55 + xy: 1877, 448 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-launch-pad-large-xlarge rotate: false - xy: 345, 354 + xy: 151, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-launch-pad-medium rotate: false - xy: 3435, 269 + xy: 716, 174 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-launch-pad-small rotate: false - xy: 1886, 125 + xy: 1192, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-launch-pad-tiny rotate: false - xy: 1345, 55 + xy: 1895, 466 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-launch-pad-xlarge rotate: false - xy: 395, 354 + xy: 201, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-junction-large rotate: false - xy: 3941, 371 + xy: 1055, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-junction-medium rotate: false - xy: 3469, 269 + xy: 750, 174 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-junction-small rotate: false - xy: 1938, 151 + xy: 1218, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-junction-tiny rotate: false - xy: 1363, 55 + xy: 1859, 412 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-junction-xlarge rotate: false - xy: 445, 354 + xy: 151, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-router-large rotate: false - xy: 3983, 371 + xy: 1097, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-router-medium rotate: false - xy: 3503, 269 + xy: 784, 174 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-router-small rotate: false - xy: 1912, 125 + xy: 1244, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-router-tiny rotate: false - xy: 1381, 55 + xy: 1877, 430 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-router-xlarge rotate: false - xy: 495, 354 + xy: 201, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-source-large rotate: false - xy: 4025, 371 + xy: 1139, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-source-medium rotate: false - xy: 3537, 269 + xy: 818, 174 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-source-small rotate: false - xy: 1964, 151 + xy: 1270, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-source-tiny rotate: false - xy: 1399, 55 + xy: 1895, 448 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-source-xlarge rotate: false - xy: 545, 354 + xy: 151, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-tank-large rotate: false - xy: 131, 4 + xy: 1181, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-tank-medium rotate: false - xy: 3571, 269 + xy: 852, 174 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-tank-small rotate: false - xy: 1938, 125 + xy: 1296, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-tank-tiny rotate: false - xy: 1417, 55 + xy: 1877, 412 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-tank-xlarge rotate: false - xy: 595, 354 + xy: 201, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-void-large rotate: false - xy: 173, 4 + xy: 1223, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-void-medium rotate: false - xy: 3605, 269 + xy: 886, 174 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-void-small rotate: false - xy: 1990, 151 + xy: 1322, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-void-tiny rotate: false - xy: 1435, 55 + xy: 1895, 430 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-void-xlarge rotate: false - xy: 645, 354 + xy: 151, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-logic-display-large rotate: false - xy: 215, 4 + xy: 1265, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-logic-display-medium rotate: false - xy: 3639, 269 + xy: 920, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-logic-display-small rotate: false - xy: 1964, 125 + xy: 1348, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-logic-display-tiny rotate: false - xy: 1453, 55 + xy: 1895, 412 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-logic-display-xlarge rotate: false - xy: 695, 354 + xy: 201, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-logic-processor-large rotate: false - xy: 909, 237 + xy: 1307, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-logic-processor-medium rotate: false - xy: 3673, 269 + xy: 954, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-logic-processor-small rotate: false - xy: 2016, 151 + xy: 1374, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-logic-processor-tiny rotate: false - xy: 1471, 55 + xy: 1859, 394 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-logic-processor-xlarge rotate: false - xy: 231, 96 + xy: 151, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-magmarock-large rotate: false - xy: 901, 195 + xy: 1349, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-magmarock-medium rotate: false - xy: 3707, 269 + xy: 920, 156 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-magmarock-small rotate: false - xy: 1990, 125 + xy: 1400, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-magmarock-tiny rotate: false - xy: 1489, 55 + xy: 1877, 394 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-magmarock-xlarge rotate: false - xy: 231, 46 + xy: 201, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mass-driver-large rotate: false - xy: 901, 153 + xy: 1391, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mass-driver-medium rotate: false - xy: 3741, 269 + xy: 954, 156 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mass-driver-small rotate: false - xy: 2042, 151 + xy: 1426, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mass-driver-tiny rotate: false - xy: 1507, 55 + xy: 1895, 394 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mass-driver-xlarge rotate: false - xy: 745, 354 + xy: 151, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mechanical-drill-large rotate: false - xy: 881, 111 + xy: 1433, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mechanical-drill-medium rotate: false - xy: 3775, 269 + xy: 648, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mechanical-drill-small rotate: false - xy: 2016, 125 + xy: 1452, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mechanical-drill-tiny rotate: false - xy: 1525, 55 + xy: 1913, 484 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mechanical-drill-xlarge rotate: false - xy: 281, 107 + xy: 201, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mechanical-pump-large rotate: false - xy: 881, 69 + xy: 1475, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mechanical-pump-medium rotate: false - xy: 3809, 269 + xy: 682, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mechanical-pump-small rotate: false - xy: 2068, 151 + xy: 1478, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mechanical-pump-tiny rotate: false - xy: 1543, 55 + xy: 1913, 466 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mechanical-pump-xlarge rotate: false - xy: 281, 57 + xy: 201, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-meltdown-large rotate: false - xy: 881, 27 + xy: 1517, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-meltdown-medium rotate: false - xy: 3843, 269 + xy: 716, 140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-meltdown-small rotate: false - xy: 2042, 125 + xy: 1504, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-meltdown-tiny rotate: false - xy: 1561, 55 + xy: 1913, 448 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-meltdown-xlarge rotate: false - xy: 795, 366 + xy: 251, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-melter-large rotate: false - xy: 923, 111 + xy: 1559, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-melter-medium rotate: false - xy: 3877, 269 + xy: 750, 140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-melter-small rotate: false - xy: 2094, 151 + xy: 1530, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-melter-tiny rotate: false - xy: 1579, 55 + xy: 1913, 430 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-melter-xlarge rotate: false - xy: 309, 304 + xy: 251, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-memory-cell-large rotate: false - xy: 923, 69 + xy: 1601, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-memory-cell-medium rotate: false - xy: 3911, 269 + xy: 784, 140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-memory-cell-small rotate: false - xy: 2068, 125 + xy: 1556, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-memory-cell-tiny rotate: false - xy: 1597, 55 + xy: 1913, 412 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-memory-cell-xlarge rotate: false - xy: 309, 254 + xy: 251, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mend-projector-large rotate: false - xy: 923, 27 + xy: 1643, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mend-projector-medium rotate: false - xy: 3945, 269 + xy: 818, 140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mend-projector-small rotate: false - xy: 2120, 151 + xy: 1582, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mend-projector-tiny rotate: false - xy: 1615, 55 + xy: 1913, 394 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mend-projector-xlarge rotate: false - xy: 359, 304 + xy: 251, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mender-large rotate: false - xy: 951, 321 + xy: 1685, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mender-medium rotate: false - xy: 3979, 269 + xy: 852, 140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mender-small rotate: false - xy: 2094, 125 + xy: 1608, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mender-tiny rotate: false - xy: 1633, 55 + xy: 1193, 167 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mender-xlarge rotate: false - xy: 309, 204 + xy: 251, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-message-large rotate: false - xy: 951, 279 + xy: 1727, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-message-medium rotate: false - xy: 4013, 269 + xy: 886, 140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-message-small rotate: false - xy: 2146, 151 + xy: 1634, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-message-tiny rotate: false - xy: 1651, 55 + xy: 1193, 149 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-message-xlarge rotate: false - xy: 359, 254 + xy: 251, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-2-large rotate: false - xy: 951, 237 + xy: 1769, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-2-medium rotate: false - xy: 3329, 235 + xy: 920, 122 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-2-small rotate: false - xy: 2120, 125 + xy: 1660, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-2-tiny rotate: false - xy: 1669, 55 + xy: 1193, 131 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-2-xlarge rotate: false - xy: 409, 304 + xy: 251, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-3-large rotate: false - xy: 943, 195 + xy: 1811, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-3-medium rotate: false - xy: 3363, 235 + xy: 954, 122 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-3-small rotate: false - xy: 2172, 151 + xy: 1686, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-3-tiny rotate: false - xy: 1687, 55 + xy: 1764, 370 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-3-xlarge rotate: false - xy: 359, 204 + xy: 251, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-5-large rotate: false - xy: 943, 153 + xy: 1853, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-5-medium rotate: false - xy: 3397, 235 + xy: 949, 530 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-5-small rotate: false - xy: 2146, 125 + xy: 1712, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-5-tiny rotate: false - xy: 1705, 55 + xy: 1764, 352 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-5-xlarge rotate: false - xy: 409, 254 + xy: 251, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-damaged-large rotate: false - xy: 993, 329 + xy: 1895, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-damaged-medium rotate: false - xy: 3431, 235 + xy: 949, 496 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-damaged-small rotate: false - xy: 2198, 151 + xy: 1738, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-damaged-tiny rotate: false - xy: 1723, 55 + xy: 1764, 334 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-damaged-xlarge rotate: false - xy: 459, 304 + xy: 251, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-large rotate: false - xy: 993, 287 + xy: 1937, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-medium rotate: false - xy: 3465, 235 + xy: 949, 462 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-small rotate: false - xy: 2172, 125 + xy: 1006, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-tiny rotate: false - xy: 1741, 55 + xy: 1760, 316 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-xlarge rotate: false - xy: 409, 204 + xy: 151, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-micro-processor-large rotate: false - xy: 1035, 329 + xy: 859, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-micro-processor-medium rotate: false - xy: 3499, 235 + xy: 949, 428 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-micro-processor-small rotate: false - xy: 2224, 151 + xy: 1006, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-micro-processor-tiny rotate: false - xy: 1051, 39 + xy: 1760, 298 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-micro-processor-xlarge rotate: false - xy: 459, 254 + xy: 201, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-moss-large rotate: false - xy: 993, 245 + xy: 859, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-moss-medium rotate: false - xy: 3533, 235 + xy: 949, 394 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-moss-small rotate: false - xy: 2198, 125 + xy: 1032, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-moss-tiny rotate: false - xy: 1069, 39 + xy: 1760, 280 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-moss-xlarge rotate: false - xy: 509, 304 + xy: 251, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-multi-press-large rotate: false - xy: 1035, 287 + xy: 901, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-multi-press-medium rotate: false - xy: 3567, 235 + xy: 945, 360 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-multi-press-small rotate: false - xy: 2250, 151 + xy: 1006, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-multi-press-tiny rotate: false - xy: 1087, 39 + xy: 1760, 262 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-multi-press-xlarge rotate: false - xy: 459, 204 + xy: 281, 619 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-multiplicative-reconstructor-large rotate: false - xy: 1077, 329 + xy: 859, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-multiplicative-reconstructor-medium rotate: false - xy: 3601, 235 + xy: 945, 326 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-multiplicative-reconstructor-small rotate: false - xy: 2224, 125 + xy: 1032, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-multiplicative-reconstructor-tiny rotate: false - xy: 1105, 44 + xy: 1760, 244 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-multiplicative-reconstructor-xlarge rotate: false - xy: 509, 254 + xy: 281, 569 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-naval-factory-large rotate: false - xy: 1035, 245 + xy: 943, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-naval-factory-medium rotate: false - xy: 3635, 235 + xy: 972, 292 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-naval-factory-small rotate: false - xy: 2276, 151 + xy: 1058, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-naval-factory-tiny rotate: false - xy: 1759, 63 + xy: 1782, 376 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-naval-factory-xlarge rotate: false - xy: 559, 304 + xy: 301, 519 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-oil-extractor-large rotate: false - xy: 1077, 287 + xy: 901, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-oil-extractor-medium rotate: false - xy: 3669, 235 + xy: 972, 258 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-oil-extractor-small rotate: false - xy: 2250, 125 + xy: 1006, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-oil-extractor-tiny rotate: false - xy: 1777, 63 + xy: 1782, 358 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-oil-extractor-xlarge rotate: false - xy: 509, 204 + xy: 301, 469 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-coal-large rotate: false - xy: 1119, 329 + xy: 859, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-coal-medium rotate: false - xy: 3703, 235 + xy: 972, 224 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-coal-small rotate: false - xy: 2302, 151 + xy: 1032, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-coal-tiny rotate: false - xy: 1795, 63 + xy: 1782, 340 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-coal-xlarge rotate: false - xy: 559, 254 + xy: 301, 419 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-copper-large rotate: false - xy: 1077, 245 + xy: 985, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-copper-medium rotate: false - xy: 3737, 235 + xy: 988, 190 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-small rotate: false - xy: 2276, 125 + xy: 1058, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-copper-tiny rotate: false - xy: 1813, 63 + xy: 1770, 226 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-copper-xlarge rotate: false - xy: 609, 304 + xy: 301, 369 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-lead-large rotate: false - xy: 1119, 287 + xy: 943, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-lead-medium rotate: false - xy: 3771, 235 + xy: 988, 156 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-small rotate: false - xy: 2328, 151 + xy: 1084, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-lead-tiny rotate: false - xy: 1831, 63 + xy: 1782, 322 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-lead-xlarge rotate: false - xy: 559, 204 + xy: 301, 319 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-scrap-large rotate: false - xy: 1161, 329 + xy: 901, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-scrap-medium rotate: false - xy: 3805, 235 + xy: 988, 122 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-small rotate: false - xy: 2302, 125 + xy: 1032, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-scrap-tiny rotate: false - xy: 1849, 63 + xy: 1778, 304 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-scrap-xlarge rotate: false - xy: 609, 254 + xy: 301, 269 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-thorium-large rotate: false - xy: 1119, 245 + xy: 859, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-thorium-medium rotate: false - xy: 3839, 235 + xy: 1003, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-small rotate: false - xy: 2354, 151 + xy: 1058, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-thorium-tiny rotate: false - xy: 1867, 63 + xy: 1778, 286 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-thorium-xlarge rotate: false - xy: 659, 304 + xy: 301, 219 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-titanium-large rotate: false - xy: 1161, 287 + xy: 1027, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-titanium-medium rotate: false - xy: 3873, 235 + xy: 1037, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-small rotate: false - xy: 2328, 125 + xy: 1084, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-titanium-tiny rotate: false - xy: 1885, 63 + xy: 1778, 268 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-titanium-xlarge rotate: false - xy: 609, 204 + xy: 301, 169 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-overdrive-dome-large rotate: false - xy: 1203, 329 + xy: 985, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-overdrive-dome-medium rotate: false - xy: 3907, 235 + xy: 1071, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-overdrive-dome-small rotate: false - xy: 2380, 151 + xy: 1110, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-overdrive-dome-tiny rotate: false - xy: 1903, 63 + xy: 1778, 250 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-overdrive-dome-xlarge rotate: false - xy: 659, 254 + xy: 301, 119 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-overdrive-projector-large rotate: false - xy: 1161, 245 + xy: 943, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-overdrive-projector-medium rotate: false - xy: 3941, 235 + xy: 1105, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-overdrive-projector-small rotate: false - xy: 2354, 125 + xy: 1058, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-overdrive-projector-tiny rotate: false - xy: 1921, 63 + xy: 1993, 581 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-overdrive-projector-xlarge rotate: false - xy: 709, 304 + xy: 301, 69 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-overflow-gate-large rotate: false - xy: 1203, 287 + xy: 901, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-overflow-gate-medium rotate: false - xy: 3975, 235 + xy: 1139, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-overflow-gate-small rotate: false - xy: 2406, 151 + xy: 1084, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-overflow-gate-tiny rotate: false - xy: 1939, 63 + xy: 2011, 581 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-overflow-gate-xlarge rotate: false - xy: 659, 204 + xy: 301, 19 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-parallax-large rotate: false - xy: 1245, 329 + xy: 1069, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-parallax-medium rotate: false - xy: 4009, 235 + xy: 1173, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-parallax-small rotate: false - xy: 2380, 125 + xy: 1110, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-parallax-tiny rotate: false - xy: 1957, 63 + xy: 2029, 581 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-parallax-xlarge rotate: false - xy: 709, 254 + xy: 795, 878 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-payload-conveyor-large rotate: false - xy: 1203, 245 + xy: 1027, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-payload-conveyor-medium rotate: false - xy: 2883, 224 + xy: 1207, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-payload-conveyor-small rotate: false - xy: 2432, 151 + xy: 1136, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-payload-conveyor-tiny rotate: false - xy: 1975, 63 + xy: 1022, 109 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-payload-conveyor-xlarge rotate: false - xy: 709, 204 + xy: 309, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-payload-router-large rotate: false - xy: 1245, 287 + xy: 985, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-payload-router-medium rotate: false - xy: 2917, 211 + xy: 1241, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-payload-router-small rotate: false - xy: 2406, 125 + xy: 1084, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-payload-router-tiny rotate: false - xy: 1993, 63 + xy: 1040, 109 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-payload-router-xlarge rotate: false - xy: 759, 304 + xy: 309, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pebbles-large rotate: false - xy: 1287, 329 + xy: 943, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pebbles-medium rotate: false - xy: 2951, 211 + xy: 1275, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pebbles-small rotate: false - xy: 2458, 151 + xy: 1110, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pebbles-tiny rotate: false - xy: 2011, 63 + xy: 1058, 110 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pebbles-xlarge rotate: false - xy: 759, 254 + xy: 359, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-conduit-large rotate: false - xy: 1245, 245 + xy: 901, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-conduit-medium rotate: false - xy: 2985, 211 + xy: 1309, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conduit-small rotate: false - xy: 2432, 125 + xy: 1136, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-conduit-tiny rotate: false - xy: 2029, 63 + xy: 1076, 110 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-conduit-xlarge rotate: false - xy: 759, 204 + xy: 309, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-conveyor-large rotate: false - xy: 1287, 287 + xy: 1111, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-conveyor-medium rotate: false - xy: 3019, 211 + xy: 1343, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conveyor-small rotate: false - xy: 2484, 151 + xy: 1162, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-conveyor-tiny rotate: false - xy: 2047, 63 + xy: 1094, 110 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-conveyor-xlarge rotate: false - xy: 809, 316 + xy: 359, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-wall-large rotate: false - xy: 1329, 329 + xy: 1069, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-wall-large-large rotate: false - xy: 1287, 245 + xy: 1027, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-wall-large-medium rotate: false - xy: 3053, 211 + xy: 1377, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-large-small rotate: false - xy: 2458, 125 + xy: 1110, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-wall-large-tiny rotate: false - xy: 2065, 63 + xy: 1112, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-wall-large-xlarge rotate: false - xy: 809, 266 + xy: 409, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-wall-medium rotate: false - xy: 3087, 211 + xy: 1411, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-small rotate: false - xy: 2510, 151 + xy: 1136, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-wall-tiny rotate: false - xy: 2083, 63 + xy: 1130, 119 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-wall-xlarge rotate: false - xy: 809, 216 + xy: 359, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-weaver-large rotate: false - xy: 1329, 287 + xy: 985, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-weaver-medium rotate: false - xy: 3121, 211 + xy: 1445, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-weaver-small rotate: false - xy: 2484, 125 + xy: 1162, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-weaver-tiny rotate: false - xy: 2101, 63 + xy: 1112, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-weaver-xlarge rotate: false - xy: 809, 166 + xy: 409, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pine-large rotate: false - xy: 1371, 329 + xy: 943, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pine-medium rotate: false - xy: 3155, 211 + xy: 1479, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pine-small rotate: false - xy: 2536, 151 + xy: 1188, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pine-tiny rotate: false - xy: 2119, 63 + xy: 1130, 101 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pine-xlarge rotate: false - xy: 281, 7 + xy: 459, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-compressor-large rotate: false - xy: 1329, 245 + xy: 1153, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-compressor-medium rotate: false - xy: 3189, 211 + xy: 1513, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-compressor-small rotate: false - xy: 2510, 125 + xy: 1136, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-compressor-tiny rotate: false - xy: 2137, 63 + xy: 1200, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-compressor-xlarge rotate: false - xy: 331, 154 + xy: 409, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-conveyor-large rotate: false - xy: 1371, 287 + xy: 1111, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-conveyor-medium rotate: false - xy: 3223, 211 + xy: 1547, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-conveyor-small rotate: false - xy: 2562, 151 + xy: 1162, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-conveyor-tiny rotate: false - xy: 2155, 63 + xy: 1218, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-conveyor-xlarge rotate: false - xy: 331, 104 + xy: 459, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-wall-large rotate: false - xy: 1413, 329 + xy: 1069, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-wall-large-large rotate: false - xy: 1371, 245 + xy: 1027, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-wall-large-medium rotate: false - xy: 3257, 211 + xy: 1581, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-wall-large-small rotate: false - xy: 2536, 125 + xy: 1188, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-wall-large-tiny rotate: false - xy: 2173, 63 + xy: 1236, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-wall-large-xlarge rotate: false - xy: 381, 154 + xy: 509, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-wall-medium rotate: false - xy: 3291, 211 + xy: 1615, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-wall-small rotate: false - xy: 2588, 151 + xy: 1214, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-wall-tiny rotate: false - xy: 2191, 63 + xy: 1254, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-wall-xlarge rotate: false - xy: 331, 54 + xy: 459, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plated-conduit-large rotate: false - xy: 1413, 287 + xy: 985, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plated-conduit-medium rotate: false - xy: 3325, 201 + xy: 1649, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plated-conduit-small rotate: false - xy: 2562, 125 + xy: 1162, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plated-conduit-tiny rotate: false - xy: 2209, 63 + xy: 1272, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plated-conduit-xlarge rotate: false - xy: 381, 104 + xy: 509, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pneumatic-drill-large rotate: false - xy: 1455, 329 + xy: 1195, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pneumatic-drill-medium rotate: false - xy: 3359, 201 + xy: 1683, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pneumatic-drill-small rotate: false - xy: 2614, 151 + xy: 1188, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pneumatic-drill-tiny rotate: false - xy: 2227, 63 + xy: 1290, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pneumatic-drill-xlarge rotate: false - xy: 431, 154 + xy: 559, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-node-large rotate: false - xy: 1413, 245 + xy: 1153, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-node-large-large rotate: false - xy: 1455, 287 + xy: 1111, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-node-large-medium rotate: false - xy: 3393, 201 + xy: 1717, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-node-large-small rotate: false - xy: 2588, 125 + xy: 1214, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-node-large-tiny rotate: false - xy: 2245, 63 + xy: 1308, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-node-large-xlarge rotate: false - xy: 381, 54 + xy: 509, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-node-medium rotate: false - xy: 3427, 201 + xy: 1751, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-node-small rotate: false - xy: 2640, 151 + xy: 1240, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-node-tiny rotate: false - xy: 2263, 63 + xy: 1326, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-node-xlarge rotate: false - xy: 431, 104 + xy: 559, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-source-large rotate: false - xy: 1497, 329 + xy: 1069, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-source-medium rotate: false - xy: 3461, 201 + xy: 983, 542 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-source-small rotate: false - xy: 2614, 125 + xy: 1188, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-source-tiny rotate: false - xy: 2281, 63 + xy: 1344, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-source-xlarge rotate: false - xy: 481, 154 + xy: 609, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-void-large rotate: false - xy: 1455, 245 + xy: 1027, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-void-medium rotate: false - xy: 3495, 201 + xy: 983, 508 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-void-small rotate: false - xy: 2666, 151 + xy: 1214, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-void-tiny rotate: false - xy: 2299, 63 + xy: 1362, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-void-xlarge rotate: false - xy: 431, 54 + xy: 559, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pulse-conduit-large rotate: false - xy: 1497, 287 + xy: 1237, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pulse-conduit-medium rotate: false - xy: 3529, 201 + xy: 983, 474 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulse-conduit-small rotate: false - xy: 2640, 125 + xy: 1240, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pulse-conduit-tiny rotate: false - xy: 2317, 63 + xy: 1380, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pulse-conduit-xlarge rotate: false - xy: 481, 104 + xy: 609, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pulverizer-large rotate: false - xy: 1539, 329 + xy: 1195, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pulverizer-medium rotate: false - xy: 3563, 201 + xy: 983, 440 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulverizer-small rotate: false - xy: 2692, 151 + xy: 1266, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pulverizer-tiny rotate: false - xy: 2335, 63 + xy: 1398, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pulverizer-xlarge rotate: false - xy: 531, 154 + xy: 659, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pyratite-mixer-large rotate: false - xy: 1497, 245 + xy: 1153, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pyratite-mixer-medium rotate: false - xy: 3597, 201 + xy: 983, 406 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pyratite-mixer-small rotate: false - xy: 2666, 125 + xy: 1214, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pyratite-mixer-tiny rotate: false - xy: 2353, 63 + xy: 1416, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pyratite-mixer-xlarge rotate: false - xy: 481, 54 + xy: 609, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-repair-point-large rotate: false - xy: 1539, 287 + xy: 1111, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-repair-point-medium rotate: false - xy: 3631, 201 + xy: 1017, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-repair-point-small rotate: false - xy: 2718, 151 + xy: 1240, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-repair-point-tiny rotate: false - xy: 2371, 63 + xy: 1434, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-repair-point-xlarge rotate: false - xy: 531, 104 + xy: 659, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-resupply-point-large rotate: false - xy: 1581, 329 + xy: 1069, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-resupply-point-medium rotate: false - xy: 3665, 201 + xy: 1051, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-resupply-point-small rotate: false - xy: 2692, 125 + xy: 1266, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-resupply-point-tiny rotate: false - xy: 2389, 63 + xy: 1452, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-resupply-point-xlarge rotate: false - xy: 581, 154 + xy: 709, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ripple-large rotate: false - xy: 1539, 245 + xy: 1279, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ripple-medium rotate: false - xy: 3699, 201 + xy: 1017, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ripple-small rotate: false - xy: 2744, 151 + xy: 1292, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ripple-tiny rotate: false - xy: 2407, 63 + xy: 1470, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ripple-xlarge rotate: false - xy: 531, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rock-large - rotate: false - xy: 1581, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rock-medium - rotate: false - xy: 3733, 201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rock-small - rotate: false - xy: 2718, 125 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rock-tiny - rotate: false - xy: 2425, 63 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rock-xlarge - rotate: false - xy: 581, 104 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rocks-large - rotate: false - xy: 1623, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-rocks-medium - rotate: false - xy: 3767, 201 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-rocks-small - rotate: false - xy: 2744, 125 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-rocks-tiny - rotate: false - xy: 2443, 63 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-rocks-xlarge - rotate: false - xy: 631, 154 + xy: 659, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-rotary-pump-large rotate: false - xy: 1581, 245 + xy: 1237, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-rotary-pump-medium rotate: false - xy: 3801, 201 + xy: 1085, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rotary-pump-small rotate: false - xy: 1028, 99 + xy: 1240, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-rotary-pump-tiny rotate: false - xy: 2461, 63 + xy: 1488, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-rotary-pump-xlarge rotate: false - xy: 581, 54 + xy: 709, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-router-large rotate: false - xy: 1623, 287 + xy: 1195, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-router-medium rotate: false - xy: 3835, 201 + xy: 1051, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-router-small rotate: false - xy: 1054, 99 + xy: 1266, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-router-tiny rotate: false - xy: 2479, 63 + xy: 1506, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-router-xlarge rotate: false - xy: 631, 104 + xy: 709, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-rtg-generator-large rotate: false - xy: 1665, 329 + xy: 1153, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-rtg-generator-medium rotate: false - xy: 3869, 201 + xy: 1017, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rtg-generator-small rotate: false - xy: 1080, 99 + xy: 1292, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-rtg-generator-tiny rotate: false - xy: 2497, 63 + xy: 1524, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-rtg-generator-xlarge rotate: false - xy: 681, 154 + xy: 759, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-salt-large rotate: false - xy: 1623, 245 + xy: 1111, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-salt-medium rotate: false - xy: 3903, 201 + xy: 1119, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-salt-small rotate: false - xy: 1106, 99 + xy: 1318, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-salt-tiny rotate: false - xy: 2515, 63 + xy: 1542, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salt-xlarge +block-salt-wall-large rotate: false - xy: 631, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-saltrocks-large - rotate: false - xy: 1665, 287 + xy: 1321, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-saltrocks-medium +block-salt-wall-medium rotate: false - xy: 3937, 201 + xy: 1085, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-saltrocks-small +block-salt-wall-small rotate: false - xy: 1132, 99 + xy: 1266, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-saltrocks-tiny +block-salt-wall-tiny rotate: false - xy: 2533, 63 + xy: 1560, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-saltrocks-xlarge +block-salt-wall-xlarge rotate: false - xy: 681, 104 + xy: 759, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salt-xlarge + rotate: false + xy: 759, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-salvo-large rotate: false - xy: 1707, 329 + xy: 1279, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-salvo-medium rotate: false - xy: 3971, 201 + xy: 1051, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-salvo-small rotate: false - xy: 1158, 99 + xy: 1292, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-salvo-tiny rotate: false - xy: 2551, 63 + xy: 1578, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-salvo-xlarge rotate: false - xy: 731, 154 + xy: 809, 828 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sand-boulder-large rotate: false - xy: 1665, 245 + xy: 1237, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sand-boulder-medium rotate: false - xy: 4005, 201 + xy: 1017, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-boulder-small rotate: false - xy: 1184, 99 + xy: 1318, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sand-boulder-tiny rotate: false - xy: 2569, 63 + xy: 1596, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sand-boulder-xlarge rotate: false - xy: 681, 54 + xy: 809, 778 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sand-large rotate: false - xy: 1707, 287 + xy: 1195, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sand-medium rotate: false - xy: 4057, 337 + xy: 1153, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-small rotate: false - xy: 1210, 99 + xy: 1344, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sand-tiny rotate: false - xy: 2587, 63 + xy: 1614, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +block-sand-wall-large + rotate: false + xy: 1153, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-wall-medium + rotate: false + xy: 1119, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-wall-small + rotate: false + xy: 1292, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-wall-tiny + rotate: false + xy: 1632, 196 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-wall-xlarge + rotate: false + xy: 809, 728 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 block-sand-water-large rotate: false - xy: 1749, 329 + xy: 1363, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sand-water-medium rotate: false - xy: 4057, 303 + xy: 1085, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-water-small rotate: false - xy: 1236, 99 + xy: 1318, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sand-water-tiny rotate: false - xy: 2605, 63 + xy: 1650, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sand-water-xlarge rotate: false - xy: 731, 104 + xy: 809, 678 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sand-xlarge rotate: false - xy: 731, 54 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sandrocks-large - rotate: false - xy: 1707, 245 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sandrocks-medium - rotate: false - xy: 4047, 269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-small - rotate: false - xy: 1262, 99 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sandrocks-tiny - rotate: false - xy: 2623, 63 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sandrocks-xlarge - rotate: false - xy: 331, 4 + xy: 331, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scatter-large rotate: false - xy: 1749, 287 + xy: 1321, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scatter-medium rotate: false - xy: 4043, 235 + xy: 1051, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scatter-small rotate: false - xy: 1288, 99 + xy: 1344, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scatter-tiny rotate: false - xy: 2641, 63 + xy: 1668, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scatter-xlarge rotate: false - xy: 381, 4 + xy: 331, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scorch-large rotate: false - xy: 1791, 329 + xy: 1279, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scorch-medium rotate: false - xy: 4039, 201 + xy: 1017, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scorch-small rotate: false - xy: 1314, 99 + xy: 1370, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scorch-tiny rotate: false - xy: 2659, 63 + xy: 1686, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scorch-xlarge rotate: false - xy: 431, 4 + xy: 381, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-gigantic-large rotate: false - xy: 1749, 245 + xy: 1237, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-gigantic-medium rotate: false - xy: 985, 203 + xy: 1187, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-gigantic-small rotate: false - xy: 1340, 99 + xy: 1318, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-gigantic-tiny rotate: false - xy: 2677, 63 + xy: 1704, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-gigantic-xlarge rotate: false - xy: 481, 4 + xy: 381, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-huge-large rotate: false - xy: 1791, 287 + xy: 1195, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-huge-medium rotate: false - xy: 985, 169 + xy: 1153, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-huge-small rotate: false - xy: 1366, 99 + xy: 1344, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-huge-tiny rotate: false - xy: 2695, 63 + xy: 1796, 304 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-huge-xlarge rotate: false - xy: 531, 4 + xy: 431, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-large rotate: false - xy: 1833, 329 + xy: 1405, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-large-large rotate: false - xy: 1791, 245 + xy: 1363, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-large-medium rotate: false - xy: 1019, 211 + xy: 1119, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-large-small rotate: false - xy: 1392, 99 + xy: 1370, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-large-tiny rotate: false - xy: 2713, 63 + xy: 1796, 286 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-large-xlarge rotate: false - xy: 581, 4 + xy: 431, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-medium rotate: false - xy: 1019, 177 + xy: 1085, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-small rotate: false - xy: 1418, 99 + xy: 1396, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-tiny rotate: false - xy: 2731, 63 + xy: 1796, 268 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-xlarge rotate: false - xy: 631, 4 + xy: 481, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-segment-large rotate: false - xy: 1833, 287 + xy: 1321, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-segment-medium rotate: false - xy: 1053, 211 + xy: 1051, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-segment-small rotate: false - xy: 1444, 99 + xy: 1344, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-segment-tiny rotate: false - xy: 2749, 63 + xy: 1796, 250 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-segment-xlarge rotate: false - xy: 681, 4 + xy: 481, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-separator-large rotate: false - xy: 1875, 329 + xy: 1279, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-separator-medium rotate: false - xy: 1053, 177 + xy: 1221, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-separator-small rotate: false - xy: 1470, 99 + xy: 1370, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-separator-tiny rotate: false - xy: 2761, 81 + xy: 1788, 232 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-separator-xlarge rotate: false - xy: 731, 4 + xy: 531, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shale-boulder-large rotate: false - xy: 1833, 245 + xy: 1237, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shale-boulder-medium rotate: false - xy: 1087, 211 + xy: 1187, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-boulder-small rotate: false - xy: 1496, 99 + xy: 1396, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shale-boulder-tiny rotate: false - xy: 2767, 63 + xy: 1806, 232 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-shale-boulder-xlarge rotate: false - xy: 781, 116 + xy: 531, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shale-large rotate: false - xy: 1875, 287 + xy: 1447, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shale-medium rotate: false - xy: 1087, 177 + xy: 1153, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-small rotate: false - xy: 1522, 99 + xy: 1422, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shale-tiny rotate: false - xy: 1017, 10 + xy: 1788, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-xlarge +block-shale-wall-large rotate: false - xy: 781, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shalerocks-large - rotate: false - xy: 1917, 329 + xy: 1405, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shalerocks-medium +block-shale-wall-medium rotate: false - xy: 1121, 211 + xy: 1119, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shalerocks-small +block-shale-wall-small rotate: false - xy: 1548, 99 + xy: 1370, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shalerocks-tiny +block-shale-wall-tiny rotate: false - xy: 1759, 45 + xy: 1806, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shalerocks-xlarge +block-shale-wall-xlarge rotate: false - xy: 781, 16 + xy: 581, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-xlarge + rotate: false + xy: 581, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shock-mine-large rotate: false - xy: 1875, 245 + xy: 1363, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shock-mine-medium rotate: false - xy: 1121, 177 + xy: 1085, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shock-mine-small rotate: false - xy: 1574, 99 + xy: 1396, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shock-mine-tiny rotate: false - xy: 1777, 45 + xy: 1770, 208 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-shock-mine-xlarge rotate: false - xy: 831, 116 + xy: 631, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shrubs-large rotate: false - xy: 1917, 287 + xy: 1321, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shrubs-medium rotate: false - xy: 1155, 211 + xy: 1255, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shrubs-small rotate: false - xy: 1600, 99 + xy: 1422, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shrubs-tiny rotate: false - xy: 1795, 45 + xy: 1788, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-shrubs-xlarge rotate: false - xy: 831, 66 + xy: 631, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-silicon-crucible-large rotate: false - xy: 1959, 329 + xy: 1279, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-silicon-crucible-medium rotate: false - xy: 1155, 177 + xy: 1221, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-silicon-crucible-small rotate: false - xy: 1626, 99 + xy: 1448, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-silicon-crucible-tiny rotate: false - xy: 1813, 45 + xy: 1806, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-silicon-crucible-xlarge rotate: false - xy: 831, 16 + xy: 681, 666 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-silicon-smelter-large rotate: false - xy: 1917, 245 + xy: 1489, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-silicon-smelter-medium rotate: false - xy: 1189, 211 + xy: 1187, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-silicon-smelter-small rotate: false - xy: 1652, 99 + xy: 1396, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-silicon-smelter-tiny rotate: false - xy: 1831, 45 + xy: 1148, 119 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-silicon-smelter-xlarge rotate: false - xy: 859, 413 + xy: 681, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-slag-large rotate: false - xy: 1959, 287 + xy: 1447, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-slag-medium rotate: false - xy: 1189, 177 + xy: 1153, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-slag-small rotate: false - xy: 1678, 99 + xy: 1422, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-slag-tiny rotate: false - xy: 1849, 45 + xy: 1148, 101 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-slag-xlarge rotate: false - xy: 909, 413 + xy: 731, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-boulder-large + rotate: false + xy: 1405, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-boulder-medium + rotate: false + xy: 1119, 414 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-boulder-small + rotate: false + xy: 1448, 284 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-boulder-tiny + rotate: false + xy: 1166, 113 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-boulder-xlarge + rotate: false + xy: 731, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snow-large rotate: false - xy: 2001, 329 + xy: 1363, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-snow-medium rotate: false - xy: 1223, 211 + xy: 1289, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snow-pine-large rotate: false - xy: 1959, 245 + xy: 1321, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-snow-pine-medium rotate: false - xy: 1223, 177 + xy: 1255, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snow-pine-small rotate: false - xy: 1704, 99 + xy: 1474, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-snow-pine-tiny rotate: false - xy: 1867, 45 + xy: 1184, 113 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-snow-pine-xlarge rotate: false - xy: 959, 413 + xy: 781, 628 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snow-small rotate: false - xy: 1730, 99 + xy: 1422, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-snow-tiny rotate: false - xy: 1885, 45 + xy: 1166, 95 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +block-snow-wall-large + rotate: false + xy: 1531, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-wall-medium + rotate: false + xy: 1221, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-wall-small + rotate: false + xy: 1448, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-wall-tiny + rotate: false + xy: 1184, 95 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-wall-xlarge + rotate: false + xy: 831, 628 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 block-snow-xlarge rotate: false - xy: 1009, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrock-large - rotate: false - xy: 2001, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrock-medium - rotate: false - xy: 1257, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-small - rotate: false - xy: 1756, 99 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrock-tiny - rotate: false - xy: 1903, 45 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrock-xlarge - rotate: false - xy: 1059, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrocks-large - rotate: false - xy: 2043, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrocks-medium - rotate: false - xy: 1257, 177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrocks-small - rotate: false - xy: 1782, 99 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrocks-tiny - rotate: false - xy: 1921, 45 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrocks-xlarge - rotate: false - xy: 1109, 413 + xy: 781, 578 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-solar-panel-large rotate: false - xy: 2001, 245 + xy: 1489, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-solar-panel-large-large rotate: false - xy: 2043, 287 + xy: 1447, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-solar-panel-large-medium rotate: false - xy: 1291, 211 + xy: 1187, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-large-small rotate: false - xy: 1808, 99 + xy: 1474, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-solar-panel-large-tiny rotate: false - xy: 1939, 45 + xy: 1202, 113 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-solar-panel-large-xlarge rotate: false - xy: 1159, 413 + xy: 831, 578 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-solar-panel-medium rotate: false - xy: 1291, 177 + xy: 1153, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-small rotate: false - xy: 1834, 99 + xy: 1500, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-solar-panel-tiny rotate: false - xy: 1957, 45 + xy: 1202, 95 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-solar-panel-xlarge rotate: false - xy: 1209, 413 + xy: 351, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sorter-large rotate: false - xy: 2085, 329 + xy: 1405, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sorter-medium rotate: false - xy: 1325, 211 + xy: 1323, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sorter-small rotate: false - xy: 1860, 99 + xy: 1448, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sorter-tiny rotate: false - xy: 1975, 45 + xy: 1722, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sorter-xlarge rotate: false - xy: 1259, 413 + xy: 351, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spawn-large rotate: false - xy: 2043, 245 + xy: 1363, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spawn-medium rotate: false - xy: 1325, 177 + xy: 1289, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spawn-small rotate: false - xy: 1886, 99 + xy: 1474, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spawn-tiny rotate: false - xy: 1993, 45 + xy: 1740, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spawn-xlarge rotate: false - xy: 1309, 413 + xy: 401, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spectre-large rotate: false - xy: 2085, 287 + xy: 1573, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spectre-medium rotate: false - xy: 1359, 211 + xy: 1255, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spectre-small rotate: false - xy: 1912, 99 + xy: 1500, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spectre-tiny rotate: false - xy: 2011, 45 + xy: 1740, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spectre-xlarge rotate: false - xy: 1359, 413 + xy: 351, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-cluster-large rotate: false - xy: 2127, 329 + xy: 1531, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-cluster-medium rotate: false - xy: 1359, 177 + xy: 1221, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-cluster-small rotate: false - xy: 1938, 99 + xy: 1526, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-cluster-tiny rotate: false - xy: 2029, 45 + xy: 1758, 190 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-cluster-xlarge rotate: false - xy: 1409, 413 + xy: 401, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-moss-large rotate: false - xy: 2085, 245 + xy: 1489, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-moss-medium rotate: false - xy: 1393, 211 + xy: 1187, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-moss-small rotate: false - xy: 1964, 99 + xy: 1474, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-moss-tiny rotate: false - xy: 2047, 45 + xy: 1130, 83 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-moss-xlarge rotate: false - xy: 1459, 413 + xy: 451, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-pine-large rotate: false - xy: 2127, 287 + xy: 1447, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-pine-medium rotate: false - xy: 1393, 177 + xy: 1357, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-pine-small rotate: false - xy: 1990, 99 + xy: 1500, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-pine-tiny rotate: false - xy: 2065, 45 + xy: 1148, 83 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-pine-xlarge rotate: false - xy: 1509, 413 + xy: 351, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-press-large rotate: false - xy: 2169, 329 + xy: 1405, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-press-medium rotate: false - xy: 1427, 211 + xy: 1323, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-press-small rotate: false - xy: 2016, 99 + xy: 1526, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-press-tiny rotate: false - xy: 2083, 45 + xy: 1166, 77 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-press-xlarge rotate: false - xy: 1559, 413 + xy: 401, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sporerocks-large +block-spore-wall-large rotate: false - xy: 2127, 245 + xy: 1615, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sporerocks-medium +block-spore-wall-medium rotate: false - xy: 1427, 177 + xy: 1289, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sporerocks-small +block-spore-wall-small rotate: false - xy: 2042, 99 + xy: 1552, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sporerocks-tiny +block-spore-wall-tiny rotate: false - xy: 2101, 45 + xy: 1184, 77 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sporerocks-xlarge +block-spore-wall-xlarge rotate: false - xy: 1609, 413 + xy: 451, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-steam-generator-large + rotate: false + xy: 1573, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-steam-generator-medium + rotate: false + xy: 1255, 448 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-steam-generator-small + rotate: false + xy: 1500, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-steam-generator-tiny + rotate: false + xy: 1202, 77 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-steam-generator-xlarge + rotate: false + xy: 501, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-stone-large rotate: false - xy: 2169, 287 + xy: 1531, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-stone-medium rotate: false - xy: 1461, 211 + xy: 1221, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-stone-small rotate: false - xy: 2068, 99 + xy: 1526, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-stone-tiny rotate: false - xy: 2119, 45 + xy: 580, 152 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +block-stone-wall-large + rotate: false + xy: 1489, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-wall-medium + rotate: false + xy: 1391, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-small + rotate: false + xy: 1552, 284 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-wall-tiny + rotate: false + xy: 598, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-wall-xlarge + rotate: false + xy: 351, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 block-stone-xlarge rotate: false - xy: 1659, 413 + xy: 401, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-surge-tower-large rotate: false - xy: 2211, 329 + xy: 1447, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-surge-tower-medium rotate: false - xy: 1461, 177 + xy: 1357, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-tower-small rotate: false - xy: 2094, 99 + xy: 1578, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-surge-tower-tiny rotate: false - xy: 2137, 45 + xy: 616, 152 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-surge-tower-xlarge rotate: false - xy: 1709, 413 + xy: 451, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-surge-wall-large rotate: false - xy: 2169, 245 + xy: 1657, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-surge-wall-large-large rotate: false - xy: 2211, 287 + xy: 1615, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-surge-wall-large-medium rotate: false - xy: 1495, 211 + xy: 1323, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-wall-large-small rotate: false - xy: 2120, 99 + xy: 1526, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-surge-wall-large-tiny rotate: false - xy: 2155, 45 + xy: 595, 19 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-surge-wall-large-xlarge rotate: false - xy: 1759, 413 + xy: 501, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-surge-wall-medium rotate: false - xy: 1495, 177 + xy: 1289, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-wall-small rotate: false - xy: 2146, 99 + xy: 1552, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-surge-wall-tiny rotate: false - xy: 2173, 45 + xy: 595, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-surge-wall-xlarge rotate: false - xy: 1809, 413 + xy: 551, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-swarmer-large rotate: false - xy: 2253, 329 + xy: 1573, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-swarmer-medium rotate: false - xy: 1529, 211 + xy: 1255, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-swarmer-small rotate: false - xy: 2172, 99 + xy: 1578, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-swarmer-tiny rotate: false - xy: 2191, 45 + xy: 1218, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-swarmer-xlarge rotate: false - xy: 1859, 413 + xy: 351, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-switch-large rotate: false - xy: 2211, 245 + xy: 1531, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-switch-medium rotate: false - xy: 1529, 177 + xy: 1425, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-switch-small rotate: false - xy: 2198, 99 + xy: 1604, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-switch-tiny rotate: false - xy: 2209, 45 + xy: 1236, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-switch-xlarge rotate: false - xy: 1909, 413 + xy: 401, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-tainted-water-large rotate: false - xy: 2253, 287 + xy: 1489, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-tainted-water-medium rotate: false - xy: 1563, 211 + xy: 1391, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tainted-water-small rotate: false - xy: 2224, 99 + xy: 1552, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-tainted-water-tiny rotate: false - xy: 2227, 45 + xy: 1254, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-tainted-water-xlarge rotate: false - xy: 1959, 413 + xy: 451, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-tar-large rotate: false - xy: 2295, 329 + xy: 1699, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-tar-medium rotate: false - xy: 1563, 177 + xy: 1357, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tar-small rotate: false - xy: 2250, 99 + xy: 1578, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-tar-tiny rotate: false - xy: 2245, 45 + xy: 1272, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-tar-xlarge rotate: false - xy: 2009, 413 + xy: 501, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-tendrils-large rotate: false - xy: 2253, 245 + xy: 1657, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-tendrils-medium rotate: false - xy: 1597, 211 + xy: 1323, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tendrils-small rotate: false - xy: 2276, 99 + xy: 1604, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-tendrils-tiny rotate: false - xy: 2263, 45 + xy: 1290, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-tendrils-xlarge rotate: false - xy: 2059, 413 + xy: 551, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-tetrative-reconstructor-large rotate: false - xy: 2295, 287 + xy: 1615, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-tetrative-reconstructor-medium rotate: false - xy: 1597, 177 + xy: 1289, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tetrative-reconstructor-small rotate: false - xy: 2302, 99 + xy: 1630, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-tetrative-reconstructor-tiny rotate: false - xy: 2281, 45 + xy: 1308, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-tetrative-reconstructor-xlarge rotate: false - xy: 2109, 413 + xy: 601, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thermal-generator-large rotate: false - xy: 2337, 329 + xy: 1573, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thermal-generator-medium rotate: false - xy: 1631, 211 + xy: 1459, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thermal-generator-small rotate: false - xy: 2328, 99 + xy: 1578, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thermal-generator-tiny rotate: false - xy: 2299, 45 + xy: 1326, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thermal-generator-xlarge rotate: false - xy: 2159, 413 + xy: 351, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thermal-pump-large rotate: false - xy: 2295, 245 + xy: 1531, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thermal-pump-medium rotate: false - xy: 1631, 177 + xy: 1425, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thermal-pump-small rotate: false - xy: 2354, 99 + xy: 1604, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thermal-pump-tiny rotate: false - xy: 2317, 45 + xy: 1344, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thermal-pump-xlarge rotate: false - xy: 2209, 413 + xy: 401, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thorium-reactor-large rotate: false - xy: 2337, 287 + xy: 1741, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thorium-reactor-medium rotate: false - xy: 1665, 211 + xy: 1391, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thorium-reactor-small rotate: false - xy: 2380, 99 + xy: 1630, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thorium-reactor-tiny rotate: false - xy: 2335, 45 + xy: 1362, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thorium-reactor-xlarge rotate: false - xy: 2259, 413 + xy: 451, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thorium-wall-large rotate: false - xy: 2379, 329 + xy: 1699, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thorium-wall-large-large rotate: false - xy: 2337, 245 + xy: 1657, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thorium-wall-large-medium rotate: false - xy: 1665, 177 + xy: 1357, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thorium-wall-large-small rotate: false - xy: 2406, 99 + xy: 1656, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thorium-wall-large-tiny rotate: false - xy: 2353, 45 + xy: 1380, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thorium-wall-large-xlarge rotate: false - xy: 2309, 413 + xy: 501, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thorium-wall-medium rotate: false - xy: 1699, 211 + xy: 1323, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thorium-wall-small rotate: false - xy: 2432, 99 + xy: 1604, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thorium-wall-tiny rotate: false - xy: 2371, 45 + xy: 1398, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thorium-wall-xlarge rotate: false - xy: 2359, 413 + xy: 551, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thruster-large rotate: false - xy: 2379, 287 + xy: 1615, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thruster-medium rotate: false - xy: 1699, 177 + xy: 1493, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thruster-small rotate: false - xy: 2458, 99 + xy: 1630, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thruster-tiny rotate: false - xy: 2389, 45 + xy: 1416, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thruster-xlarge rotate: false - xy: 2409, 413 + xy: 601, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-titanium-conveyor-large rotate: false - xy: 2421, 329 + xy: 1573, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-titanium-conveyor-medium rotate: false - xy: 1733, 211 + xy: 1459, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-conveyor-small rotate: false - xy: 2484, 99 + xy: 1656, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-titanium-conveyor-tiny rotate: false - xy: 2407, 45 + xy: 1434, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-titanium-conveyor-xlarge rotate: false - xy: 2459, 413 + xy: 651, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-titanium-wall-large rotate: false - xy: 2379, 245 + xy: 1783, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-titanium-wall-large-large rotate: false - xy: 2421, 287 + xy: 1741, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-titanium-wall-large-medium rotate: false - xy: 1733, 177 + xy: 1425, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-large-small rotate: false - xy: 2510, 99 + xy: 1682, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-titanium-wall-large-tiny rotate: false - xy: 2425, 45 + xy: 1452, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-titanium-wall-large-xlarge rotate: false - xy: 2509, 413 + xy: 351, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-titanium-wall-medium rotate: false - xy: 1767, 211 + xy: 1391, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-small rotate: false - xy: 2536, 99 + xy: 1630, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-titanium-wall-tiny rotate: false - xy: 2443, 45 + xy: 1470, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-titanium-wall-xlarge rotate: false - xy: 2559, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-turbine-generator-large - rotate: false - xy: 2463, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-turbine-generator-medium - rotate: false - xy: 1767, 177 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-turbine-generator-small - rotate: false - xy: 2562, 99 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-turbine-generator-tiny - rotate: false - xy: 2461, 45 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-turbine-generator-xlarge - rotate: false - xy: 2609, 413 + xy: 401, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-underflow-gate-large rotate: false - xy: 2421, 245 + xy: 1699, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-underflow-gate-medium rotate: false - xy: 1801, 211 + xy: 1357, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-underflow-gate-small rotate: false - xy: 2588, 99 + xy: 1656, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-underflow-gate-tiny rotate: false - xy: 2479, 45 + xy: 1488, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-underflow-gate-xlarge rotate: false - xy: 2659, 413 + xy: 451, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-unloader-large rotate: false - xy: 2463, 287 + xy: 1657, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-unloader-medium rotate: false - xy: 1801, 177 + xy: 1527, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-unloader-small rotate: false - xy: 2614, 99 + xy: 1682, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-unloader-tiny rotate: false - xy: 2497, 45 + xy: 1506, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-unloader-xlarge rotate: false - xy: 2709, 413 + xy: 501, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-vault-large rotate: false - xy: 2505, 329 + xy: 1615, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-vault-medium rotate: false - xy: 1835, 211 + xy: 1493, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-vault-small rotate: false - xy: 2640, 99 + xy: 1708, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-vault-tiny rotate: false - xy: 2515, 45 + xy: 1524, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-vault-xlarge rotate: false - xy: 2759, 413 + xy: 551, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-water-extractor-large rotate: false - xy: 2463, 245 + xy: 1825, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-water-extractor-medium rotate: false - xy: 1835, 177 + xy: 1459, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-water-extractor-small rotate: false - xy: 2666, 99 + xy: 1656, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-water-extractor-tiny rotate: false - xy: 2533, 45 + xy: 1542, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-water-extractor-xlarge rotate: false - xy: 2809, 413 + xy: 601, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-water-large rotate: false - xy: 2505, 287 + xy: 1783, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-water-medium rotate: false - xy: 1869, 211 + xy: 1425, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-water-small rotate: false - xy: 2692, 99 + xy: 1682, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-water-tiny rotate: false - xy: 2551, 45 + xy: 1560, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-water-xlarge rotate: false - xy: 2859, 413 + xy: 651, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-wave-large rotate: false - xy: 2547, 329 + xy: 1741, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-wave-medium rotate: false - xy: 1869, 177 + xy: 1391, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-wave-small rotate: false - xy: 2718, 99 + xy: 1708, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-wave-tiny rotate: false - xy: 2569, 45 + xy: 1578, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-wave-xlarge rotate: false - xy: 2909, 413 + xy: 701, 566 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-white-tree-dead-large rotate: false - xy: 2505, 245 + xy: 1699, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-white-tree-dead-medium rotate: false - xy: 1903, 211 + xy: 1561, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-white-tree-dead-small rotate: false - xy: 2744, 99 + xy: 1734, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-white-tree-dead-tiny rotate: false - xy: 2587, 45 + xy: 1596, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-white-tree-dead-xlarge rotate: false - xy: 2959, 413 + xy: 351, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-white-tree-large rotate: false - xy: 2547, 287 + xy: 1657, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-white-tree-medium rotate: false - xy: 1903, 177 + xy: 1527, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-white-tree-small rotate: false - xy: 1025, 73 + xy: 1682, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-white-tree-tiny rotate: false - xy: 2605, 45 + xy: 1614, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-white-tree-xlarge rotate: false - xy: 3009, 413 + xy: 401, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 button rotate: false - xy: 3153, 342 + xy: 1577, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17596,7 +18100,7 @@ button index: -1 button-disabled rotate: false - xy: 4057, 484 + xy: 965, 610 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17604,7 +18108,7 @@ button-disabled index: -1 button-down rotate: false - xy: 4059, 455 + xy: 1007, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17612,7 +18116,7 @@ button-down index: -1 button-edge-1 rotate: false - xy: 4059, 426 + xy: 1045, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17620,7 +18124,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 2925, 342 + xy: 1083, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17628,7 +18132,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 2883, 258 + xy: 1121, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17636,7 +18140,15 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 2925, 313 + xy: 1159, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-disabled + rotate: false + xy: 1159, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17644,7 +18156,7 @@ button-edge-4 index: -1 button-edge-over-4 rotate: false - xy: 2963, 342 + xy: 1197, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17652,7 +18164,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 2963, 313 + xy: 1235, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17660,7 +18172,7 @@ button-over index: -1 button-red rotate: false - xy: 3001, 342 + xy: 1273, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17668,7 +18180,7 @@ button-red index: -1 button-right rotate: false - xy: 3039, 313 + xy: 1387, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17676,7 +18188,7 @@ button-right index: -1 button-right-down rotate: false - xy: 3001, 313 + xy: 1311, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17684,7 +18196,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 3039, 342 + xy: 1349, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17692,7 +18204,7 @@ button-right-over index: -1 button-select rotate: false - xy: 1025, 47 + xy: 1708, 258 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -17700,7 +18212,7 @@ button-select index: -1 button-square rotate: false - xy: 3115, 342 + xy: 1501, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17708,7 +18220,7 @@ button-square index: -1 button-square-down rotate: false - xy: 3077, 342 + xy: 1425, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17716,7 +18228,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 3077, 313 + xy: 1463, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17724,7 +18236,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 3115, 313 + xy: 1539, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17732,77 +18244,77 @@ button-trans index: -1 check-disabled rotate: false - xy: 1937, 211 + xy: 1493, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 1937, 177 + xy: 1459, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 1971, 211 + xy: 1425, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 1971, 177 + xy: 1595, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 2005, 211 + xy: 1561, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 2005, 177 + xy: 1527, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 771, 404 + xy: 795, 866 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 crater rotate: false - xy: 881, 159 + xy: 131, 538 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 cursor rotate: false - xy: 881, 153 + xy: 1765, 414 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 discord-banner rotate: false - xy: 771, 466 + xy: 771, 978 size: 84, 45 orig: 84, 45 offset: 0, 0 index: -1 flat-down-base rotate: false - xy: 3153, 313 + xy: 1615, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17810,14 +18322,14 @@ flat-down-base index: -1 info-banner rotate: false - xy: 259, 357 + xy: 259, 869 size: 84, 45 orig: 84, 45 offset: 0, 0 index: -1 inventory rotate: false - xy: 1051, 57 + xy: 1734, 268 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -17825,168 +18337,168 @@ inventory index: -1 item-blast-compound-icon rotate: false - xy: 2039, 211 + xy: 1493, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-icon rotate: false - xy: 2039, 177 + xy: 1459, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-icon rotate: false - xy: 2073, 211 + xy: 1629, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-icon rotate: false - xy: 2073, 177 + xy: 1595, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-icon rotate: false - xy: 2107, 211 + xy: 1561, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-icon rotate: false - xy: 2107, 177 + xy: 1527, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-icon rotate: false - xy: 2141, 211 + xy: 1493, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-icon rotate: false - xy: 2141, 177 + xy: 1663, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-icon rotate: false - xy: 2175, 211 + xy: 1629, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-icon rotate: false - xy: 2175, 177 + xy: 1595, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-icon rotate: false - xy: 2209, 211 + xy: 1561, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-icon rotate: false - xy: 2209, 177 + xy: 1527, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-icon rotate: false - xy: 2243, 211 + xy: 1697, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-icon rotate: false - xy: 2243, 177 + xy: 1663, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-icon rotate: false - xy: 2277, 211 + xy: 1629, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-icon rotate: false - xy: 2277, 177 + xy: 1595, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-icon rotate: false - xy: 2311, 211 + xy: 1561, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-icon rotate: false - xy: 2311, 177 + xy: 1731, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-icon rotate: false - xy: 2345, 211 + xy: 1697, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-icon rotate: false - xy: 2345, 177 + xy: 1663, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-node rotate: false - xy: 2379, 211 + xy: 1629, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logo rotate: false - xy: 1, 404 + xy: 1, 916 size: 768, 107 orig: 768, 107 offset: 0, 0 index: -1 nomap rotate: false - xy: 1, 146 + xy: 1, 658 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 pane rotate: false - xy: 3191, 313 + xy: 1691, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17994,7 +18506,7 @@ pane index: -1 pane-2 rotate: false - xy: 3191, 342 + xy: 1653, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18002,7 +18514,7 @@ pane-2 index: -1 scroll rotate: false - xy: 1103, 62 + xy: 1022, 153 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -18010,7 +18522,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 923, 1 + xy: 43, 2 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -18018,70 +18530,70 @@ scroll-horizontal index: -1 scroll-knob-horizontal-black rotate: false - xy: 881, 1 + xy: 1, 2 size: 40, 24 orig: 40, 24 offset: 0, 0 index: -1 scroll-knob-vertical-black rotate: false - xy: 1077, 57 + xy: 1022, 190 size: 24, 40 orig: 24, 40 offset: 0, 0 index: -1 scroll-knob-vertical-thin rotate: false - xy: 845, 390 + xy: 634, 128 size: 12, 40 orig: 12, 40 offset: 0, 0 index: -1 selection rotate: false - xy: 2818, 208 + xy: 493, 113 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 3333, 303 + xy: 535, 91 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 2787, 171 + xy: 1799, 461 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 2821, 205 + xy: 1799, 421 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 2852, 205 + xy: 979, 354 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-vertical rotate: false - xy: 309, 354 + xy: 309, 866 size: 8, 1 orig: 8, 1 offset: 0, 0 index: -1 underline rotate: false - xy: 3305, 342 + xy: 877, 518 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18089,7 +18601,7 @@ underline index: -1 underline-2 rotate: false - xy: 3229, 342 + xy: 1729, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18097,7 +18609,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 3229, 313 + xy: 1867, 694 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18105,7 +18617,7 @@ underline-disabled index: -1 underline-red rotate: false - xy: 3267, 342 + xy: 881, 576 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18113,7 +18625,7 @@ underline-red index: -1 underline-white rotate: false - xy: 3267, 313 + xy: 877, 547 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18121,847 +18633,960 @@ underline-white index: -1 unit-alpha-large rotate: false - xy: 2589, 329 + xy: 1867, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-alpha-medium rotate: false - xy: 2379, 177 + xy: 1595, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-alpha-small rotate: false - xy: 1129, 73 + xy: 1708, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-alpha-tiny rotate: false - xy: 2623, 45 + xy: 1632, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-alpha-xlarge rotate: false - xy: 3059, 413 + xy: 451, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-antumbra-large rotate: false - xy: 2547, 245 - size: 40, 40 - orig: 40, 40 + xy: 877, 476 + size: 36, 40 + orig: 36, 40 offset: 0, 0 index: -1 unit-antumbra-medium rotate: false - xy: 2413, 211 - size: 32, 32 - orig: 32, 32 + xy: 751, 582 + size: 28, 32 + orig: 28, 32 offset: 0, 0 index: -1 unit-antumbra-small rotate: false - xy: 1155, 73 - size: 24, 24 - orig: 24, 24 + xy: 1152, 164 + size: 21, 24 + orig: 21, 24 offset: 0, 0 index: -1 unit-antumbra-tiny rotate: false - xy: 2641, 45 - size: 16, 16 - orig: 16, 16 + xy: 435, 48 + size: 14, 16 + orig: 14, 16 offset: 0, 0 index: -1 unit-antumbra-xlarge rotate: false - xy: 3109, 413 - size: 48, 48 - orig: 48, 48 + xy: 451, 116 + size: 43, 48 + orig: 43, 48 offset: 0, 0 index: -1 unit-arkyid-large rotate: false - xy: 2589, 287 + xy: 1825, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-arkyid-medium rotate: false - xy: 2413, 177 + xy: 1731, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-arkyid-small rotate: false - xy: 1181, 73 + xy: 1734, 242 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-arkyid-tiny rotate: false - xy: 2659, 45 + xy: 1650, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-arkyid-xlarge rotate: false - xy: 3159, 413 + xy: 501, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-atrax-large rotate: false - xy: 2631, 329 - size: 40, 40 - orig: 40, 40 + xy: 435, 1 + size: 40, 29 + orig: 40, 29 offset: 0, 0 index: -1 unit-atrax-medium rotate: false - xy: 2447, 211 - size: 32, 32 - orig: 32, 32 + xy: 80, 3 + size: 32, 23 + orig: 32, 23 offset: 0, 0 index: -1 unit-atrax-small rotate: false - xy: 1207, 73 - size: 24, 24 - orig: 24, 24 + xy: 2022, 836 + size: 24, 17 + orig: 24, 17 offset: 0, 0 index: -1 unit-atrax-tiny rotate: false - xy: 2677, 45 - size: 16, 16 - orig: 16, 16 + xy: 1668, 183 + size: 16, 11 + orig: 16, 11 offset: 0, 0 index: -1 unit-atrax-xlarge rotate: false - xy: 3209, 413 - size: 48, 48 - orig: 48, 48 + xy: 551, 380 + size: 48, 34 + orig: 48, 34 offset: 0, 0 index: -1 unit-beta-large rotate: false - xy: 2589, 245 + xy: 1783, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-beta-medium rotate: false - xy: 2447, 177 + xy: 1697, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-beta-small rotate: false - xy: 1233, 73 + xy: 1048, 206 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-beta-tiny rotate: false - xy: 2695, 45 + xy: 1686, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-beta-xlarge rotate: false - xy: 3259, 413 + xy: 601, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-bryde-large rotate: false - xy: 2631, 287 + xy: 1741, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-bryde-medium rotate: false - xy: 2481, 211 + xy: 1663, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-bryde-small rotate: false - xy: 1259, 73 + xy: 1022, 127 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-bryde-tiny rotate: false - xy: 2713, 45 + xy: 1704, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-bryde-xlarge rotate: false - xy: 3309, 413 + xy: 651, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-crawler-large rotate: false - xy: 2673, 329 + xy: 1699, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-crawler-medium rotate: false - xy: 2481, 177 + xy: 1629, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-crawler-small rotate: false - xy: 1285, 73 + xy: 1048, 180 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-crawler-tiny rotate: false - xy: 2731, 45 + xy: 1722, 178 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-crawler-xlarge rotate: false - xy: 3359, 413 + xy: 701, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-large rotate: false - xy: 2631, 245 + xy: 1909, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-dagger-medium rotate: false - xy: 2515, 211 + xy: 1731, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-dagger-small rotate: false - xy: 1311, 73 + xy: 1074, 206 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-dagger-tiny rotate: false - xy: 2749, 45 + xy: 1211, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-dagger-xlarge rotate: false - xy: 3409, 413 + xy: 351, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-eclipse-large rotate: false - xy: 2673, 287 + xy: 1867, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-eclipse-medium rotate: false - xy: 2515, 177 + xy: 1697, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-eclipse-small rotate: false - xy: 1337, 73 + xy: 1048, 154 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-eclipse-tiny rotate: false - xy: 2767, 45 + xy: 1211, 142 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-eclipse-xlarge rotate: false - xy: 3459, 413 + xy: 401, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-flare-large rotate: false - xy: 2715, 329 + xy: 1825, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-flare-medium rotate: false - xy: 2549, 211 + xy: 1663, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-flare-small rotate: false - xy: 1363, 73 + xy: 1074, 180 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-flare-tiny rotate: false - xy: 2902, 180 + xy: 1229, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-flare-xlarge rotate: false - xy: 3509, 413 + xy: 451, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-fortress-large rotate: false - xy: 2673, 245 - size: 40, 40 - orig: 40, 40 + xy: 1783, 731 + size: 40, 32 + orig: 40, 32 offset: 0, 0 index: -1 unit-fortress-medium rotate: false - xy: 2549, 177 - size: 32, 32 - orig: 32, 32 + xy: 114, 1 + size: 32, 25 + orig: 32, 25 offset: 0, 0 index: -1 unit-fortress-small rotate: false - xy: 1389, 73 - size: 24, 24 - orig: 24, 24 + xy: 1100, 211 + size: 24, 19 + orig: 24, 19 offset: 0, 0 index: -1 unit-fortress-tiny rotate: false - xy: 2902, 162 - size: 16, 16 - orig: 16, 16 + xy: 1229, 146 + size: 16, 12 + orig: 16, 12 offset: 0, 0 index: -1 unit-fortress-xlarge rotate: false - xy: 3559, 413 - size: 48, 48 - orig: 48, 48 + xy: 501, 276 + size: 48, 38 + orig: 48, 38 offset: 0, 0 index: -1 unit-gamma-large rotate: false - xy: 2715, 287 + xy: 1741, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-gamma-medium rotate: false - xy: 2583, 211 + xy: 1731, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-gamma-small rotate: false - xy: 1415, 73 + xy: 1048, 128 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-gamma-tiny rotate: false - xy: 1035, 11 + xy: 1247, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-gamma-xlarge rotate: false - xy: 3609, 413 + xy: 551, 330 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-horizon-large rotate: false - xy: 2757, 329 + xy: 1909, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-horizon-medium rotate: false - xy: 2583, 177 + xy: 1697, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-horizon-small rotate: false - xy: 1441, 73 + xy: 1074, 154 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-horizon-tiny rotate: false - xy: 1053, 21 + xy: 1265, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-horizon-xlarge rotate: false - xy: 3659, 413 + xy: 601, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mace-large rotate: false - xy: 2715, 245 + xy: 1867, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mace-medium rotate: false - xy: 2617, 211 + xy: 1731, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mace-small rotate: false - xy: 1467, 73 + xy: 1100, 185 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mace-tiny rotate: false - xy: 1071, 21 + xy: 1283, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mace-xlarge rotate: false - xy: 3709, 413 + xy: 651, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mega-large rotate: false - xy: 2757, 287 + xy: 1783, 689 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mega-medium rotate: false - xy: 2617, 177 + xy: 1765, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mega-small rotate: false - xy: 1493, 73 + xy: 1126, 206 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mega-tiny rotate: false - xy: 1089, 21 + xy: 1301, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mega-xlarge rotate: false - xy: 3759, 413 + xy: 701, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-minke-large rotate: false - xy: 2799, 329 - size: 40, 40 - orig: 40, 40 + xy: 1951, 807 + size: 34, 40 + orig: 34, 40 offset: 0, 0 index: -1 unit-minke-medium rotate: false - xy: 2651, 211 - size: 32, 32 - orig: 32, 32 + xy: 2020, 763 + size: 27, 32 + orig: 27, 32 offset: 0, 0 index: -1 unit-minke-small rotate: false - xy: 1519, 73 - size: 24, 24 - orig: 24, 24 + xy: 309, 690 + size: 20, 24 + orig: 20, 24 offset: 0, 0 index: -1 unit-minke-tiny rotate: false - xy: 1107, 26 - size: 16, 16 - orig: 16, 16 + xy: 477, 14 + size: 13, 16 + orig: 13, 16 offset: 0, 0 index: -1 unit-minke-xlarge rotate: false - xy: 3809, 413 - size: 48, 48 - orig: 48, 48 + xy: 601, 283 + size: 41, 48 + orig: 41, 48 offset: 0, 0 index: -1 unit-mono-large rotate: false - xy: 2757, 245 + xy: 1825, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mono-medium rotate: false - xy: 2651, 177 + xy: 1765, 516 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mono-small rotate: false - xy: 1545, 73 + xy: 1074, 128 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mono-tiny rotate: false - xy: 1053, 3 + xy: 1319, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mono-xlarge rotate: false - xy: 3859, 413 + xy: 351, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-nova-large rotate: false - xy: 2799, 287 + xy: 1909, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-nova-medium rotate: false - xy: 2685, 211 + xy: 1765, 482 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-nova-small rotate: false - xy: 1571, 73 + xy: 1100, 159 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-nova-tiny rotate: false - xy: 1071, 3 + xy: 1337, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-nova-xlarge rotate: false - xy: 3909, 413 + xy: 401, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-poly-large rotate: false - xy: 2841, 329 + xy: 1867, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-poly-medium rotate: false - xy: 2685, 177 + xy: 1765, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-poly-small rotate: false - xy: 1597, 73 + xy: 1126, 180 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-poly-tiny rotate: false - xy: 1089, 3 + xy: 1355, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-poly-xlarge rotate: false - xy: 3959, 413 + xy: 451, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-pulsar-large rotate: false - xy: 2799, 245 - size: 40, 40 - orig: 40, 40 + xy: 1909, 730 + size: 40, 33 + orig: 40, 33 offset: 0, 0 index: -1 unit-pulsar-medium rotate: false - xy: 2719, 211 - size: 32, 32 - orig: 32, 32 + xy: 1765, 420 + size: 32, 26 + orig: 32, 26 offset: 0, 0 index: -1 unit-pulsar-small rotate: false - xy: 1623, 73 - size: 24, 24 - orig: 24, 24 + xy: 1152, 211 + size: 24, 19 + orig: 24, 19 offset: 0, 0 index: -1 unit-pulsar-tiny rotate: false - xy: 1107, 8 - size: 16, 16 - orig: 16, 16 + xy: 1373, 163 + size: 16, 13 + orig: 16, 13 offset: 0, 0 index: -1 unit-pulsar-xlarge rotate: false - xy: 4009, 413 - size: 48, 48 - orig: 48, 48 + xy: 501, 235 + size: 48, 39 + orig: 48, 39 offset: 0, 0 index: -1 unit-quasar-large rotate: false - xy: 2841, 287 + xy: 881, 639 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-quasar-medium rotate: false - xy: 2719, 177 + xy: 1785, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-quasar-small rotate: false - xy: 1649, 73 + xy: 1100, 133 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-quasar-tiny rotate: false - xy: 4067, 408 + xy: 1391, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-quasar-xlarge rotate: false - xy: 859, 363 + xy: 551, 280 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +unit-reign-large + rotate: false + xy: 1825, 695 + size: 40, 26 + orig: 40, 26 + offset: 0, 0 + index: -1 +unit-reign-medium + rotate: false + xy: 1799, 528 + size: 31, 20 + orig: 31, 20 + offset: 0, 0 + index: -1 +unit-reign-small + rotate: false + xy: 1126, 163 + size: 24, 15 + orig: 24, 15 + offset: 0, 0 + index: -1 +unit-reign-tiny + rotate: false + xy: 771, 916 + size: 15, 10 + orig: 15, 10 + offset: 0, 0 + index: -1 +unit-reign-xlarge + rotate: false + xy: 601, 333 + size: 48, 31 + orig: 48, 31 + offset: 0, 0 + index: -1 unit-risso-large rotate: false - xy: 2883, 329 - size: 40, 40 - orig: 40, 40 + xy: 1951, 849 + size: 35, 40 + orig: 35, 40 offset: 0, 0 index: -1 unit-risso-medium rotate: false - xy: 2753, 211 - size: 32, 32 - orig: 32, 32 + xy: 2019, 729 + size: 28, 32 + orig: 28, 32 offset: 0, 0 index: -1 unit-risso-small rotate: false - xy: 1675, 73 - size: 24, 24 - orig: 24, 24 + xy: 1152, 138 + size: 21, 24 + orig: 21, 24 offset: 0, 0 index: -1 unit-risso-tiny rotate: false - xy: 4067, 390 - size: 16, 16 - orig: 16, 16 + xy: 1767, 663 + size: 14, 16 + orig: 14, 16 offset: 0, 0 index: -1 unit-risso-xlarge rotate: false - xy: 859, 313 - size: 48, 48 - orig: 48, 48 + xy: 501, 185 + size: 43, 48 + orig: 43, 48 + offset: 0, 0 + index: -1 +unit-scepter-large + rotate: false + xy: 881, 605 + size: 40, 32 + orig: 40, 32 + offset: 0, 0 + index: -1 +unit-scepter-medium + rotate: false + xy: 1819, 593 + size: 32, 26 + orig: 32, 26 + offset: 0, 0 + index: -1 +unit-scepter-small + rotate: false + xy: 1152, 190 + size: 24, 19 + orig: 24, 19 + offset: 0, 0 + index: -1 +unit-scepter-tiny + rotate: false + xy: 1409, 163 + size: 16, 13 + orig: 16, 13 + offset: 0, 0 + index: -1 +unit-scepter-xlarge + rotate: false + xy: 651, 375 + size: 48, 39 + orig: 48, 39 offset: 0, 0 index: -1 unit-spiroct-large rotate: false - xy: 2841, 245 - size: 40, 40 - orig: 40, 40 + xy: 923, 648 + size: 40, 31 + orig: 40, 31 offset: 0, 0 index: -1 unit-spiroct-medium rotate: false - xy: 2753, 177 - size: 32, 32 - orig: 32, 32 + xy: 1799, 501 + size: 31, 25 + orig: 31, 25 offset: 0, 0 index: -1 unit-spiroct-small rotate: false - xy: 1701, 73 - size: 24, 24 - orig: 24, 24 + xy: 1178, 211 + size: 24, 19 + orig: 24, 19 offset: 0, 0 index: -1 unit-spiroct-tiny rotate: false - xy: 4067, 372 - size: 16, 16 - orig: 16, 16 + xy: 1247, 146 + size: 15, 12 + orig: 15, 12 offset: 0, 0 index: -1 unit-spiroct-xlarge rotate: false - xy: 909, 363 - size: 48, 48 - orig: 48, 48 + xy: 701, 426 + size: 48, 38 + orig: 48, 38 + offset: 0, 0 + index: -1 +unit-toxopid-large + rotate: false + xy: 1951, 765 + size: 33, 40 + orig: 33, 40 + offset: 0, 0 + index: -1 +unit-toxopid-medium + rotate: false + xy: 2021, 797 + size: 26, 32 + orig: 26, 32 + offset: 0, 0 + index: -1 +unit-toxopid-small + rotate: false + xy: 1178, 185 + size: 20, 24 + orig: 20, 24 + offset: 0, 0 + index: -1 +unit-toxopid-tiny + rotate: false + xy: 1445, 160 + size: 13, 16 + orig: 13, 16 + offset: 0, 0 + index: -1 +unit-toxopid-xlarge + rotate: false + xy: 923, 598 + size: 40, 48 + orig: 40, 48 offset: 0, 0 index: -1 unit-zenith-large rotate: false - xy: 2883, 287 + xy: 965, 639 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-zenith-medium rotate: false - xy: 2787, 211 + xy: 1799, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-zenith-small rotate: false - xy: 1727, 73 + xy: 1126, 137 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-zenith-tiny rotate: false - xy: 2920, 193 + xy: 1427, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-zenith-xlarge rotate: false - xy: 859, 263 + xy: 401, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +wavepane + rotate: false + xy: 877, 447 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 white-pane rotate: false - xy: 3305, 313 + xy: 877, 418 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18969,14 +19594,14 @@ white-pane index: -1 whiteui rotate: false - xy: 960, 22 + xy: 496, 161 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 999, 106 + xy: 1830, 400 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 36b45b272c..a343f21e56 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 f65ca46d0c..c869fbf0dd 100644 Binary files a/core/assets/sprites/sprites2.png and b/core/assets/sprites/sprites2.png differ diff --git a/core/assets/sprites/sprites3.png b/core/assets/sprites/sprites3.png index a51d8709a2..10681da213 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 27ed8e81f9..f6759ce107 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 0d8af5f905..f90ce29bea 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 d875c76833..2ffaff7756 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -37,7 +37,7 @@ public class Vars implements Loadable{ /** Whether the logger is loaded. */ public static boolean loadedLogger = false, loadedFileLogger = false; /** Maximum extra padding around deployment schematics. */ - public static final int maxLoadoutSchematicPad = 4; + public static final int maxLoadoutSchematicPad = 5; /** Maximum schematic size.*/ public static final int maxSchematicSize = 32; /** All schematic base64 starts with this string.*/ @@ -60,6 +60,8 @@ public class Vars implements Loadable{ public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json"; /** URL to the JSON file containing all the BE servers. Only queried in BE. */ public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json"; + /** URL to the JSON file containing all the BE servers. Only queried in the V6 alpha (will be removed once it's out). */ + public static final String serverJsonV6URL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json"; /** URL of the github issue report template.*/ public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md"; /** list of built-in servers.*/ @@ -78,6 +80,8 @@ public class Vars implements Loadable{ public static final float miningRange = 70f; /** range for building */ public static final float buildingRange = 220f; + /** range for moving items */ + public static final float itemTransferRange = 220f; /** duration of time between turns in ticks */ public static final float turnDuration = 20 * Time.toMinutes; /** turns needed to destroy a sector completely */ @@ -199,8 +203,7 @@ public class Vars implements Loadable{ public static NetServer netServer; public static NetClient netClient; - public static - Player player; + public static Player player; @Override public void loadAsync(){ diff --git a/core/src/mindustry/ai/BaseAI.java b/core/src/mindustry/ai/BaseAI.java index df2fc26302..83f393cc83 100644 --- a/core/src/mindustry/ai/BaseAI.java +++ b/core/src/mindustry/ai/BaseAI.java @@ -63,6 +63,7 @@ public class BaseAI{ int range = 150; Position pos = randomPosition(); + //when there are no random positions, do nothing. if(pos == null) return; @@ -159,7 +160,10 @@ public class BaseAI{ private void tryWalls(){ Block wall = Blocks.copperWall; - Tile spawn = state.rules.defaultTeam.core() != null ? state.rules.defaultTeam.core().tile : data.team.core().tile; + Building spawnt = state.rules.defaultTeam.core() != null ? state.rules.defaultTeam.core() : data.team.core(); + Tile spawn = spawnt == null ? null : spawnt.tile; + + if(spawn == null) return; for(int wx = lastX; wx <= lastX + lastW; wx++){ for(int wy = lastY; wy <= lastY + lastH; wy++){ diff --git a/core/src/mindustry/ai/BaseRegistry.java b/core/src/mindustry/ai/BaseRegistry.java index 98e4744da0..cb34095a3c 100644 --- a/core/src/mindustry/ai/BaseRegistry.java +++ b/core/src/mindustry/ai/BaseRegistry.java @@ -1,6 +1,7 @@ package mindustry.ai; import arc.*; +import arc.math.*; import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; @@ -68,7 +69,7 @@ public class BaseRegistry{ } schem.tiles.removeAll(s -> s.block.buildVisibility == BuildVisibility.sandboxOnly); - part.tier = schem.tiles.sumf(s -> s.block.buildCost / s.block.buildCostMultiplier); + part.tier = schem.tiles.sumf(s -> Mathf.pow(s.block.buildCost / s.block.buildCostMultiplier, 1.2f)); if(part.core != null){ cores.add(part); @@ -92,7 +93,7 @@ public class BaseRegistry{ } } - cores.sort(Structs.comps(Structs.comparingFloat(b -> b.core.health), Structs.comparingFloat(b -> b.tier))); + cores.sort(b -> b.tier); parts.sort(); reqParts.each((key, arr) -> arr.sort()); } diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index 5931068c48..05d7b69273 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -37,7 +37,7 @@ public class BlockIndexer{ /** All ores available on this map. */ private ObjectSet allOres = new ObjectSet<>(); /** Stores teams that are present here as tiles. */ - private Seq activeTeams = new Seq<>(); + private Seq activeTeams = new Seq<>(Team.class); /** Maps teams to a map of flagged tiles by flag. */ private TileArray[][] flagMap = new TileArray[Team.all.length][BlockFlag.all.length]; /** Max units by team. */ @@ -52,7 +52,7 @@ public class BlockIndexer{ private Seq breturnArray = new Seq<>(); public BlockIndexer(){ - Events.on(BuildinghangeEvent.class, event -> { + Events.on(TileChangeEvent.class, event -> { if(typeMap.get(event.tile.pos()) != null){ TileIndex index = typeMap.get(event.tile.pos()); for(BlockFlag flag : index.flags){ @@ -73,6 +73,7 @@ public class BlockIndexer{ damagedTiles = new BuildingArray[Team.all.length]; flagMap = new TileArray[Team.all.length][BlockFlag.all.length]; unitCaps = new int[Team.all.length]; + activeTeams = new Seq<>(Team.class); for(int i = 0; i < flagMap.length; i++){ for(int j = 0; j < BlockFlag.all.length; j++){ @@ -147,7 +148,7 @@ public class BlockIndexer{ BuildingArray set = damagedTiles[team.id]; for(Building build : set){ - if((!build.isValid() || build.team != team || !build.damaged()) || build.block instanceof BuildBlock){ + if((!build.isValid() || build.team != team || !build.damaged()) || build.block instanceof ConstructBlock){ breturnArray.add(build); } } @@ -185,7 +186,7 @@ public class BlockIndexer{ if(other == null) continue; - if(other.team() == team && pred.get(other) && intSet.add(other.pos())){ + if(other.team == team && pred.get(other) && intSet.add(other.pos())){ cons.get(other); any = true; } @@ -212,15 +213,18 @@ public class BlockIndexer{ } public void notifyTileDamaged(Building entity){ - if(damagedTiles[entity.team().id] == null){ - damagedTiles[entity.team().id] = new BuildingArray(); + if(damagedTiles[entity.team.id] == null){ + damagedTiles[entity.team.id] = new BuildingArray(); } - damagedTiles[entity.team().id].add(entity); + damagedTiles[entity.team.id].add(entity); } public Building findEnemyTile(Team team, float x, float y, float range, Boolf pred){ - for(Team enemy : team.enemies()){ + for(int i = 0; i < activeTeams.size; i++){ + Team enemy = activeTeams.items[i]; + + if(enemy == team) continue; Building entity = indexer.findTile(enemy, x, y, range, pred, true); if(entity != null){ @@ -251,15 +255,15 @@ public class BlockIndexer{ if(e == null) continue; - if(e.team() != team || !pred.get(e) || !e.block().targetable) + if(e.team != team || !pred.get(e) || !e.block.targetable) continue; float ndst = e.dst2(x, y); if(ndst < range2 && (closest == null || //this one is closer, and it is at least of equal priority - (ndst < dst && (!usePriority || closest.block().priority.ordinal() <= e.block().priority.ordinal())) || + (ndst < dst && (!usePriority || closest.block.priority.ordinal() <= e.block.priority.ordinal())) || //priority is used, and new block has higher priority regardless of range - (usePriority && closest.block().priority.ordinal() < e.block().priority.ordinal()))){ + (usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){ dst = ndst; closest = e; } @@ -390,7 +394,7 @@ public class BlockIndexer{ for(int y = quadrantY * quadrantSize; y < world.height() && y < (quadrantY + 1) * quadrantSize; y++){ Building result = world.build(x, y); //when a targetable block is found, mark this quadrant as occupied and stop searching - if(result != null && result.team() == team){ + if(result != null && result.team == team){ bits.set(quadrantX, quadrantY); break outer; } diff --git a/core/src/mindustry/ai/Pathfinder.java b/core/src/mindustry/ai/Pathfinder.java index 222cc7df74..280106eaa8 100644 --- a/core/src/mindustry/ai/Pathfinder.java +++ b/core/src/mindustry/ai/Pathfinder.java @@ -23,52 +23,107 @@ public class Pathfinder implements Runnable{ private static final int impassable = -1; private static final int fieldTimeout = 1000 * 60 * 2; + public static final int + fieldCore = 0, + fieldRally = 1; + + public static final Seq> fieldTypes = Seq.with( + EnemyCoreField::new, + RallyField::new + ); + + public static final int + costGround = 0, + costLegs = 1, + costWater = 2; + + public static final Seq costTypes = Seq.with( + //ground + (team, tile) -> (PathTile.team(tile) == team.id || PathTile.team(tile) == 0) && PathTile.solid(tile) ? impassable : 1 + + PathTile.health(tile) * 5 + + (PathTile.nearSolid(tile) ? 2 : 0) + + (PathTile.nearLiquid(tile) ? 6 : 0) + + (PathTile.deep(tile) ? 70 : 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 + (PathTile.nearGround(tile) || PathTile.nearSolid(tile) ? 14 : 0) + + (PathTile.deep(tile) ? -1 : 0) + ); + + //maps team, cost, type to flow field + Flowfield[][][] cache; + /** tile data, see PathTileStruct */ - private int[][] tiles; + int[][] tiles; /** unordered array of path data for iteration only. DO NOT iterate or access this in the main thread. */ - private Seq threadList = new Seq<>(), mainList = new Seq<>(); - /** Maps team ID and target to to a flowfield.*/ - private ObjectMap[] fieldMap = new ObjectMap[Team.all.length]; - /** Used field maps. */ - private ObjectSet[] fieldMapUsed = new ObjectSet[Team.all.length]; + Seq threadList = new Seq<>(), mainList = new Seq<>(); /** handles task scheduling on the update thread. */ - private TaskQueue queue = new TaskQueue(); - /** Stores path target for a position. Main thread only.*/ - private ObjectMap targetCache = new ObjectMap<>(); + TaskQueue queue = new TaskQueue(); /** Current pathfinding thread */ - private @Nullable Thread thread; - private IntSeq tmpArray = new IntSeq(); + @Nullable Thread thread; + IntSeq tmpArray = new IntSeq(); public Pathfinder(){ + clearCache(); + Events.on(WorldLoadEvent.class, event -> { stop(); //reset and update internal tile array tiles = new int[world.width()][world.height()]; - fieldMap = new ObjectMap[Team.all.length]; - fieldMapUsed = new ObjectSet[Team.all.length]; - targetCache = new ObjectMap<>(); threadList = new Seq<>(); mainList = new Seq<>(); + clearCache(); for(Tile tile : world.tiles){ tiles[tile.x][tile.y] = packTile(tile); } //special preset which may help speed things up; this is optional - preloadPath(state.rules.waveTeam, FlagTarget.enemyCores); + preloadPath(getField(state.rules.waveTeam, costGround, fieldCore)); start(); }); Events.on(ResetEvent.class, event -> stop()); - Events.on(BuildinghangeEvent.class, event -> updateTile(event.tile)); + Events.on(TileChangeEvent.class, event -> updateTile(event.tile)); + } + + private void clearCache(){ + cache = new Flowfield[256][5][5]; } /** Packs a tile into its internal representation. */ private int packTile(Tile tile){ - return PathTile.get(tile.cost, (byte)tile.getTeamID(), !tile.solid() && tile.floor().drownTime <= 0f, !tile.solid() && tile.floor().isLiquid); + //TODO nearGround is just the inverse of nearLiquid? + boolean nearLiquid = false, nearSolid = false, nearGround = false; + + for(int i = 0; i < 4; i++){ + Tile other = tile.getNearby(i); + if(other != null){ + if(other.floor().isLiquid) nearLiquid = true; + if(other.solid()) nearSolid = true; + if(!other.floor().isLiquid) nearGround = true; + } + } + + return PathTile.get( + tile.build == null ? 0 : Math.min((int)(tile.build.health / 40), 127), + tile.getTeamID(), + tile.solid(), + tile.floor().isLiquid, + tile.staticDarkness() >= 2, + nearLiquid, + nearGround, + nearSolid, + tile.floor().isDeep() + ); } /** Starts or restarts the pathfinding thread. */ @@ -104,7 +159,7 @@ public class Pathfinder implements Runnable{ if(path != null){ synchronized(path.targets){ path.targets.clear(); - path.target.getPositions(path.team, path.targets); + path.getPositions(path.targets); } } } @@ -131,18 +186,19 @@ public class Pathfinder implements Runnable{ updateFrontier(data, maxUpdate / threadList.size); //remove flowfields that have 'timed out' so they can be garbage collected and no longer waste space - if(data.target.refreshRate() > 0 && Time.timeSinceMillis(data.lastUpdateTime) > fieldTimeout){ + if(data.refreshRate > 0 && Time.timeSinceMillis(data.lastUpdateTime) > fieldTimeout){ //make sure it doesn't get removed twice data.lastUpdateTime = Time.millis(); 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); }); @@ -167,51 +223,49 @@ public class Pathfinder implements Runnable{ } } - public @Nullable Tile getTargetTile(Tile tile, Team team, Position target){ - return getTargetTile(tile, team, getTarget(target)); + public Flowfield getField(Team team, int costType, int fieldType){ + if(cache[team.id][costType][fieldType] == null){ + Flowfield field = fieldTypes.get(fieldType).get(); + field.team = team; + field.cost = costTypes.get(costType); + field.targets.clear(); + field.getPositions(field.targets); + + cache[team.id][costType][fieldType] = field; + queue.post(() -> registerPath(field)); + } + return cache[team.id][costType][fieldType]; } /** Gets next tile to travel to. Main thread only. */ - public @Nullable Tile getTargetTile(Tile tile, Team team, PathTarget target){ + public @Nullable Tile getTargetTile(Tile tile, Flowfield path){ if(tile == null) return null; - if(fieldMap[team.id] == null){ - fieldMap[team.id] = new ObjectMap<>(); - fieldMapUsed[team.id] = new ObjectSet<>(); - } - - Flowfield data = fieldMap[team.id].get(target); - - if(data == null){ - //if this combination is not found, create it on request - if(fieldMapUsed[team.id].add(target)){ - //grab targets since this is run on main thread - IntSeq targets = target.getPositions(team, new IntSeq()); - queue.post(() -> createPath(team, target, targets)); - } + //uninitialized flowfields are not applicable + if(!path.initialized){ return tile; } //if refresh rate is positive, queue a refresh - if(target.refreshRate() > 0 && Time.timeSinceMillis(data.lastUpdateTime) > target.refreshRate()){ - data.lastUpdateTime = Time.millis(); + if(path.refreshRate > 0 && Time.timeSinceMillis(path.lastUpdateTime) > path.refreshRate){ + path.lastUpdateTime = Time.millis(); tmpArray.clear(); - data.target.getPositions(data.team, tmpArray); + path.getPositions(tmpArray); - synchronized(data.targets){ + synchronized(path.targets){ //make sure the position actually changed - if(!(data.targets.size == 1 && tmpArray.size == 1 && data.targets.first() == tmpArray.first())){ - data.targets.clear(); - data.target.getPositions(data.team, data.targets); + if(!(path.targets.size == 1 && tmpArray.size == 1 && path.targets.first() == tmpArray.first())){ + path.targets.clear(); + path.getPositions(path.targets); //queue an update - queue.post(() -> updateTargets(data)); + queue.post(() -> updateTargets(path)); } } } - int[][] values = data.weights; + int[][] values = path.weights; int value = values[tile.x][tile.y]; Tile current = null; @@ -222,8 +276,8 @@ public class Pathfinder implements Runnable{ Tile other = world.tile(dx, dy); if(other == null) continue; - if(values[dx][dy] < value && (current == null || values[dx][dy] < tl) && !other.solid() && other.floor().drownTime <= 0 && - !(point.x != 0 && point.y != 0 && (world.solid(tile.x + point.x, tile.y) || world.solid(tile.x, tile.y + point.y)))){ //diagonal corner trap + if(values[dx][dy] < value && (current == null || values[dx][dy] < tl) && path.passable(dx, dy) && + !(point.x != 0 && point.y != 0 && (!path.passable(tile.x + point.x, tile.y) || !path.passable(tile.x, tile.y + point.y)))){ //diagonal corner trap current = other; tl = values[dx][dy]; } @@ -234,16 +288,6 @@ public class Pathfinder implements Runnable{ return current; } - private PathTarget getTarget(Position position){ - return targetCache.get(position, () -> new PositionTarget(position)); - } - - /** @return whether a tile can be passed through by this team. Pathfinding thread only. */ - private boolean passable(int x, int y, Team team){ - int tile = tiles[x][y]; - return PathTile.passable(tile) || (PathTile.team(tile) != team.id && PathTile.team(tile) != (int)Team.derelict.id); - } - /** * Clears the frontier, increments the search and sets up all flow sources. * This only occurs for active teams. @@ -259,10 +303,8 @@ public class Pathfinder implements Runnable{ return; } - //assign impassability to the tile - if(!passable(x, y, path.team)){ - path.weights[x][y] = impassable; - } + //update cost of the tile TODO maybe only update the cost when it's not passable + path.weights[x][y] = path.cost.getCost(path.team, tiles[x][y]); //clear frontier to prevent contamination path.frontier.clear(); @@ -289,34 +331,33 @@ public class Pathfinder implements Runnable{ } } - private void preloadPath(Team team, PathTarget target){ - updateFrontier(createPath(team, target, target.getPositions(team, new IntSeq())), -1); + private void preloadPath(Flowfield path){ + path.targets.clear(); + path.getPositions(path.targets); + registerPath(path); + updateFrontier(path, -1); } /** + * TODO wrong docs * Created a new flowfield that aims to get to a certain target for a certain team. * Pathfinding thread only. */ - private Flowfield createPath(Team team, PathTarget target, IntSeq targets){ - Flowfield path = new Flowfield(team, target, world.width(), world.height()); + private void registerPath(Flowfield path){ path.lastUpdateTime = Time.millis(); + path.setup(tiles.length, tiles[0].length); threadList.add(path); //add to main thread's list of paths Core.app.post(() -> { mainList.add(path); - if(fieldMap[team.id] != null){ - fieldMap[team.id].put(target, path); - } + //TODO + //if(fieldMap[team.id] != null){ + // fieldMap[team.id].put(target, path); + //} }); - //grab targets from passed array - synchronized(path.targets){ - path.targets.clear(); - path.targets.addAll(targets); - } - //fill with impassables by default for(int x = 0; x < world.width(); x++){ for(int y = 0; y < world.height(); y++){ @@ -330,8 +371,6 @@ public class Pathfinder implements Runnable{ path.weights[Point2.x(pos)][Point2.y(pos)] = 0; path.frontier.addFirst(pos); } - - return path; } /** Update the frontier for a path. Pathfinding thread only. */ @@ -353,12 +392,14 @@ public class Pathfinder implements Runnable{ for(Point2 point : Geometry.d4){ int dx = tile.x + point.x, dy = tile.y + point.y; - Tile other = world.tile(dx, dy); - if(other != null && (path.weights[dx][dy] > cost + other.cost || path.searches[dx][dy] < path.search) && passable(dx, dy, path.team)){ - if(other.cost < 0) throw new IllegalArgumentException("Tile cost cannot be negative! " + other); + if(dx < 0 || dy < 0 || dx >= tiles.length || dy >= tiles[0].length) continue; + + int otherCost = path.cost.getCost(path.team, tiles[dx][dy]); + + if((path.weights[dx][dy] > cost + otherCost || path.searches[dx][dy] < path.search) && otherCost != impassable){ path.frontier.addFirst(Point2.pack(dx, dy)); - path.weights[dx][dy] = cost + other.cost; + path.weights[dx][dy] = cost + otherCost; path.searches[dx][dy] = (short)path.search; } } @@ -366,9 +407,9 @@ public class Pathfinder implements Runnable{ } } - /** A path target defines a set of targets for a path. */ - public enum FlagTarget implements PathTarget{ - enemyCores((team, out) -> { + public static class EnemyCoreField extends Flowfield{ + @Override + protected void getPositions(IntSeq out){ for(Tile other : indexer.getEnemy(team, BlockFlag.core)){ out.add(other.pos()); } @@ -379,98 +420,99 @@ public class Pathfinder implements Runnable{ out.add(other.pos()); } } - }), - rallyPoints((team, out) -> { - for(Tile other : indexer.getAllied(team, BlockFlag.rally)){ - out.add(other.pos()); - } - }); - - public static final FlagTarget[] all = values(); - - private final Cons2 targeter; - - FlagTarget(Cons2 targeter){ - this.targeter = targeter; - } - - @Override - public IntSeq getPositions(Team team, IntSeq out){ - targeter.get(team, out); - return out; - } - - @Override - public int refreshRate(){ - return 0; } } - public static class PositionTarget implements PathTarget{ + public static class RallyField extends Flowfield{ + @Override + protected void getPositions(IntSeq out){ + for(Tile other : indexer.getAllied(team, BlockFlag.rally)){ + out.add(other.pos()); + } + } + } + + public static class PositionTarget extends Flowfield{ public final Position position; public PositionTarget(Position position){ this.position = position; + this.refreshRate = 900; } @Override - public IntSeq getPositions(Team team, IntSeq out){ + public void getPositions(IntSeq out){ out.add(Point2.pack(world.toTile(position.getX()), world.toTile(position.getY()))); - return out; } - @Override - public int refreshRate(){ - return 900; - } } - public interface PathTarget{ - /** Gets targets to pathfind towards. This must run on the main thread. */ - IntSeq getPositions(Team team, IntSeq out); + /** + * Data for a flow field to some set of destinations. + * Concrete subclasses must specify a way to fetch costs and destinations. + * */ + static abstract class Flowfield{ /** Refresh rate in milliseconds. Return any number <= 0 to disable. */ - int refreshRate(); - } + protected int refreshRate; + /** Team this path is for. Set before using. */ + protected Team team = Team.derelict; + /** Function for calculating path cost. Set before using. */ + protected PathCost cost = costTypes.get(costGround); - /** Data for a specific flow field to some set of destinations. */ - static class Flowfield{ - /** Team this path is for. */ - final Team team; - /** Flag that is being targeted. */ - final PathTarget target; /** costs of getting to a specific tile */ - final int[][] weights; + int[][] weights; /** search IDs of each position - the highest, most recent search is prioritized and overwritten */ - final int[][] searches; + int[][] searches; /** search frontier, these are Pos objects */ - final IntQueue frontier = new IntQueue(); + IntQueue frontier = new IntQueue(); /** all target positions; these positions have a cost of 0, and must be synchronized on! */ - final IntSeq targets = new IntSeq(); + IntSeq targets = new IntSeq(); /** current search ID */ int search = 1; /** last updated time */ long lastUpdateTime; + /** whether this flow field is ready to be used */ + boolean initialized; - Flowfield(Team team, PathTarget target, int width, int height){ - this.team = team; - this.target = target; - + void setup(int width, int height){ this.weights = new int[width][height]; this.searches = new int[width][height]; this.frontier.ensureCapacity((width + height) * 3); + this.initialized = true; } + + protected boolean passable(int x, int y){ + return cost.getCost(team, pathfinder.tiles[x][y]) != impassable; + } + + /** Gets targets to pathfind towards. This must run on the main thread. */ + protected abstract void getPositions(IntSeq out); + } + + interface PathCost{ + int getCost(Team traversing, int tile); } /** Holds a copy of tile data for a specific tile position. */ @Struct class PathTileStruct{ - //traversal cost - short cost; + //scaled block health + @StructField(8) int health; //team of block, if applicable (0 by default) - byte team; - //whether it's viable to pass this block - boolean passable; - //whether it's viable to pass this block through water - boolean passableWater; + @StructField(8) int team; + //general solid state + boolean solid; + //whether this block is a liquid that boats can move on + boolean liquid; + //whether this block is solid for leg units that can move over some solid blocks + boolean legSolid; + //whether this block is near liquids + boolean nearLiquid; + //whether this block is near a solid floor tile + boolean nearGround; + //whether this block is near a solid object + boolean nearSolid; + //whether this block is deep / drownable + boolean deep; } } diff --git a/core/src/mindustry/ai/WaveSpawner.java b/core/src/mindustry/ai/WaveSpawner.java index 09060fd33d..417909a92b 100644 --- a/core/src/mindustry/ai/WaveSpawner.java +++ b/core/src/mindustry/ai/WaveSpawner.java @@ -3,6 +3,7 @@ package mindustry.ai; import arc.*; import arc.func.*; import arc.math.*; +import arc.math.geom.*; import arc.struct.*; import arc.util.*; import mindustry.annotations.Annotations.*; @@ -17,10 +18,11 @@ import mindustry.world.*; import static mindustry.Vars.*; public class WaveSpawner{ - private static final float margin = 40f, coreMargin = tilesize * 3; //how far away from the edge flying units spawn + private static final float margin = 40f, coreMargin = tilesize * 2f, maxSteps = 30; private Seq spawns = new Seq<>(); private boolean spawning = false; + private boolean any = false; public WaveSpawner(){ Events.on(WorldLoadEvent.class, e -> reset()); @@ -91,15 +93,41 @@ public class WaveSpawner{ if(state.rules.attackMode && state.teams.isActive(state.rules.waveTeam) && !state.teams.playerCores().isEmpty()){ Building firstCore = state.teams.playerCores().first(); for(Building core : state.rules.waveTeam.cores()){ - Tmp.v1.set(firstCore).sub(core).limit(coreMargin + core.block().size * tilesize); - cons.accept(core.x + Tmp.v1.x, core.y + Tmp.v1.y, false); + Tmp.v1.set(firstCore).sub(core).limit(coreMargin + core.block.size * tilesize /2f * Mathf.sqrt2); + + boolean valid = false; + int steps = 0; + + //keep moving forward until the max step amount is reached + while(steps++ < maxSteps){ + int tx = world.toTile(core.x + Tmp.v1.x), ty = world.toTile(core.y + Tmp.v1.y); + any = false; + Geometry.circle(tx, ty, world.width(), world.height(), 3, (x, y) -> { + if(world.solid(x, y)){ + any = true; + } + }); + + //nothing is in the way, spawn it + if(!any){ + valid = true; + break; + }else{ + //make the vector longer + Tmp.v1.setLength(Tmp.v1.len() + tilesize*1.1f); + } + } + + if(valid){ + cons.accept(core.x + Tmp.v1.x, core.y + Tmp.v1.y, false); + } } } } private void eachFlyerSpawn(Floatc2 cons){ for(Tile tile : spawns){ - float angle = Angles.angle(tile.x, tile.y, world.width() / 2, world.height() / 2); + float angle = Angles.angle(world.width() / 2, world.height() / 2, tile.x, tile.y); float trns = Math.max(world.width(), world.height()) * Mathf.sqrt2 * tilesize; float spawnX = Mathf.clamp(world.width() * tilesize / 2f + Angles.trnsx(angle, trns), -margin, world.width() * tilesize + margin); diff --git a/core/src/mindustry/ai/types/BuilderAI.java b/core/src/mindustry/ai/types/BuilderAI.java index 149f4ef6d0..7a8adbbc44 100644 --- a/core/src/mindustry/ai/types/BuilderAI.java +++ b/core/src/mindustry/ai/types/BuilderAI.java @@ -1,15 +1,20 @@ package mindustry.ai.types; import arc.struct.*; +import arc.util.ArcAnnotate.*; +import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.Teams.*; import mindustry.gen.*; import mindustry.world.*; -import mindustry.world.blocks.BuildBlock.*; +import mindustry.world.blocks.ConstructBlock.*; import static mindustry.Vars.*; public class BuilderAI extends AIController{ + float buildRadius = 700; + boolean found = false; + @Nullable Builderc following; @Override public void updateUnit(){ @@ -21,12 +26,27 @@ public class BuilderAI extends AIController{ builder.updateBuilding(true); - //approach request if building + if(following != null){ + //try to follow and mimic someone + + //validate follower + if(!following.isValid() || !following.activelyBuilding()){ + following = null; + builder.plans().clear(); + return; + } + + //set to follower's first build plan, whatever that is + builder.plans().clear(); + builder.plans().addFirst(following.buildPlan()); + } + if(builder.buildPlan() != null){ + //approach request if building BuildPlan req = builder.buildPlan(); boolean valid = - (req.tile().build instanceof BuildEntity && req.tile().bc().cblock == req.block) || + (req.tile().build instanceof ConstructBuild && req.tile().bc().cblock == req.block) || (req.breaking ? Build.validBreak(unit.team(), req.x, req.y) : Build.validPlace(req.block, unit.team(), req.x, req.y, req.rotation)); @@ -39,8 +59,35 @@ public class BuilderAI extends AIController{ builder.plans().removeFirst(); } }else{ + + //follow someone and help them build + if(timer.get(timerTarget2, 60f)){ + found = false; + + Units.nearby(unit.team, unit.x, unit.y, buildRadius, u -> { + if(found) return; + + if(u instanceof Builderc && u != unit && ((Builderc)u).activelyBuilding()){ + Builderc b = (Builderc)u; + BuildPlan plan = b.buildPlan(); + + Building build = world.build(plan.x, plan.y); + if(build instanceof ConstructBuild){ + ConstructBuild cons = (ConstructBuild)build; + float dist = Math.min(cons.dst(unit) - buildingRange, 0); + + //make sure you can reach the request in time + if(dist / unit.type().speed < cons.buildCost * 0.9f){ + following = b; + found = true; + } + } + } + }); + } + //find new request - if(!unit.team().data().blocks.isEmpty()){ + if(!unit.team().data().blocks.isEmpty() && following == null && timer.get(timerTarget3, 60 * 2f)){ Queue blocks = unit.team().data().blocks; BlockPlan block = blocks.first(); @@ -49,17 +96,14 @@ public class BuilderAI extends AIController{ blocks.removeFirst(); }else if(Build.validPlace(content.block(block.block), unit.team(), block.x, block.y, block.rotation)){ //it's valid. //add build request. - BuildPlan req = new BuildPlan(block.x, block.y, block.rotation, content.block(block.block)); - if(block.config != null){ - req.configure(block.config); - } - builder.addBuild(req); + builder.addBuild(new BuildPlan(block.x, block.y, block.rotation, content.block(block.block), block.config)); }else{ //shift head of queue to tail, try something else next time blocks.removeFirst(); blocks.addLast(block); } } + } } } diff --git a/core/src/mindustry/ai/types/FlyingAI.java b/core/src/mindustry/ai/types/FlyingAI.java index 479e2ce817..64fb8b44cd 100644 --- a/core/src/mindustry/ai/types/FlyingAI.java +++ b/core/src/mindustry/ai/types/FlyingAI.java @@ -6,19 +6,13 @@ import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.world.meta.*; +import static mindustry.Vars.*; + public class FlyingAI extends AIController{ @Override public void updateMovement(){ - if(unit.moving()){ - unit.lookAt(unit.vel.angle()); - } - - if(unit.isFlying()){ - unit.wobble(); - } - - if(target != null && unit.hasWeapons()){ + if(target != null && unit.hasWeapons() && command() == UnitCommand.attack){ if(unit.type().weapons.first().rotate){ moveTo(target, unit.range() * 0.8f); unit.lookAt(target); @@ -26,6 +20,15 @@ public class FlyingAI extends AIController{ attack(80f); } } + + if(target == null && command() == UnitCommand.attack && state.rules.waves && unit.team == state.rules.defaultTeam){ + moveTo(getClosestSpawner(), state.rules.dropZoneRadius + 120f); + } + + if(command() == UnitCommand.rally){ + target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); + moveTo(target, 60f); + } } @Override diff --git a/core/src/mindustry/ai/types/FormationAI.java b/core/src/mindustry/ai/types/FormationAI.java index 9ef064cfe1..0a5bdbb25b 100644 --- a/core/src/mindustry/ai/types/FormationAI.java +++ b/core/src/mindustry/ai/types/FormationAI.java @@ -47,7 +47,8 @@ public class FormationAI extends AIController implements FormationMember{ Vec2 realtarget = vec.set(target); if(unit.isGrounded() && Vars.world.raycast(unit.tileX(), unit.tileY(), leader.tileX(), leader.tileY(), Vars.world::solid)){ - realtarget.set(Vars.pathfinder.getTargetTile(unit.tileOn(), unit.team, leader)); + //TODO pathfind + //realtarget.set(Vars.pathfinder.getTargetTile(unit.tileOn(), unit.team, leader)); } unit.moveAt(realtarget.sub(unit).limit(unit.type().speed)); diff --git a/core/src/mindustry/ai/types/GroundAI.java b/core/src/mindustry/ai/types/GroundAI.java index ac2c110c12..ebf36d1ff4 100644 --- a/core/src/mindustry/ai/types/GroundAI.java +++ b/core/src/mindustry/ai/types/GroundAI.java @@ -1,11 +1,14 @@ package mindustry.ai.types; -import mindustry.ai.Pathfinder.*; +import arc.math.*; +import mindustry.ai.*; import mindustry.entities.*; import mindustry.entities.units.*; -import mindustry.game.*; import mindustry.gen.*; import mindustry.world.*; +import mindustry.world.meta.*; + +import java.util.*; import static mindustry.Vars.*; @@ -18,18 +21,37 @@ public class GroundAI extends AIController{ Building core = unit.closestEnemyCore(); - if(core != null){ - if(unit.within(core,unit.range() / 1.1f)){ - target = core; + if(core != null && unit.within(core, unit.range() / 1.1f + core.block.size * tilesize / 2f)){ + target = core; + Arrays.fill(targets, core); + } + + 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(!unit.within(core, unit.range() * 0.5f)){ - moveToCore(FlagTarget.enemyCores); + if(move) moveTo(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); } } + if(unit.type().canBoost && !unit.onSolid()){ + unit.elevation = Mathf.approachDelta(unit.elevation, 0f, 0.08f); + } + if(!Units.invalidateTarget(target, unit, unit.range())){ if(unit.type().hasWeapons()){ + //TODO certain units should not look at the target, e.g. ships unit.aimLook(Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed)); } }else if(unit.moving()){ @@ -52,40 +74,17 @@ public class GroundAI extends AIController{ }*/ } - protected void moveToCore(FlagTarget path){ - Tile tile = unit.tileOn(); - if(tile == null) return; - Tile targetTile = pathfinder.getTargetTile(tile, unit.team(), path); - - if(tile == targetTile) return; - - unit.moveAt(vec.trns(unit.angleTo(targetTile), unit.type().speed)); - } - - protected void moveAwayFromCore(){ - Team enemy = null; - for(Team team : unit.team().enemies()){ - if(team.active()){ - enemy = team; - break; - } - } - - if(enemy == null){ - for(Team team : unit.team().enemies()){ - enemy = team; - break; - } - } - - if(enemy == null) return; + 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, enemy, FlagTarget.enemyCores); - Building core = unit.closestCore(); + Tile targetTile = pathfinder.getTargetTile(tile, pathfinder.getField(unit.team, costType, pathType)); - if(tile == targetTile || core == null || unit.within(core, 120f)) return; + 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/MinerAI.java b/core/src/mindustry/ai/types/MinerAI.java index 5077ad77a1..f635c9e543 100644 --- a/core/src/mindustry/ai/types/MinerAI.java +++ b/core/src/mindustry/ai/types/MinerAI.java @@ -15,14 +15,6 @@ public class MinerAI extends AIController{ @Override protected void updateMovement(){ - if(unit.moving()){ - unit.lookAt(unit.vel.angle()); - } - - if(unit.isFlying()){ - unit.wobble(); - } - Building core = unit.closestCore(); if(!(unit instanceof Minerc) || core == null) return; @@ -39,6 +31,7 @@ public class MinerAI extends AIController{ //core full of the target item, do nothing if(targetItem != null && core.acceptStack(targetItem, 1, unit) == 0){ unit.clearItem(); + miner.mineTile(null); return; } @@ -63,6 +56,8 @@ public class MinerAI extends AIController{ } } }else{ + miner.mineTile(null); + if(unit.stack.amount == 0){ mining = true; return; diff --git a/core/src/mindustry/ai/types/RepairAI.java b/core/src/mindustry/ai/types/RepairAI.java new file mode 100644 index 0000000000..a90eba3e56 --- /dev/null +++ b/core/src/mindustry/ai/types/RepairAI.java @@ -0,0 +1,32 @@ +package mindustry.ai.types; + +import mindustry.entities.*; +import mindustry.entities.units.*; +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 != null){ + if(!target.within(unit, unit.type().range)){ + moveTo(target, unit.type().range * 0.9f); + }else{ + unit.aim(target); + shoot = true; + } + } + + unit.controlWeapons(shoot); + } + + @Override + protected void updateTargeting(){ + target = Units.findDamagedTile(unit.team, unit.x, unit.y); + + if(target instanceof ConstructBuild) target = null; + } +} diff --git a/core/src/mindustry/ai/types/SuicideAI.java b/core/src/mindustry/ai/types/SuicideAI.java index 354b90f8b3..388c87f272 100644 --- a/core/src/mindustry/ai/types/SuicideAI.java +++ b/core/src/mindustry/ai/types/SuicideAI.java @@ -1,10 +1,12 @@ package mindustry.ai.types; import mindustry.*; -import mindustry.ai.Pathfinder.*; +import mindustry.ai.*; import mindustry.entities.*; +import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.world.*; +import mindustry.world.meta.*; public class SuicideAI extends GroundAI{ static boolean blockedByBlock; @@ -27,7 +29,7 @@ public class SuicideAI extends GroundAI{ if(!Units.invalidateTarget(target, unit, unit.range())){ rotate = true; shoot = unit.within(target, unit.type().weapons.first().bullet.range() + - (target instanceof Building ? ((Building)target).block().size * Vars.tilesize / 2f : ((Hitboxc)target).hitSize() / 2f)); + (target instanceof Building ? ((Building)target).block.size * Vars.tilesize / 2f : ((Hitboxc)target).hitSize() / 2f)); if(unit.type().hasWeapons()){ unit.aimLook(Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed)); @@ -39,7 +41,7 @@ public class SuicideAI extends GroundAI{ 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()){ + if(tile != null && tile.build != null && tile.build.team != unit.team()){ blockedByBlock = true; return true; }else{ @@ -58,8 +60,14 @@ public class SuicideAI extends GroundAI{ } }else{ - if(core != null){ - moveToCore(FlagTarget.enemyCores); + if(command() == UnitCommand.rally){ + Teamc target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); + + if(target != null && !unit.within(target, 70f)){ + moveTo(Pathfinder.fieldRally); + } + }else if(command() == UnitCommand.attack && core != null){ + moveTo(Pathfinder.fieldCore); } if(unit.moving()) unit.lookAt(unit.vel().angle()); diff --git a/core/src/mindustry/async/PhysicsProcess.java b/core/src/mindustry/async/PhysicsProcess.java index 5e8b1be923..36780faec6 100644 --- a/core/src/mindustry/async/PhysicsProcess.java +++ b/core/src/mindustry/async/PhysicsProcess.java @@ -43,6 +43,7 @@ public class PhysicsProcess implements AsyncProcess{ //find entities without bodies and assign them for(Physicsc entity : group){ boolean grounded = entity.isGrounded(); + int bits = grounded ? ground.maskBits : flying.maskBits; if(entity.physref() == null){ //add bodies to entities that have none @@ -66,12 +67,9 @@ public class PhysicsProcess implements AsyncProcess{ //save last position PhysicRef ref = entity.physref(); - if(ref.wasGround != grounded){ - if(ref.body.getFixtureList().isEmpty()) continue; - + if(ref.body.getFixtureList().any() && ref.body.getFixtureList().first().getFilterData().categoryBits != bits){ //set correct filter ref.body.getFixtureList().first().setFilterData(grounded ? ground : flying); - ref.wasGround = grounded; } ref.velocity.set(entity.deltaX(), entity.deltaY()); @@ -143,10 +141,9 @@ public class PhysicsProcess implements AsyncProcess{ } public static class PhysicRef{ - Physicsc entity; - Body body; - boolean wasGround = true; - Vec2 lastPosition = new Vec2(), delta = new Vec2(), velocity = new Vec2(), lastVelocity = new Vec2(), position = new Vec2(); + public Physicsc entity; + public Body body; + public Vec2 lastPosition = new Vec2(), delta = new Vec2(), velocity = new Vec2(), lastVelocity = new Vec2(), position = new Vec2(); public PhysicRef(Physicsc entity, Body body){ this.entity = entity; diff --git a/core/src/mindustry/audio/MusicControl.java b/core/src/mindustry/audio/MusicControl.java index afb48a8d59..1b642bc7cd 100644 --- a/core/src/mindustry/audio/MusicControl.java +++ b/core/src/mindustry/audio/MusicControl.java @@ -19,6 +19,7 @@ public class MusicControl{ public Seq ambientMusic = Seq.with(); /** darker music, used in times of conflict */ public Seq darkMusic = Seq.with(); + protected Music lastRandomPlayed; protected Interval timer = new Interval(); protected @Nullable Music current; diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 70b4ec637d..93c0f45a8b 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -19,7 +19,6 @@ import mindustry.world.blocks.experimental.*; import mindustry.world.blocks.legacy.*; import mindustry.world.blocks.liquid.*; import mindustry.world.blocks.logic.*; -import mindustry.world.blocks.logic.MessageBlock; import mindustry.world.blocks.power.*; import mindustry.world.blocks.production.*; import mindustry.world.blocks.sandbox.*; @@ -35,10 +34,10 @@ public class Blocks implements ContentList{ public static Block //environment - air, spawn, cliff, deepwater, water, taintedWater, tar, slag, stone, craters, charr, sand, darksand, ice, snow, darksandTaintedWater, - holostone, rocks, sporerocks, icerocks, cliffs, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster, - iceSnow, sandWater, darksandWater, duneRocks, sandRocks, moss, sporeMoss, shale, shaleRocks, shaleBoulder, sandBoulder, grass, salt, - metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, ignarock, magmarock, hotrock, snowrocks, rock, snowrock, saltRocks, + air, spawn, cliff, deepwater, water, taintedWater, tar, slag, stone, craters, charr, sand, darksand, dirt, ice, snow, darksandTaintedWater, + dacite, stoneWall, dirtWall, sporeWall, iceWall, daciteWall, sporePine, snowPine, pine, shrubs, whiteTree, whiteTreeDead, sporeCluster, + iceSnow, sandWater, darksandWater, duneWall, sandWall, moss, sporeMoss, shale, shaleWall, shaleBoulder, sandBoulder, daciteBoulder, grass, salt, + metalFloor, metalFloorDamaged, metalFloor2, metalFloor3, metalFloor5, basalt, magmarock, hotrock, snowWall, boulder, snowBoulder, saltWall, darkPanel1, darkPanel2, darkPanel3, darkPanel4, darkPanel5, darkPanel6, darkMetal, pebbles, tendrils, @@ -65,7 +64,7 @@ public class Blocks implements ContentList{ mechanicalPump, rotaryPump, thermalPump, conduit, pulseConduit, platedConduit, liquidRouter, liquidTank, liquidJunction, bridgeConduit, phaseConduit, //power - combustionGenerator, thermalGenerator, turbineGenerator, differentialGenerator, rtgGenerator, solarPanel, largeSolarPanel, thoriumReactor, + combustionGenerator, thermalGenerator, steamGenerator, differentialGenerator, rtgGenerator, solarPanel, largeSolarPanel, thoriumReactor, impactReactor, battery, batteryLarge, powerNode, powerNodeLarge, surgeTower, diode, //production @@ -78,12 +77,13 @@ public class Blocks implements ContentList{ duo, scatter, scorch, hail, arc, wave, lancer, swarmer, salvo, fuse, ripple, cyclone, spectre, meltdown, segment, parallax, //units + commandCenter, groundFactory, airFactory, navalFactory, additiveReconstructor, multiplicativeReconstructor, exponentialReconstructor, tetrativeReconstructor, repairPoint, resupplyPoint, //logic - message, switchBlock, microProcessor, logicProcessor, logicDisplay, memoryCell, + message, switchBlock, microProcessor, logicProcessor, hyperProcessor, largeLogicDisplay, logicDisplay, memoryCell, //campaign launchPad, launchPadLarge, @@ -101,13 +101,12 @@ public class Blocks implements ContentList{ hasShadow = false; } - public void drawBase(Tile tile){} - public void load(){} - public void init(){} - public boolean isHidden(){ - return true; - } + @Override public void drawBase(Tile tile){} + @Override public void load(){} + @Override public void init(){} + @Override public boolean isHidden(){ return true; } + @Override public TextureRegion[] variantRegions(){ if(variantRegions == null){ variantRegions = new TextureRegion[]{Core.atlas.find("clear")}; @@ -131,8 +130,8 @@ public class Blocks implements ContentList{ //Registers build blocks //no reference is needed here since they can be looked up by name later - for(int i = 1; i <= BuildBlock.maxSize; i++){ - new BuildBlock(i); + for(int i = 1; i <= ConstructBlock.maxSize; i++){ + new ConstructBlock(i); } deepwater = new Floor("deepwater"){{ @@ -211,9 +210,7 @@ public class Blocks implements ContentList{ cacheLayer = CacheLayer.slag; }}; - stone = new Floor("stone"){{ - - }}; + stone = new Floor("stone"); craters = new Floor("craters"){{ variants = 3; @@ -224,14 +221,14 @@ public class Blocks implements ContentList{ blendGroup = stone; }}; - ignarock = new Floor("ignarock"){{ - attributes.set(Attribute.water, -0.1f); + basalt = new Floor("basalt"){{ + attributes.set(Attribute.water, -0.25f); }}; hotrock = new Floor("hotrock"){{ attributes.set(Attribute.heat, 0.5f); - attributes.set(Attribute.water, -0.2f); - blendGroup = ignarock; + attributes.set(Attribute.water, -0.5f); + blendGroup = basalt; emitLight = true; lightRadius = 30f; @@ -240,9 +237,9 @@ public class Blocks implements ContentList{ magmarock = new Floor("magmarock"){{ attributes.set(Attribute.heat, 0.75f); - attributes.set(Attribute.water, -0.5f); + attributes.set(Attribute.water, -0.75f); updateEffect = Fx.magmasmoke; - blendGroup = ignarock; + blendGroup = basalt; emitLight = true; lightRadius = 60f; @@ -261,13 +258,13 @@ public class Blocks implements ContentList{ attributes.set(Attribute.oil, 1.5f); }}; + dirt = new Floor("dirt"); + ((ShallowLiquid)darksandTaintedWater).set(Blocks.taintedWater, Blocks.darksand); ((ShallowLiquid)sandWater).set(Blocks.water, Blocks.sand); ((ShallowLiquid)darksandWater).set(Blocks.water, Blocks.darksand); - holostone = new Floor("holostone"){{ - - }}; + dacite = new Floor("dacite"); grass = new Floor("grass"){{ attributes.set(Attribute.water, 0.1f); @@ -295,46 +292,49 @@ public class Blocks implements ContentList{ attributes.set(Attribute.water, 0.3f); }}; - cliffs = new StaticWall("cliffs"){{ - variants = 1; - fillsTile = false; - }}; - - rocks = new StaticWall("rocks"){{ + stoneWall = new StaticWall("stone-wall"){{ variants = 2; }}; - sporerocks = new StaticWall("sporerocks"){{ + sporeWall = new StaticWall("spore-wall"){{ variants = 2; }}; - rock = new Rock("rock"){{ + boulder = new Boulder("boulder"){{ variants = 2; }}; - snowrock = new Rock("snowrock"){{ + snowBoulder = new Boulder("snow-boulder"){{ variants = 2; }}; - icerocks = new StaticWall("icerocks"){{ + dirtWall = new StaticWall("dirt-wall"){{ + variants = 2; + }}; + + daciteWall = new StaticWall("dacite-wall"){{ + variants = 2; + }}; + + iceWall = new StaticWall("ice-wall"){{ variants = 2; iceSnow.asFloor().wall = this; }}; - snowrocks = new StaticWall("snowrocks"){{ + snowWall = new StaticWall("snow-wall"){{ variants = 2; }}; - duneRocks = new StaticWall("dunerocks"){{ + duneWall = new StaticWall("dune-wall"){{ + variants = 2; + basalt.asFloor().wall = this; + }}; + + sandWall = new StaticWall("sand-wall"){{ variants = 2; }}; - sandRocks = new StaticWall("sandrocks"){{ - variants = 2; - }}; - - saltRocks = new StaticWall("saltrocks"){{ - }}; + saltWall = new StaticWall("salt-wall"); sporePine = new StaticTree("spore-pine"){{ variants = 0; @@ -348,17 +348,13 @@ public class Blocks implements ContentList{ variants = 0; }}; - shrubs = new StaticWall("shrubs"){{ + shrubs = new StaticWall("shrubs"); - }}; + whiteTreeDead = new TreeBlock("white-tree-dead"); - whiteTreeDead = new TreeBlock("white-tree-dead"){{ - }}; + whiteTree = new TreeBlock("white-tree"); - whiteTree = new TreeBlock("white-tree"){{ - }}; - - sporeCluster = new Rock("spore-cluster"){{ + sporeCluster = new Boulder("spore-cluster"){{ variants = 3; }}; @@ -367,15 +363,19 @@ public class Blocks implements ContentList{ attributes.set(Attribute.oil, 1f); }}; - shaleRocks = new StaticWall("shalerocks"){{ + shaleWall = new StaticWall("shale-wall"){{ variants = 2; }}; - shaleBoulder = new Rock("shale-boulder"){{ + shaleBoulder = new Boulder("shale-boulder"){{ variants = 2; }}; - sandBoulder = new Rock("sand-boulder"){{ + sandBoulder = new Boulder("sand-boulder"){{ + variants = 2; + }}; + + daciteBoulder = new Boulder("dacite-boulder"){{ variants = 2; }}; @@ -388,7 +388,7 @@ public class Blocks implements ContentList{ sporeMoss = new Floor("spore-moss"){{ variants = 3; attributes.set(Attribute.spores, 0.3f); - wall = sporerocks; + wall = sporeWall; }}; metalFloor = new Floor("metal-floor"){{ @@ -507,7 +507,7 @@ public class Blocks implements ContentList{ siliconCrucible = new AttributeSmelter("silicon-crucible"){{ requirements(Category.crafting, with(Items.titanium, 120, Items.metaglass, 80, Items.plastanium, 35, Items.silicon, 60)); craftEffect = Fx.smeltsmoke; - outputItem = new ItemStack(Items.silicon, 6); + outputItem = new ItemStack(Items.silicon, 8); craftTime = 90f; size = 3; hasPower = true; @@ -516,7 +516,7 @@ public class Blocks implements ContentList{ itemCapacity = 30; boostScale = 0.15f; - consumes.items(new ItemStack(Items.coal, 3), new ItemStack(Items.sand, 6), new ItemStack(Items.pyratite, 1)); + consumes.items(new ItemStack(Items.coal, 4), new ItemStack(Items.sand, 6), new ItemStack(Items.pyratite, 1)); consumes.power(4f); }}; @@ -767,14 +767,14 @@ public class Blocks implements ContentList{ phaseWall = new Wall("phase-wall"){{ requirements(Category.defense, with(Items.phasefabric, 6)); health = 150 * wallHealthMultiplier; - flashWhite = deflect = true; + flashHit = deflect = true; }}; phaseWallLarge = new Wall("phase-wall-large"){{ requirements(Category.defense, ItemStack.mult(phaseWall.requirements, 4)); health = 150 * 4 * wallHealthMultiplier; size = 2; - flashWhite = deflect = true; + flashHit = deflect = true; }}; surgeWall = new Wall("surge-wall"){{ @@ -998,10 +998,12 @@ public class Blocks implements ContentList{ payloadConveyor = new PayloadConveyor("payload-conveyor"){{ requirements(Category.distribution, with(Items.graphite, 10, Items.copper, 20)); + canOverdrive = false; }}; payloadRouter = new PayloadRouter("payload-router"){{ requirements(Category.distribution, with(Items.graphite, 15, Items.copper, 20)); + canOverdrive = false; }}; //endregion @@ -1084,14 +1086,14 @@ public class Blocks implements ContentList{ powerNode = new PowerNode("power-node"){{ requirements(Category.power, with(Items.copper, 1, Items.lead, 3)); - maxNodes = 20; + maxNodes = 10; laserRange = 6; }}; powerNodeLarge = new PowerNode("power-node-large"){{ requirements(Category.power, with(Items.titanium, 5, Items.lead, 10, Items.silicon, 3)); size = 2; - maxNodes = 30; + maxNodes = 15; laserRange = 9.5f; }}; @@ -1130,32 +1132,32 @@ public class Blocks implements ContentList{ size = 2; }}; - turbineGenerator = new BurnerGenerator("turbine-generator"){{ + steamGenerator = new BurnerGenerator("steam-generator"){{ requirements(Category.power, with(Items.copper, 35, Items.graphite, 25, Items.lead, 40, Items.silicon, 30)); - powerProduction = 6f; + powerProduction = 5.5f; itemDuration = 90f; - consumes.liquid(Liquids.water, 0.05f); + consumes.liquid(Liquids.water, 0.06f); hasLiquids = true; size = 2; }}; differentialGenerator = new SingleTypeGenerator("differential-generator"){{ requirements(Category.power, with(Items.copper, 70, Items.titanium, 50, Items.lead, 100, Items.silicon, 65, Items.metaglass, 50)); - powerProduction = 17f; - itemDuration = 200f; + powerProduction = 18f; + itemDuration = 220f; hasLiquids = true; hasItems = true; size = 3; consumes.item(Items.pyratite).optional(true, false); - consumes.liquid(Liquids.cryofluid, 0.14f); + consumes.liquid(Liquids.cryofluid, 0.1f); }}; rtgGenerator = new DecayGenerator("rtg-generator"){{ requirements(Category.power, with(Items.lead, 100, Items.silicon, 75, Items.phasefabric, 25, Items.plastanium, 75, Items.thorium, 50)); size = 2; - powerProduction = 4f; - itemDuration = 500f; + powerProduction = 4.5f; + itemDuration = 60 * 15f; }}; solarPanel = new SolarGenerator("solar-panel"){{ @@ -1174,7 +1176,7 @@ public class Blocks implements ContentList{ size = 3; health = 700; itemDuration = 360f; - powerProduction = 14f; + powerProduction = 15f; consumes.item(Items.thorium); heating = 0.02f; consumes.liquid(Liquids.cryofluid, heating / coolantPower).update(false); @@ -1339,7 +1341,7 @@ public class Blocks implements ContentList{ unloader = new Unloader("unloader"){{ requirements(Category.effect, with(Items.titanium, 25, Items.silicon, 30)); - speed = 7f; + speed = 6f; }}; //endregion @@ -1479,14 +1481,14 @@ public class Blocks implements ContentList{ arc = new PowerTurret("arc"){{ requirements(Category.turret, with(Items.copper, 35, Items.lead, 50)); shootType = new LightningBulletType(){{ - damage = 21; + damage = 20; lightningLength = 25; collidesAir = false; }}; reloadTime = 35f; shootCone = 40f; rotatespeed = 8f; - powerUse = 5f; + powerUse = 4f; targetAir = false; range = 90f; shootEffect = Fx.lightningShoot; @@ -1502,14 +1504,14 @@ public class Blocks implements ContentList{ hasPower = true; size = 2; - force = 3f; + force = 4.5f; scaledForce = 5.5f; - range = 170f; - damage = 0.08f; + range = 110f; + damage = 0.1f; health = 160 * size * size; rotateSpeed = 10; - consumes.powerCond(3f, (TractorBeamEntity e) -> e.target != null); + consumes.powerCond(3f, (TractorBeamBuild e) -> e.target != null); }}; swarmer = new ItemTurret("swarmer"){{ @@ -1556,15 +1558,16 @@ public class Blocks implements ContentList{ }}; segment = new PointDefenseTurret("segment"){{ - requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phasefabric, 50)); + requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phasefabric, 40)); + health = 250 * size * size; + range = 140f; hasPower = true; - consumes.power(3f); + consumes.power(8f); size = 2; shootLength = 5f; - bulletDamage = 12f; - reloadTime = 25f; - health = 190 * size * size; + bulletDamage = 25f; + reloadTime = 10f; }}; fuse = new ItemTurret("fuse"){{ @@ -1607,6 +1610,7 @@ public class Blocks implements ContentList{ reloadTime = 60f; ammoEjectBack = 5f; ammoUseEffect = Fx.shellEjectBig; + ammoPerShot = 2; cooldown = 0.03f; velocityInaccuracy = 0.2f; restitution = 0.02f; @@ -1683,7 +1687,7 @@ public class Blocks implements ContentList{ activeSoundVolume = 2f; shootType = new ContinuousLaserBulletType(70){{ - length = 220f; + length = 200f; hitEffect = Fx.hitMeltdown; drawSize = 420f; @@ -1699,6 +1703,12 @@ public class Blocks implements ContentList{ //endregion //region units + commandCenter = new CommandCenter("command-center"){{ + requirements(Category.units, ItemStack.with(Items.copper, 200, Items.lead, 250, Items.silicon, 250, Items.graphite, 100)); + size = 2; + health = size * size * 55; + }}; + groundFactory = new UnitFactory("ground-factory"){{ requirements(Category.units, with(Items.copper, 50, Items.lead, 120, Items.silicon, 80)); plans = new UnitPlan[]{ @@ -1723,7 +1733,7 @@ public class Blocks implements ContentList{ navalFactory = new UnitFactory("naval-factory"){{ requirements(Category.units, with(Items.copper, 150, Items.lead, 130, Items.metaglass, 120)); plans = new UnitPlan[]{ - new UnitPlan(UnitTypes.risso, 60f * 30f, with(Items.silicon, 20, Items.metaglass, 25)), + new UnitPlan(UnitTypes.risso, 60f * 45f, with(Items.silicon, 20, Items.metaglass, 35)), }; size = 3; requiresWater = true; @@ -1750,11 +1760,11 @@ public class Blocks implements ContentList{ }}; multiplicativeReconstructor = new Reconstructor("multiplicative-reconstructor"){{ - requirements(Category.units, with(Items.lead, 650, Items.silicon, 350, Items.titanium, 350, Items.thorium, 650)); + requirements(Category.units, with(Items.lead, 650, Items.silicon, 450, Items.titanium, 350, Items.thorium, 650)); size = 5; consumes.power(6f); - consumes.items(with(Items.silicon, 130, Items.titanium, 80, Items.metaglass, 30)); + consumes.items(with(Items.silicon, 130, Items.titanium, 80, Items.metaglass, 40)); constructTime = 60f * 30f; @@ -1769,11 +1779,11 @@ public class Blocks implements ContentList{ }}; exponentialReconstructor = new Reconstructor("exponential-reconstructor"){{ - requirements(Category.units, with(Items.lead, 2000, Items.silicon, 750, Items.titanium, 950, Items.thorium, 450, Items.plastanium, 350, Items.phasefabric, 250)); + requirements(Category.units, with(Items.lead, 2000, Items.silicon, 1000, Items.titanium, 2000, Items.thorium, 750, Items.plastanium, 450, Items.phasefabric, 600)); size = 7; - consumes.power(12f); - consumes.items(with(Items.silicon, 250, Items.titanium, 500, Items.plastanium, 400)); + consumes.power(13f); + consumes.items(with(Items.silicon, 850, Items.titanium, 750, Items.plastanium, 650)); consumes.liquid(Liquids.cryofluid, 1f); constructTime = 60f * 60f * 1.5f; @@ -1781,15 +1791,17 @@ public class Blocks implements ContentList{ upgrades = new UnitType[][]{ {UnitTypes.zenith, UnitTypes.antumbra}, + {UnitTypes.spiroct, UnitTypes.arkyid}, + {UnitTypes.fortress, UnitTypes.scepter}, }; }}; tetrativeReconstructor = new Reconstructor("tetrative-reconstructor"){{ - requirements(Category.units, with(Items.lead, 4000, Items.silicon, 1500, Items.thorium, 500, Items.plastanium, 50, Items.phasefabric, 600, Items.surgealloy, 500)); + requirements(Category.units, with(Items.lead, 4000, Items.silicon, 3000, Items.thorium, 1000, Items.plastanium, 600, Items.phasefabric, 600, Items.surgealloy, 800)); size = 9; consumes.power(25f); - consumes.items(with(Items.silicon, 350, Items.plastanium, 450, Items.surgealloy, 400, Items.phasefabric, 150)); + consumes.items(with(Items.silicon, 1000, Items.plastanium, 600, Items.surgealloy, 500, Items.phasefabric, 350)); consumes.liquid(Liquids.cryofluid, 3f); constructTime = 60f * 60f * 4; @@ -1797,6 +1809,8 @@ public class Blocks implements ContentList{ upgrades = new UnitType[][]{ {UnitTypes.antumbra, UnitTypes.eclipse}, + {UnitTypes.arkyid, UnitTypes.toxopid}, + {UnitTypes.scepter, UnitTypes.reign}, }; }}; @@ -1812,6 +1826,8 @@ public class Blocks implements ContentList{ size = 2; range = 80f; + itemCapacity = 20; + ammoAmount = 5; consumes.item(Items.copper, 1); }}; @@ -1862,7 +1878,6 @@ public class Blocks implements ContentList{ //looked up by name, no ref needed new LegacyMechPad("legacy-mech-pad"); new LegacyUnitFactory("legacy-unit-factory"); - new LegacyCommandCenter("legacy-command-center"); //endregion //region campaign @@ -1898,7 +1913,7 @@ public class Blocks implements ContentList{ }}; microProcessor = new LogicBlock("micro-processor"){{ - requirements(Category.logic, with(Items.copper, 80, Items.lead, 50, Items.silicon, 60)); + requirements(Category.logic, with(Items.copper, 80, Items.lead, 50, Items.silicon, 50)); instructionsPerTick = 2; @@ -1906,19 +1921,24 @@ public class Blocks implements ContentList{ }}; logicProcessor = new LogicBlock("logic-processor"){{ - requirements(Category.logic, with(Items.lead, 320, Items.silicon, 140, Items.graphite, 80, Items.thorium, 70)); + requirements(Category.logic, with(Items.lead, 320, Items.silicon, 100, Items.graphite, 60, Items.thorium, 50)); - instructionsPerTick = 5; + instructionsPerTick = 8; - range = 16 * 10; + range = 8 * 22; size = 2; }}; - logicDisplay = new LogicDisplay("logic-display"){{ - requirements(Category.logic, with(Items.copper, 200, Items.lead, 120, Items.silicon, 100, Items.metaglass, 50)); + hyperProcessor = new LogicBlock("hyper-processor"){{ + requirements(Category.logic, with(Items.lead, 450, Items.silicon, 150, Items.thorium, 75, Items.surgealloy, 50)); - displaySize = 80; + consumes.liquid(Liquids.cryofluid, 0.08f); + hasLiquids = true; + + instructionsPerTick = 25; + + range = 8 * 42; size = 3; }}; @@ -1929,6 +1949,22 @@ public class Blocks implements ContentList{ memoryCapacity = 64; }}; + logicDisplay = new LogicDisplay("logic-display"){{ + requirements(Category.logic, with(Items.lead, 100, Items.silicon, 50, Items.metaglass, 50)); + + displaySize = 80; + + size = 3; + }}; + + largeLogicDisplay = new LogicDisplay("large-logic-display"){{ + requirements(Category.logic, with(Items.lead, 200, Items.silicon, 150, Items.metaglass, 100, Items.phasefabric, 75)); + + displaySize = 176; + + size = 6; + }}; + //endregion //region experimental diff --git a/core/src/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java index c4dac32493..a89b853c28 100644 --- a/core/src/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -163,7 +163,7 @@ public class Bullets implements ContentList{ width = 6f; height = 8f; hitEffect = Fx.flakExplosion; - splashDamage = 20f; + splashDamage = 22f; splashDamageRadius = 20f; fragBullet = flakGlassFrag; fragBullets = 5; @@ -199,7 +199,7 @@ public class Bullets implements ContentList{ hitEffect = Fx.flakExplosion; splashDamage = 18f; splashDamageRadius = 16f; - fragBullet = flakGlassFrag; + fragBullet = fragGlassFrag; fragBullets = 3; explodeRange = 20f; collidesGround = true; @@ -240,7 +240,7 @@ public class Bullets implements ContentList{ explodeRange = 20f; }}; - missileExplosive = new MissileBulletType(3f, 10){{ + missileExplosive = new MissileBulletType(3.7f, 10){{ width = 8f; height = 8f; shrinkY = 0f; @@ -255,7 +255,7 @@ public class Bullets implements ContentList{ statusDuration = 60f; }}; - missileIncendiary = new MissileBulletType(3f, 12){{ + missileIncendiary = new MissileBulletType(3.7f, 12){{ frontColor = Pal.lightishOrange; backColor = Pal.lightOrange; width = 7f; @@ -269,17 +269,17 @@ public class Bullets implements ContentList{ status = StatusEffects.burning; }}; - missileSurge = new MissileBulletType(3f, 20){{ + missileSurge = new MissileBulletType(3.7f, 20){{ width = 8f; height = 8f; shrinkY = 0f; drag = -0.01f; splashDamageRadius = 28f; - splashDamage = 40f; + splashDamage = 35f; hitEffect = Fx.blastExplosion; despawnEffect = Fx.blastExplosion; lightning = 2; - lightningLength = 14; + lightningLength = 10; }}; standardCopper = new BasicBulletType(2.5f, 9){{ @@ -433,6 +433,7 @@ public class Bullets implements ContentList{ hitSize = 7f; lifetime = 18f; pierce = true; + collidesAir = false; statusDuration = 60f * 4; shootEffect = Fx.shootSmallFlame; hitEffect = Fx.hitFlameSmall; @@ -447,6 +448,7 @@ public class Bullets implements ContentList{ hitSize = 7f; lifetime = 18f; pierce = true; + collidesAir = false; statusDuration = 60f * 6; shootEffect = Fx.shootPyraFlame; hitEffect = Fx.hitFlameSmall; diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index 9f097967ce..cba2d357ac 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -36,7 +36,7 @@ public class Fx{ TextureRegion region = unit.icon(Cicon.full); rect(region, e.x, e.y, - region.getWidth() * Draw.scl * scl, region.getHeight() * Draw.scl * scl, 180f); + region.width * Draw.scl * scl, region.height * Draw.scl * scl, 180f); }), @@ -52,10 +52,11 @@ public class Fx{ if(!(e.data instanceof Unit)) return; Unit select = e.data(); + boolean block = select instanceof BlockUnitc; mixcol(Pal.accent, 1f); alpha(e.fout()); - rect(select.type().icon(Cicon.full), select.x, select.y, select.rotation - 90f); + rect(block ? ((BlockUnitc)select).tile().block.icon(Cicon.full) : select.type().icon(Cicon.full), select.x, select.y, block ? 0f : select.rotation - 90f); alpha(1f); Lines.stroke(e.fslope() * 1f); Lines.square(select.x, select.y, e.fout() * select.hitSize * 2f, 45); @@ -514,6 +515,29 @@ public class Fx{ }), + sapExplosion = new Effect(25, e -> { + + color(Pal.sapBullet); + e.scaled(6, i -> { + stroke(3f * i.fout()); + Lines.circle(e.x, e.y, 3f + i.fin() * 80f); + }); + + color(Color.gray); + + randLenVectors(e.id, 9, 2f + 70 * e.finpow(), (x, y) -> { + Fill.circle(e.x + x, e.y + y, e.fout() * 4f + 0.5f); + }); + + color(Pal.sapBulletBack); + stroke(1f * e.fout()); + + randLenVectors(e.id + 1, 8, 1f + 60f * e.finpow(), (x, y) -> { + lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), 1f + e.fout() * 3f); + }); + + }), + massiveExplosion = new Effect(30, e -> { color(Pal.missileYellow); @@ -877,7 +901,7 @@ public class Fx{ }), - shootSmallFlame = new Effect(32f, e -> { + shootSmallFlame = new Effect(32f, 80f, e -> { color(Pal.lightFlame, Pal.darkFlame, Color.gray, e.fin()); randLenVectors(e.id, 8, e.finpow() * 60f, e.rotation, 10f, (x, y) -> { @@ -886,7 +910,7 @@ public class Fx{ }), - shootPyraFlame = new Effect(33f, e -> { + shootPyraFlame = new Effect(33f, 80f, e -> { color(Pal.lightPyraFlame, Pal.darkPyraFlame, Color.gray, e.fin()); randLenVectors(e.id, 10, e.finpow() * 70f, e.rotation, 10f, (x, y) -> { @@ -895,7 +919,7 @@ public class Fx{ }), - shootLiquid = new Effect(40f, e -> { + shootLiquid = new Effect(40f, 80f, e -> { color(e.color, Color.white, e.fout() / 6f + Mathf.randomSeedRange(e.id, 0.1f)); randLenVectors(e.id, 6, e.finpow() * 60f, e.rotation, 11f, (x, y) -> { diff --git a/core/src/mindustry/content/Items.java b/core/src/mindustry/content/Items.java index 285cc0a558..e16784a61b 100644 --- a/core/src/mindustry/content/Items.java +++ b/core/src/mindustry/content/Items.java @@ -84,7 +84,7 @@ public class Items implements ContentList{ }}; pyratite = new Item("pyratite", Color.valueOf("ffaa5f")){{ - flammability = 1.5f; + flammability = 1.4f; explosiveness = 0.4f; }}; } diff --git a/core/src/mindustry/content/StatusEffects.java b/core/src/mindustry/content/StatusEffects.java index 65814e5cb1..ab21c0eb87 100644 --- a/core/src/mindustry/content/StatusEffects.java +++ b/core/src/mindustry/content/StatusEffects.java @@ -53,7 +53,7 @@ public class StatusEffects implements ContentList{ init(() -> { trans(shocked, ((unit, time, newTime, result) -> { - unit.damagePierce(20f); + unit.damagePierce(14f); if(unit.team() == state.rules.waveTeam){ Events.fire(Trigger.shock); } @@ -121,13 +121,14 @@ public class StatusEffects implements ContentList{ boss = new StatusEffect("boss"){{ permanent = true; + damageMultiplier = 1.5f; + armorMultiplier = 1.5f; }}; shocked = new StatusEffect("shocked"); blasted = new StatusEffect("blasted"); - //no effects, just small amounts of damage. corroded = new StatusEffect("corroded"){{ damage = 0.1f; }}; diff --git a/core/src/mindustry/content/TechTree.java b/core/src/mindustry/content/TechTree.java index f5c6b19d3c..9900d75b0a 100644 --- a/core/src/mindustry/content/TechTree.java +++ b/core/src/mindustry/content/TechTree.java @@ -38,7 +38,6 @@ public class TechTree implements ContentList{ node(distributor); node(sorter, () -> { node(invertedSorter); - node(message); node(overflowGate, () -> { node(underflowGate); }); @@ -204,6 +203,28 @@ public class TechTree implements ContentList{ }); }); }); + + node(microProcessor, () -> { + node(switchBlock, () -> { + node(message, () -> { + node(logicDisplay, () -> { + node(largeLogicDisplay, () -> { + + }); + }); + + node(memoryCell, () -> { + + }); + }); + + node(logicProcessor, () -> { + node(hyperProcessor, () -> { + + }); + }); + }); + }); }); }); }); @@ -242,7 +263,7 @@ public class TechTree implements ContentList{ }); }); - node(turbineGenerator, () -> { + node(steamGenerator, () -> { node(thermalGenerator, () -> { node(differentialGenerator, () -> { node(thoriumReactor, () -> { @@ -340,10 +361,18 @@ public class TechTree implements ContentList{ }); node(groundFactory, () -> { + node(commandCenter, () -> { + + }); + node(dagger, () -> { node(mace, () -> { node(fortress, () -> { + node(scepter, () -> { + node(reign, () -> { + }); + }); }); }); @@ -358,7 +387,11 @@ public class TechTree implements ContentList{ node(crawler, () -> { node(atrax, () -> { node(spiroct, () -> { + node(arkyid, () -> { + node(toxopid, () -> { + }); + }); }); }); }); @@ -406,8 +439,6 @@ public class TechTree implements ContentList{ }); }); - //TODO research sectors - node(groundZero, () -> { node(frozenForest, Seq.with( new SectorComplete(groundZero), @@ -469,7 +500,7 @@ public class TechTree implements ContentList{ new SectorComplete(frozenForest), new Research(pneumaticDrill), new Research(powerNode), - new Research(turbineGenerator) + new Research(steamGenerator) ), () -> { node(fungalPass, Seq.with( new SectorComplete(stainedMountains), @@ -556,25 +587,20 @@ public class TechTree implements ContentList{ public ItemStack[] requirements; /** Requirements that have been fulfilled. Always the same length as the requirement array. */ public final ItemStack[] finishedRequirements; - /** Extra objectives needed to research this. TODO implement */ + /** Extra objectives needed to research this. */ public Seq objectives = new Seq<>(); /** Time required to research this content, in seconds. */ public float time; /** Nodes that depend on this node. */ public final Seq children = new Seq<>(); - /** Research progress, in seconds. */ - public float progress; TechNode(@Nullable TechNode ccontext, UnlockableContent content, ItemStack[] requirements, Runnable children){ - if(ccontext != null){ - ccontext.children.add(this); - } + if(ccontext != null) ccontext.children.add(this); this.parent = ccontext; this.content = content; this.requirements = requirements; this.depth = parent == null ? 0 : parent.depth + 1; - this.progress = Core.settings == null ? 0 : Core.settings.getFloat("research-" + content.name, 0f); this.time = Seq.with(requirements).mapFloat(i -> i.item.cost * i.amount).sum() * 10; this.finishedRequirements = new ItemStack[requirements.length]; @@ -599,7 +625,6 @@ public class TechTree implements ContentList{ /** Flushes research progress to settings. */ public void save(){ - Core.settings.put("research-" + content.name, progress); //save finished requirements by item type for(ItemStack stack : finishedRequirements){ diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 19b22422a5..1a570948bc 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -15,19 +15,16 @@ public class UnitTypes implements ContentList{ //region definitions //ground - public static @EntityDef({Unitc.class, Mechc.class}) UnitType mace, dagger, crawler, fortress, vestige, cataclyst; - - //ground + builder - public static @EntityDef({Unitc.class, Mechc.class, Builderc.class}) UnitType nova; + 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 pulsar, quasar; + public static @EntityDef({Unitc.class, Mechc.class, Builderc.class, Minerc.class, Commanderc.class}) UnitType nova, pulsar, quasar; //legs public static @EntityDef({Unitc.class, Legsc.class}) UnitType atrax; //legs + building - public static @EntityDef({Unitc.class, Legsc.class, Builderc.class}) UnitType spiroct, arkyid; + public static @EntityDef({Unitc.class, Legsc.class, Builderc.class}) UnitType spiroct, arkyid, toxopid; //air (no special traits) public static @EntityDef({Unitc.class}) UnitType flare, eclipse, horizon, zenith, antumbra; @@ -72,7 +69,6 @@ public class UnitTypes implements ContentList{ mace = new UnitType("mace"){{ speed = 0.4f; hitsize = 9f; - range = 10f; health = 500; armor = 4f; @@ -84,12 +80,11 @@ public class UnitTypes implements ContentList{ reload = 14f; recoil = 1f; ejectEffect = Fx.none; - bullet = new BulletType(3f, 30f){{ + bullet = new BulletType(3.9f, 30f){{ ammoMultiplier = 3f; hitSize = 7f; - lifetime = 42f; + lifetime = 12f; pierce = true; - drag = 0.05f; statusDuration = 60f * 4; shootEffect = Fx.shootSmallFlame; hitEffect = Fx.hitFlameSmall; @@ -108,6 +103,7 @@ public class UnitTypes implements ContentList{ targetAir = false; health = 790; armor = 9f; + mechFrontSway = 0.55f; weapons.add(new Weapon("artillery"){{ y = 1f; @@ -132,6 +128,120 @@ public class UnitTypes implements ContentList{ }}); }}; + scepter = new UnitType("scepter"){{ + speed = 0.35f; + hitsize = 20f; + rotateSpeed = 2.1f; + health = 9000; + armor = 11f; + canDrown = false; + mechFrontSway = 1f; + + mechStepParticles = true; + mechStepShake = 0.15f; + + weapons.add( + new Weapon("scepter-weapon"){{ + y = 1f; + x = 16f; + shootY = 8f; + reload = 50f; + recoil = 5f; + shake = 2f; + ejectEffect = Fx.shellEjectBig; + shootSound = Sounds.artillery; + shots = 3; + inaccuracy = 3f; + shotDelay = 4f; + + bullet = new BasicBulletType(7f, 45){{ + width = 11f; + height = 20f; + lifetime = 25f; + shootEffect = Fx.shootBig; + lightning = 2; + lightningLength = 6; + lightningColor = Pal.surge; + //standard bullet damage is far too much for lightning + lightningDamage = 25; + }}; + }}, + + new Weapon("mount-weapon"){{ + reload = 13f; + x = 8.5f; + y = 6f; + rotate = true; + ejectEffect = Fx.shellEjectSmall; + bullet = Bullets.standardCopper; + }}, + new Weapon("mount-weapon"){{ + reload = 16f; + x = 8.5f; + y = -7f; + rotate = true; + ejectEffect = Fx.shellEjectSmall; + bullet = Bullets.standardCopper; + }} + + ); + }}; + + reign = new UnitType("reign"){{ + speed = 0.35f; + hitsize = 26f; + rotateSpeed = 1.65f; + health = 24000; + armor = 14f; + mechStepParticles = true; + mechStepShake = 0.75f; + canDrown = false; + mechFrontSway = 1.9f; + mechSideSway = 0.6f; + + weapons.add( + new Weapon("reign-weapon"){{ + y = 1f; + x = 21.5f; + shootY = 11f; + reload = 9f; + recoil = 5f; + shake = 2f; + ejectEffect = Fx.shellEjectBig; + shootSound = Sounds.artillery; + + bullet = new BasicBulletType(13f, 55){{ + pierce = true; + width = 14f; + height = 33f; + lifetime = 15f; + shootEffect = Fx.shootBig; + fragVelocityMin = 0.4f; + + hitEffect = Fx.blastExplosion; + splashDamage = 18f; + splashDamageRadius = 30f; + + fragBullets = 2; + fragLifeMin = 0f; + fragCone = 30f; + + fragBullet = new BasicBulletType(9f, 15){{ + width = 10f; + height = 10f; + pierce = true; + + lifetime = 20f; + hitEffect = Fx.flakExplosion; + splashDamage = 15f; + splashDamageRadius = 15f; + }}; + }}; + }} + + ); + }}; + //endregion //region ground support @@ -144,6 +254,7 @@ public class UnitTypes implements ContentList{ health = 110f; buildSpeed = 0.8f; armor = 1f; + commandLimit = 8; abilities.add(new HealFieldAbility(10f, 60f * 4, 60f)); @@ -171,7 +282,7 @@ public class UnitTypes implements ContentList{ mineTier = 2; mineSpeed = 5f; - commandLimit = 8; + commandLimit = 15; abilities.add(new ShieldFieldAbility(20f, 40f, 60f * 5, 60f)); @@ -212,6 +323,9 @@ public class UnitTypes implements ContentList{ armor = 9f; landShake = 2f; + commandLimit = 24; + mechFrontSway = 0.55f; + speed = 0.4f; hitsize = 10f; @@ -219,7 +333,7 @@ public class UnitTypes implements ContentList{ mineSpeed = 7f; drawShields = false; - abilities.add(new ForceFieldAbility(60f, 0.2f, 300f, 60f * 7)); + abilities.add(new ForceFieldAbility(60f, 0.3f, 400f, 60f * 6)); weapons.add(new Weapon("beam-weapon"){{ shake = 2f; @@ -230,7 +344,7 @@ public class UnitTypes implements ContentList{ shootSound = Sounds.laser; bullet = new LaserBulletType(){{ - damage = 30f; + damage = 40f; recoil = 1f; sideAngle = 45f; sideWidth = 1f; @@ -248,8 +362,8 @@ public class UnitTypes implements ContentList{ speed = 0.85f; hitsize = 8f; - health = 170; - sway = 0.25f; + health = 180; + mechSideSway = 0.25f; range = 40f; weapons.add(new Weapon(){{ @@ -263,7 +377,7 @@ public class UnitTypes implements ContentList{ speed = 1f; splashDamageRadius = 55f; instantDisappear = true; - splashDamage = 45f; + splashDamage = 55f; killShooter = true; hittable = false; collidesAir = true; @@ -311,7 +425,6 @@ public class UnitTypes implements ContentList{ }}; spiroct = new UnitType("spiroct"){{ - itemCapacity = 200; speed = 0.4f; drag = 0.4f; hitsize = 12f; @@ -376,52 +489,218 @@ public class UnitTypes implements ContentList{ }}); }}; - //TODO implement arkyid = new UnitType("arkyid"){{ drag = 0.1f; speed = 0.5f; - hitsize = 9f; - health = 140; + hitsize = 21f; + health = 8000; + armor = 6f; + + rotateSpeed = 2.7f; legCount = 6; legMoveSpace = 1f; legPairOffset = 3; - legLength = 34f; - rotateShooting = false; + legLength = 30f; legExtension = -15; legBaseOffset = 10f; - landShake = 2f; + landShake = 1f; legSpeed = 0.1f; - legLengthScl = 1f; + legLengthScl = 0.96f; rippleScale = 2f; legSpeed = 0.2f; legSplashDamage = 32; legSplashRange = 30; + hovering = true; + allowLegStep = true; + visualElevation = 0.65f; + groundLayer = Layer.legUnit; + + BulletType sapper = new SapBulletType(){{ + sapStrength = 0.83f; + length = 55f; + damage = 34; + shootEffect = Fx.shootSmall; + hitColor = color = Color.valueOf("bf92f9"); + despawnEffect = Fx.none; + width = 0.55f; + lifetime = 30f; + knockback = -1f; + }}; + weapons.add( - new Weapon("missiles-mount"){{ - reload = 20f; + new Weapon("spiroct-weapon"){{ + reload = 9f; x = 4f; + y = 8f; rotate = true; - shake = 1f; - bullet = new MissileBulletType(2.7f, 12, "missile"){{ - width = 8f; - height = 8f; - shrinkY = 0f; - drag = -0.003f; - homingRange = 60f; - keepVelocity = false; - splashDamageRadius = 25f; - splashDamage = 10f; - lifetime = 120f; - trailColor = Color.gray; - backColor = Pal.bulletYellowBack; - frontColor = Pal.bulletYellow; - hitEffect = Fx.blastExplosion; - despawnEffect = Fx.blastExplosion; - weaveScale = 8f; - weaveMag = 2f; + bullet = sapper; + }}, + new Weapon("spiroct-weapon"){{ + reload = 15f; + x = 9f; + y = 6f; + rotate = true; + bullet = sapper; + }}, + new Weapon("spiroct-weapon"){{ + reload = 23f; + x = 14f; + y = 0f; + rotate = true; + bullet = sapper; + }}, + new Weapon("large-purple-mount"){{ + y = -7f; + x = 9f; + shootY = 7f; + reload = 45; + shake = 3f; + rotateSpeed = 2f; + ejectEffect = Fx.shellEjectSmall; + shootSound = Sounds.shootBig; + rotate = true; + occlusion = 8f; + recoil = 3f; + + bullet = new ArtilleryBulletType(2f, 12){{ + hitEffect = Fx.sapExplosion; + knockback = 0.8f; + lifetime = 70f; + width = height = 19f; + collidesTiles = true; + ammoMultiplier = 4f; + splashDamageRadius = 95f; + splashDamage = 65f; + backColor = Pal.sapBulletBack; + frontColor = lightningColor = Pal.sapBullet; + lightning = 3; + lightningLength = 10; + smokeEffect = Fx.shootBigSmoke2; + shake = 5f; + + status = StatusEffects.sapped; + statusDuration = 60f * 10; + }}; + }}); + }}; + + toxopid = new UnitType("toxopid"){{ + drag = 0.1f; + speed = 0.5f; + hitsize = 21f; + health = 23000; + armor = 14f; + + rotateSpeed = 1.9f; + + legCount = 8; + legMoveSpace = 0.8f; + legPairOffset = 3; + legLength = 75f; + legExtension = -20; + legBaseOffset = 8f; + landShake = 1f; + legSpeed = 0.1f; + legLengthScl = 0.93f; + rippleScale = 3f; + legSpeed = 0.19f; + + legSplashDamage = 80; + legSplashRange = 60; + + hovering = true; + allowLegStep = true; + visualElevation = 0.95f; + groundLayer = Layer.legUnit; + + weapons.add( + new Weapon("large-purple-mount"){{ + y = -5f; + x = 11f; + shootY = 7f; + reload = 30; + shake = 4f; + rotateSpeed = 2f; + ejectEffect = Fx.shellEjectSmall; + shootSound = Sounds.shootBig; + rotate = true; + occlusion = 12f; + recoil = 3f; + shots = 2; + spacing = 17f; + + bullet = new ShrapnelBulletType(){{ + length = 90f; + damage = 110f; + width = 25f; + serrationLenScl = 7f; + serrationSpaceOffset = 60f; + serrationFadeOffset = 0f; + serrations = 10; + serrationWidth = 6f; + fromColor = Pal.sapBullet; + toColor = Pal.sapBulletBack; + shootEffect = smokeEffect = Fx.sparkShoot; + }}; + }}); + + weapons.add(new Weapon("toxopid-cannon"){{ + y = -14f; + x = 0f; + shootY = 22f; + mirror = false; + reload = 210; + shake = 10f; + recoil = 10f; + rotateSpeed = 1f; + ejectEffect = Fx.shellEjectBig; + shootSound = Sounds.shootBig; + rotate = true; + occlusion = 30f; + + bullet = new ArtilleryBulletType(3f, 50){{ + hitEffect = Fx.sapExplosion; + knockback = 0.8f; + lifetime = 80f; + width = height = 25f; + collidesTiles = collides = true; + ammoMultiplier = 4f; + splashDamageRadius = 95f; + splashDamage = 90f; + backColor = Pal.sapBulletBack; + frontColor = lightningColor = Pal.sapBullet; + lightning = 5; + lightningLength = 20; + smokeEffect = Fx.shootBigSmoke2; + hitShake = 10f; + + status = StatusEffects.sapped; + statusDuration = 60f * 10; + + fragLifeMin = 0.3f; + fragBullets = 9; + + fragBullet = new ArtilleryBulletType(2.3f, 30){{ + hitEffect = Fx.sapExplosion; + knockback = 0.8f; + lifetime = 90f; + width = height = 20f; + collidesTiles = false; + splashDamageRadius = 80f; + splashDamage = 45f; + backColor = Pal.sapBulletBack; + frontColor = lightningColor = Pal.sapBullet; + lightning = 2; + lightningLength = 5; + smokeEffect = Fx.shootBigSmoke2; + hitShake = 5f; + + status = StatusEffects.sapped; + statusDuration = 60f * 10; + }}; }}; }}); }}; @@ -438,6 +717,8 @@ public class UnitTypes implements ContentList{ faceTarget = false; engineOffset = 5.5f; range = 140f; + crashDamageMultiplier = 4f; + weapons.add(new Weapon(){{ y = 0f; x = 2f; @@ -449,7 +730,7 @@ public class UnitTypes implements ContentList{ }}; horizon = new UnitType("horizon"){{ - health = 300; + health = 350; speed = 2f; accel = 0.08f; drag = 0.016f; @@ -458,19 +739,19 @@ public class UnitTypes implements ContentList{ engineOffset = 7.8f; range = 140f; faceTarget = false; - armor = 2f; + armor = 4f; weapons.add(new Weapon(){{ minShootVelocity = 0.75f; x = 3f; shootY = 0f; - reload = 12f; + reload = 11f; shootCone = 180f; ejectEffect = Fx.none; inaccuracy = 15f; ignoreRotation = true; shootSound = Sounds.none; - bullet = new BombBulletType(23f, 25f){{ + bullet = new BombBulletType(28f, 25f){{ width = 10f; height = 14f; hitEffect = Fx.flakExplosion; @@ -484,21 +765,21 @@ public class UnitTypes implements ContentList{ }}; zenith = new UnitType("zenith"){{ - health = 1000; - speed = 1.9f; + health = 700; + speed = 1.7f; accel = 0.04f; drag = 0.016f; flying = true; range = 140f; hitsize = 18f; lowAltitude = true; - armor = 6f; + armor = 5f; engineOffset = 12f; engineSize = 3f; weapons.add(new Weapon("zenith-missiles"){{ - reload = 32f; + reload = 40f; x = 7f; rotate = true; shake = 1f; @@ -534,21 +815,21 @@ public class UnitTypes implements ContentList{ rotateSpeed = 1.9f; flying = true; lowAltitude = true; - health = 9000; + health = 7000; armor = 9f; engineOffset = 21; engineSize = 5.3f; - hitsize = 58f; + hitsize = 56f; BulletType missiles = new MissileBulletType(2.7f, 10){{ width = 8f; height = 8f; shrinkY = 0f; drag = -0.01f; - splashDamageRadius = 40f; - splashDamage = 40f; + splashDamageRadius = 20f; + splashDamage = 30f; ammoMultiplier = 4f; - lifetime = 80f; + lifetime = 50f; hitEffect = Fx.blastExplosion; despawnEffect = Fx.blastExplosion; @@ -582,18 +863,18 @@ public class UnitTypes implements ContentList{ new Weapon("large-bullet-mount"){{ y = 2f; x = 10f; - shootY = 12f; - reload = 10; + shootY = 10f; + reload = 12; shake = 1f; rotateSpeed = 2f; ejectEffect = Fx.shellEjectSmall; shootSound = Sounds.shootBig; rotate = true; occlusion = 8f; - bullet = new BasicBulletType(7f, 60){{ + bullet = new BasicBulletType(7f, 50){{ width = 12f; height = 18f; - lifetime = 30f; + lifetime = 25f; shootEffect = Fx.shootBig; }}; }} @@ -607,13 +888,25 @@ public class UnitTypes implements ContentList{ rotateSpeed = 1f; flying = true; lowAltitude = true; - health = 18000; + health = 20000; engineOffset = 38; engineSize = 7.3f; hitsize = 58f; destructibleWreck = false; armor = 13f; + BulletType fragBullet = new FlakBulletType(4f, 5){{ + shootEffect = Fx.shootBig; + ammoMultiplier = 4f; + splashDamage = 42f; + splashDamageRadius = 25f; + collidesGround = true; + lifetime = 38f; + + status = StatusEffects.blasted; + statusDuration = 60f; + }}; + weapons.add( new Weapon("large-laser-mount"){{ shake = 4f; @@ -621,14 +914,14 @@ public class UnitTypes implements ContentList{ x = 18f; y = 5f; rotateSpeed = 2f; - reload = 50f; + reload = 45f; recoil = 4f; shootSound = Sounds.laser; occlusion = 20f; rotate = true; bullet = new LaserBulletType(){{ - damage = 75f; + damage = 90f; sideAngle = 20f; sideWidth = 1.5f; sideLength = 80f; @@ -638,50 +931,29 @@ public class UnitTypes implements ContentList{ colors = new Color[]{Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.white}; }}; }}, - new Weapon("missiles-mount"){{ + new Weapon("large-artillery"){{ x = 11f; y = 27f; rotateSpeed = 2f; - reload = 4f; + reload = 9f; shootSound = Sounds.flame; occlusion = 7f; rotate = true; recoil = 0.5f; - bullet = Bullets.pyraFlame; + bullet = fragBullet; }}, new Weapon("large-artillery"){{ y = -13f; x = 20f; - reload = 18f; + reload = 12f; ejectEffect = Fx.shellEjectSmall; rotateSpeed = 7f; shake = 1f; shootSound = Sounds.shoot; rotate = true; occlusion = 12f; - bullet = new ArtilleryBulletType(3.2f, 12){{ - trailMult = 0.8f; - hitEffect = Fx.massiveExplosion; - knockback = 1.5f; - lifetime = 140f; - height = 12f; - width = 12f; - collidesTiles = false; - ammoMultiplier = 4f; - splashDamageRadius = 60f; - splashDamage = 60f; - backColor = Pal.missileYellowBack; - frontColor = Pal.missileYellow; - trailEffect = Fx.artilleryTrail; - trailSize = 6f; - hitShake = 4f; - - shootEffect = Fx.shootBig2; - - status = StatusEffects.blasted; - statusDuration = 60f; - }}; + bullet = fragBullet; }}); }}; @@ -700,6 +972,7 @@ public class UnitTypes implements ContentList{ engineOffset = 5.7f; itemCapacity = 30; range = 50f; + isCounted = false; mineTier = 1; mineSpeed = 2.5f; @@ -720,6 +993,7 @@ public class UnitTypes implements ContentList{ engineOffset = 6.5f; hitsize = 8f; lowAltitude = true; + isCounted = false; mineTier = 2; mineSpeed = 3.5f; @@ -755,7 +1029,9 @@ public class UnitTypes implements ContentList{ }}; mega = new UnitType("mega"){{ + defaultController = RepairAI::new; + mineTier = 2; health = 500; speed = 1.8f; accel = 0.06f; @@ -766,7 +1042,8 @@ public class UnitTypes implements ContentList{ rotateShooting = false; hitsize = 15f; engineSize = 3f; - payloadCapacity = 4; + payloadCapacity = 4 * (8 * 8); + buildSpeed = 2.5f; weapons.add( new Weapon("heal-weapon-mount"){{ @@ -797,6 +1074,7 @@ public class UnitTypes implements ContentList{ rotateSpeed = 3.3f; immunities = ObjectSet.with(StatusEffects.wet); trailLength = 20; + rotateShooting = false; armor = 2f; @@ -852,6 +1130,7 @@ public class UnitTypes implements ContentList{ trailX = 5.5f; trailY = -4f; trailScl = 1.9f; + rotateShooting = false; abilities.add(new StatusFieldAbility(StatusEffects.overclock, 60f * 6, 60f * 6f, 60f)); @@ -888,6 +1167,7 @@ public class UnitTypes implements ContentList{ hitsize = 14f; armor = 6f; immunities = ObjectSet.with(StatusEffects.wet); + rotateShooting = false; trailLength = 22; trailX = 7f; @@ -1094,6 +1374,7 @@ public class UnitTypes implements ContentList{ hitsize = 0f; health = 1; rotateSpeed = 360f; + itemCapacity = 0; } @Override diff --git a/core/src/mindustry/content/Weathers.java b/core/src/mindustry/content/Weathers.java index 56f39995a8..6f59edbed0 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -5,7 +5,6 @@ import arc.graphics.*; import arc.graphics.Texture.*; import arc.graphics.g2d.*; import arc.math.*; -import arc.math.geom.*; import arc.util.*; import mindustry.ctype.*; import mindustry.gen.*; @@ -170,8 +169,8 @@ public class Weathers implements ContentList{ sandstorm = new Weather("sandstorm"){ TextureRegion region; - float yspeed = 0.3f, xspeed = 6f, size = 140f, padding = size, invDensity = 1500f; - Vec2 force = new Vec2(0.45f, 0.01f); + float size = 140f, padding = size, invDensity = 1500f, baseSpeed = 6.1f; + float force = 0.45f; Color color = Color.valueOf("f7cba4"); Texture noise; @@ -194,22 +193,26 @@ public class Weathers implements ContentList{ @Override public void update(WeatherState state){ + float speed = force * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; for(Unit unit : Groups.unit){ - unit.impulse(force.x * state.intensity(), force.y * state.intensity()); + unit.impulse(windx, windy); } } @Override public void drawOver(WeatherState state){ Draw.tint(color); + float speed = baseSpeed * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; float scale = 1f / 2000f; float scroll = Time.time() * scale; - Tmp.tr1.setTexture(noise); + Tmp.tr1.texture = noise; Core.camera.bounds(Tmp.r1); Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); - Tmp.tr1.scroll(-xspeed * scroll, -yspeed * scroll); + Tmp.tr1.scroll(-windx * scroll, windy * scroll); Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); rand.setSeed(0); @@ -224,8 +227,8 @@ public class Weathers implements ContentList{ float scl = rand.random(0.5f, 1f); float scl2 = rand.random(0.5f, 1f); float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); + float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); + float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); float alpha = rand.random(0.2f); x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); @@ -247,14 +250,13 @@ public class Weathers implements ContentList{ sporestorm = new Weather("sporestorm"){ TextureRegion region; - float yspeed = 1f, xspeed = 4f, size = 5f, padding = size, invDensity = 2000f; + float size = 5f, padding = size, invDensity = 2000f, baseSpeed = 4.3f, force = 0.28f; Color color = Color.valueOf("7457ce"); - Vec2 force = new Vec2(0.25f, 0.01f); Texture noise; { - attrs.set(Attribute.spores, 0.5f); - attrs.set(Attribute.light, -0.1f); + attrs.set(Attribute.spores, 1f); + attrs.set(Attribute.light, -0.15f); status = StatusEffects.sporeSlowed; statusGround = false; } @@ -269,9 +271,11 @@ public class Weathers implements ContentList{ @Override public void update(WeatherState state){ + float speed = force * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; for(Unit unit : Groups.unit){ - unit.impulse(force.x * state.intensity(), force.y * state.intensity()); + unit.impulse(windx, windy); } } @@ -285,12 +289,15 @@ public class Weathers implements ContentList{ Draw.alpha(state.opacity * 0.8f); Draw.tint(color); + float speed = baseSpeed * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; + float scale = 1f / 2000f; float scroll = Time.time() * scale; - Tmp.tr1.setTexture(noise); + Tmp.tr1.texture = noise; Core.camera.bounds(Tmp.r1); Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); - Tmp.tr1.scroll(-xspeed * scroll, -yspeed * scroll); + Tmp.tr1.scroll(-windx * scroll, windy * scroll); Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); rand.setSeed(0); @@ -306,8 +313,8 @@ public class Weathers implements ContentList{ float scl = rand.random(0.5f, 1f); float scl2 = rand.random(0.5f, 1f); float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); + float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); + float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); float alpha = rand.random(0.1f, 0.8f); x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 46e79e64cd..3a175a6819 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -182,7 +182,7 @@ public class Control implements ApplicationListener, Loadable{ app.post(() -> ui.hudfrag.showLand()); renderer.zoomIn(Fx.coreLand.lifetime); - app.post(() -> Fx.coreLand.at(core.getX(), core.getY(), 0, core.block())); + app.post(() -> Fx.coreLand.at(core.getX(), core.getY(), 0, core.block)); Time.run(Fx.coreLand.lifetime, () -> { Fx.launch.at(core); Effect.shake(5f, 5f, core); @@ -193,7 +193,7 @@ public class Control implements ApplicationListener, Loadable{ @Override public void loadAsync(){ - Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth(); + Draw.scl = 1f / Core.atlas.find("scale_marker").width; Core.input.setCatch(KeyCode.back, true); @@ -329,6 +329,7 @@ public class Control implements ApplicationListener, Loadable{ } public void playTutorial(){ + ui.showInfo("There is no tutorial yet."); //TODO implement //ui.showInfo("death"); /* @@ -428,19 +429,12 @@ public class Control implements ApplicationListener, Loadable{ //just a regular reminder if(!OS.prop("user.name").equals("anuke") && !OS.hasEnv("iknowwhatimdoing")){ app.post(() -> app.post(() -> { - ui.showStartupInfo("[accent]v6[] is currently in [accent]pre-alpha[].\n" + - "[lightgray]This means:[]\n" + - "- Content is missing\n" + - "- [scarlet]Mobile[] is not supported.\n" + - "- Most [scarlet]Unit AI[] does not work\n" + - "- Many units are [scarlet]missing[] or unfinished\n" + - "- The campaign is completely unfinished\n" + - "- Everything you see is subject to change or removal." + - "\n\nReport bugs or crashes on [accent]Github[]."); + ui.showStartupInfo("@indevpopup"); })); } - //play tutorial on stop + //play tutorial on start + //TODO no tutorial right now if(!settings.getBool("playedtutorial", false)){ //Core.app.post(() -> Core.app.post(this::playTutorial)); } diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 77741767a9..099cea086f 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -15,7 +15,7 @@ import mindustry.type.*; import mindustry.type.Weather.*; import mindustry.world.*; import mindustry.world.blocks.*; -import mindustry.world.blocks.BuildBlock.*; +import mindustry.world.blocks.ConstructBlock.*; import mindustry.world.blocks.storage.CoreBlock.*; import java.util.*; @@ -41,9 +41,9 @@ public class Logic implements ApplicationListener{ //skip null entities or un-rebuildables, for obvious reasons; also skip client since they can't modify these requests if(tile.build == null || !tile.block().rebuildable || net.client()) return; - if(block instanceof BuildBlock){ + if(block instanceof ConstructBlock){ - BuildEntity entity = tile.bc(); + ConstructBuild entity = tile.bc(); //update block to reflect the fact that something was being constructed if(entity.cblock != null && entity.cblock.synthetic()){ @@ -187,7 +187,7 @@ public class Logic implements ApplicationListener{ //campaign maps do not have a 'win' state! if(state.isCampaign()){ //gameover only when cores are dead - if(!state.rules.attackMode && state.teams.playerCores().size == 0 && !state.gameOver){ + if(state.teams.playerCores().size == 0 && !state.gameOver){ state.gameOver = true; Events.fire(new GameOverEvent(state.rules.waveTeam)); } @@ -245,7 +245,8 @@ public class Logic implements ApplicationListener{ if(entry.cooldown < 0 && !entry.weather.isActive()){ float duration = Mathf.random(entry.minDuration, entry.maxDuration); entry.cooldown = duration + Mathf.random(entry.minFrequency, entry.maxFrequency); - Call.createWeather(entry.weather, entry.intensity, duration); + Tmp.v1.setToRandomDirection(); + Call.createWeather(entry.weather, entry.intensity, duration, Tmp.v1.x, Tmp.v1.y); } } } @@ -302,6 +303,11 @@ public class Logic implements ApplicationListener{ }); } + @Remote(called = Loc.both) + public static void updateGameOver(Team winner){ + state.gameOver = true; + } + @Remote(called = Loc.both) public static void gameOver(Team winner){ state.stats.wavesLasted = state.wave; @@ -320,6 +326,10 @@ public class Logic implements ApplicationListener{ Events.fire(Trigger.update); universe.updateGlobal(); + if(Core.settings.modified() && !state.isPlaying()){ + Core.settings.forceSave(); + } + if(state.isGame()){ if(!net.client()){ state.enemies = Groups.unit.count(u -> u.team() == state.rules.waveTeam && u.type().isCounted); diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index 2262e2248b..2c472e0e61 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -338,6 +338,8 @@ public class NetClient implements ApplicationListener{ @Remote(variants = Variant.both) public static void setRules(Rules rules){ state.rules = rules; + //campaign is not valid in multiplayer + state.rules.sector = null; } @Remote(variants = Variant.both) @@ -366,6 +368,9 @@ public class NetClient implements ApplicationListener{ @Remote public static void playerDisconnect(int playerid){ + if(netClient != null){ + netClient.addRemovedEntity(playerid); + } Groups.player.removeByID(playerid); } @@ -437,13 +442,14 @@ public class NetClient implements ApplicationListener{ } @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) - public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, short coreDataLen, byte[] coreData){ + public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, boolean gameOver, short coreDataLen, byte[] coreData){ try{ if(wave > state.wave){ state.wave = wave; Events.fire(new WaveEvent()); } + state.gameOver = gameOver; state.wavetime = waveTime; state.wave = wave; state.enemies = enemies; @@ -558,6 +564,22 @@ public class NetClient implements ApplicationListener{ //limit to 10 to prevent buffer overflows int usedRequests = Math.min(player.builder().plans().size, 10); + int totalLength = 0; + + //prevent buffer overflow by checking config length + for(int i = 0; i < usedRequests; i++){ + BuildPlan plan = player.builder().plans().get(i); + if(plan.config instanceof byte[]){ + int length = ((byte[])plan.config).length; + totalLength += length; + } + + if(totalLength > 2048){ + usedRequests = i + 1; + break; + } + } + requests = new BuildPlan[usedRequests]; for(int i = 0; i < usedRequests; i++){ requests[i] = player.builder().plans().get(i); @@ -565,8 +587,11 @@ public class NetClient implements ApplicationListener{ } Unit unit = player.dead() ? Nulls.unit : player.unit(); + int uid = player.dead() ? -1 : unit.id; - Call.clientSnapshot(lastSent++, + Call.clientSnapshot( + lastSent++, + uid, player.dead(), unit.x, unit.y, player.unit().aimX(), player.unit().aimY(), @@ -577,7 +602,8 @@ public class NetClient implements ApplicationListener{ player.boosting, player.shooting, ui.chatfrag.shown(), control.input.isBuilding, requests, Core.camera.position.x, Core.camera.position.y, - Core.camera.width * viewScale, Core.camera.height * viewScale); + Core.camera.width * viewScale, Core.camera.height * viewScale + ); } if(timer.get(1, 60)){ diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index a433e55a1d..6174798e96 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -34,7 +34,8 @@ import static arc.util.Log.*; import static mindustry.Vars.*; public class NetServer implements ApplicationListener{ - private static final int maxSnapshotSize = 430, timerBlockSync = 0; + /** note that snapshots are compressed, so the max snapshot size here is above the typical UDP safe limit */ + private static final int maxSnapshotSize = 800, timerBlockSync = 0; private static final float serverSyncTime = 12, blockSyncTime = 60 * 6; private static final FloatBuffer fbuffer = FloatBuffer.allocate(20); private static final Vec2 vector = new Vec2(); @@ -173,7 +174,7 @@ public class NetServer implements ApplicationListener{ return; } - boolean preventDuplicates = headless && netServer.admins.getStrict(); + boolean preventDuplicates = headless && netServer.admins.isStrict(); if(preventDuplicates){ if(Groups.player.contains(p -> p.name.trim().equalsIgnoreCase(packet.name.trim()))){ @@ -370,6 +371,11 @@ public class NetServer implements ApplicationListener{ return; } + if(currentlyKicking[0] != null){ + player.sendMessage("[scarlet]A vote is already in progress."); + return; + } + if(args.length == 0){ StringBuilder builder = new StringBuilder(); builder.append("[orange]Players to kick: \n"); @@ -384,9 +390,7 @@ public class NetServer implements ApplicationListener{ int id = Strings.parseInt(args[0].substring(1)); found = Groups.player.find(p -> p.id() == id); }else{ - found = Groups.player.find(p -> { - return p.name.equalsIgnoreCase(args[0]); - }); + found = Groups.player.find(p -> p.name.equalsIgnoreCase(args[0])); } if(found != null){ @@ -481,7 +485,7 @@ public class NetServer implements ApplicationListener{ data.stream = new ByteArrayInputStream(stream.toByteArray()); player.con.sendStream(data); - Log.debug("Packed @ compressed bytes of world data.", stream.size()); + Log.debug("Packed @ bytes of world data.", stream.size()); } public void addPacketHandler(String type, Cons2 handler){ @@ -526,11 +530,16 @@ public class NetServer implements ApplicationListener{ public static void serverPacketUnreliable(Player player, String type, String contents){ serverPacketReliable(player, type, contents); } + + private static boolean invalid(float f){ + return Float.isInfinite(f) || Float.isNaN(f); + } @Remote(targets = Loc.client, unreliable = true) public static void clientSnapshot( Player player, int snapshotID, + int unitID, boolean dead, float x, float y, float pointerX, float pointerY, @@ -544,7 +553,17 @@ public class NetServer implements ApplicationListener{ NetConnection con = player.con; if(con == null || snapshotID < con.lastReceivedClientSnapshot) return; - boolean verifyPosition = !player.dead() && netServer.admins.getStrict() && headless; + //validate coordinates just in case + if(invalid(x)) x = 0f; + if(invalid(y)) y = 0f; + if(invalid(xVelocity)) xVelocity = 0f; + if(invalid(yVelocity)) yVelocity = 0f; + if(invalid(pointerX)) pointerX = 0f; + if(invalid(pointerY)) pointerY = 0f; + if(invalid(rotation)) rotation = 0f; + if(invalid(baseRotation)) baseRotation = 0f; + + boolean verifyPosition = netServer.admins.isStrict() && headless; if(con.lastReceivedClientTime == 0) con.lastReceivedClientTime = Time.millis() - 16; @@ -562,7 +581,6 @@ public class NetServer implements ApplicationListener{ boosting = false; } - //TODO these need to be assigned elsewhere player.mouseX = pointerX; player.mouseY = pointerY; player.typing = chatting; @@ -613,45 +631,41 @@ public class NetServer implements ApplicationListener{ Unit unit = player.unit(); long elapsed = Time.timeSinceMillis(con.lastReceivedClientTime); - float maxSpeed = (boosting ? player.unit().type().boostMultiplier : 1f) * player.unit().type().speed; + float maxSpeed = ((player.unit().type().canBoost && player.unit().isFlying()) ? player.unit().type().boostMultiplier : 1f) * player.unit().type().speed; if(unit.isGrounded()){ maxSpeed *= unit.floorSpeedMultiplier(); } - unit.vel.set(xVelocity, yVelocity).limit(maxSpeed); + float maxMove = elapsed / 1000f * 60f * maxSpeed * 1.1f; - if(con.lastUnit != unit){ - con.lastUnit = unit; - con.lastPosition.set(unit); - } - - //if the player think they're dead their position should be ignored - if(dead){ - x = unit.x; - y = unit.y; - } - - vector.set(x, y).sub(con.lastPosition); - vector.limit(maxMove); - - float prevx = unit.x, prevy = unit.y; - unit.set(con.lastPosition); - if(!unit.isFlying()){ - unit.move(vector.x, vector.y); - }else{ - unit.trns(vector.x, vector.y); - } - - //set last position after movement - con.lastPosition.set(unit); + //ignore the position if the player thinks they're dead, or the unit is wrong + boolean ignorePosition = dead || unit.id != unitID; float newx = unit.x, newy = unit.y; - if(!verifyPosition){ - unit.set(prevx, prevy); - newx = x; - newy = y; - }else if(!Mathf.within(x, y, newx, newy, correctDist) && !dead){ - Call.setPosition(player.con, newx, newy); //teleport and correct position when necessary + if(!ignorePosition){ + unit.vel.set(xVelocity, yVelocity).limit(maxSpeed); + + vector.set(x, y).sub(unit); + vector.limit(maxMove); + + float prevx = unit.x, prevy = unit.y; + //unit.set(con.lastPosition); + if(!unit.isFlying()){ + unit.move(vector.x, vector.y); + }else{ + unit.trns(vector.x, vector.y); + } + + newx = unit.x; + newy = unit.y; + + if(!verifyPosition){ + unit.set(prevx, prevy); + newx = x; + newy = y; + }else if(!Mathf.within(x, y, newx, newy, correctDist)){ + Call.setPosition(player.con, newx, newy); //teleport and correct position when necessary + } } //write sync data to the buffer @@ -681,8 +695,8 @@ public class NetServer implements ApplicationListener{ public static void adminRequest(Player player, Player other, AdminAction action){ if(!player.admin){ - Log.warn("ACCESS DENIED: Player @ / @ attempted to perform admin action without proper security access.", - player.name, player.con.address); + Log.warn("ACCESS DENIED: Player @ / @ attempted to perform admin action '@' on '@' without proper security access.", + player.name, player.con.address, action.name(), other == null ? null : other.name); return; } @@ -735,7 +749,7 @@ public class NetServer implements ApplicationListener{ } public boolean isWaitingForPlayers(){ - if(state.rules.pvp){ + if(state.rules.pvp && !state.gameOver){ int used = 0; for(TeamData t : state.teams.getActive()){ if(Groups.player.count(p -> p.team() == t.team) > 0){ @@ -761,6 +775,10 @@ public class NetServer implements ApplicationListener{ } if(state.isGame() && net.server()){ + if(state.rules.pvp){ + state.serverPaused = isWaitingForPlayers(); + } + sync(); } } @@ -791,10 +809,10 @@ public class NetServer implements ApplicationListener{ short sent = 0; for(Building entity : Groups.build){ - if(!entity.block().sync) continue; + if(!entity.block.sync) continue; sent ++; - dataStream.writeInt(entity.tile().pos()); + dataStream.writeInt(entity.pos()); entity.writeAll(Writes.get(dataStream)); if(syncStream.size() > maxSnapshotSize){ @@ -820,7 +838,7 @@ public class NetServer implements ApplicationListener{ dataStream.writeByte(cores.size); for(CoreBuild entity : cores){ - dataStream.writeInt(entity.tile().pos()); + dataStream.writeInt(entity.tile.pos()); entity.items.write(Writes.get(dataStream)); } @@ -828,7 +846,7 @@ public class NetServer implements ApplicationListener{ byte[] stateBytes = syncStream.toByteArray(); //write basic state data. - Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, (short)stateBytes.length, net.compressSnapshot(stateBytes)); + Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, state.gameOver, (short)stateBytes.length, net.compressSnapshot(stateBytes)); viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY); diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index dc5d350a0f..ad7806267c 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -28,6 +28,8 @@ public class Renderer implements ApplicationListener{ public PlanetRenderer planets; public FrameBuffer effectBuffer = new FrameBuffer(); + public float laserOpacity = 1f; + private Bloom bloom; private FxProcessor fx = new FxProcessor(); private Color clearColor = new Color(0f, 0f, 0f, 1f); @@ -59,8 +61,10 @@ public class Renderer implements ApplicationListener{ @Override public void update(){ Color.white.set(1f, 1f, 1f, 1f); + Gl.clear(Gl.stencilBufferBit); camerascale = Mathf.lerpDelta(camerascale, targetscale, 0.1f); + laserOpacity = Core.settings.getInt("lasersopacity") / 100f; if(landTime > 0){ landTime -= Time.delta; @@ -185,6 +189,8 @@ public class Renderer implements ApplicationListener{ } public void draw(){ + Events.fire(Trigger.preDraw); + camera.update(); if(Float.isNaN(camera.position.x) || Float.isNaN(camera.position.y)){ @@ -205,6 +211,8 @@ public class Renderer implements ApplicationListener{ Draw.sort(true); + Events.fire(Trigger.draw); + if(pixelator.enabled()){ pixelator.register(); } @@ -254,6 +262,8 @@ public class Renderer implements ApplicationListener{ Draw.reset(); Draw.flush(); Draw.sort(false); + + Events.fire(Trigger.postDraw); } private void drawBackground(){ @@ -265,9 +275,9 @@ public class Renderer implements ApplicationListener{ float fract = landTime / Fx.coreLand.lifetime; Building entity = player.closestCore(); - TextureRegion reg = entity.block().icon(Cicon.full); + TextureRegion reg = entity.block.icon(Cicon.full); float scl = Scl.scl(4f) / camerascale; - float s = reg.getWidth() * Draw.scl * scl * 4f * fract; + float s = reg.width * Draw.scl * scl * 4f * fract; Draw.color(Pal.lightTrail); Draw.rect("circle-shadow", entity.getX(), entity.getY(), s, s); @@ -279,7 +289,7 @@ public class Renderer implements ApplicationListener{ Draw.color(); Draw.mixcol(Color.white, fract); - Draw.rect(reg, entity.getX(), entity.getY(), reg.getWidth() * Draw.scl * scl, reg.getHeight() * Draw.scl * scl, fract * 135f); + Draw.rect(reg, entity.getX(), entity.getY(), reg.width * Draw.scl * scl, reg.height * Draw.scl * scl, fract * 135f); Draw.reset(); } diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index 0d5a08436a..536e89a9b2 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -128,6 +128,8 @@ public class UI implements ApplicationListener, Loadable{ public void update(){ if(disableUI || Core.scene == null) return; + Events.fire(Trigger.uiDrawBegin); + Core.scene.act(); Core.scene.draw(); @@ -143,6 +145,8 @@ public class UI implements ApplicationListener, Loadable{ control.tutorial.draw(); Draw.flush(); } + + Events.fire(Trigger.uiDrawEnd); } @Override @@ -221,12 +225,15 @@ public class UI implements ApplicationListener, Loadable{ } public TextureRegionDrawable getIcon(String name){ - if(Icon.icons.containsKey(name)){ - return Icon.icons.get(name); - } + if(Icon.icons.containsKey(name)) return Icon.icons.get(name); return Core.atlas.getDrawable("error"); } + public TextureRegionDrawable getIcon(String name, String def){ + if(Icon.icons.containsKey(name)) return Icon.icons.get(name); + return getIcon(def); + } + public void loadAnd(Runnable call){ loadAnd("@loading", call); } @@ -484,7 +491,7 @@ public class UI implements ApplicationListener, Loadable{ Table t = new Table(); t.touchable = Touchable.disabled; t.background(Styles.black3).margin(8f) - .add(text).style(Styles.outlineLabel); + .add(text).style(Styles.outlineLabel).labelAlign(Align.center); t.update(() -> t.setPosition(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f, Align.center)); t.actions(Actions.fadeOut(3, Interp.pow4In), Actions.remove()); Core.scene.add(t); diff --git a/core/src/mindustry/core/World.java b/core/src/mindustry/core/World.java index 9dea5f0e35..2ec1b4dec6 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -105,7 +105,9 @@ public class World{ public Tile tileBuilding(int x, int y){ Tile tile = tiles.get(x, y); if(tile == null) return null; - if(tile.build != null) return tile.build.tile(); + if(tile.build != null){ + return tile.build.tile(); + } return tile; } @@ -185,16 +187,12 @@ public class World{ continue; } - tile.updateOcclusion(); - if(tile.build != null){ tile.build.updateProximity(); } } - if(!headless){ - addDarkness(tiles); - } + addDarkness(tiles); Groups.resize(-finalWorldBounds, -finalWorldBounds, tiles.width * tilesize + finalWorldBounds * 2, tiles.height * tilesize + finalWorldBounds * 2); @@ -317,7 +315,7 @@ public class World{ public void notifyChanged(Tile tile){ if(!generating){ - Core.app.post(() -> Events.fire(new BuildinghangeEvent(tile))); + Core.app.post(() -> Events.fire(new TileChangeEvent(tile))); } } diff --git a/core/src/mindustry/editor/EditorTile.java b/core/src/mindustry/editor/EditorTile.java index 3ad8cf49d8..9cdda58104 100644 --- a/core/src/mindustry/editor/EditorTile.java +++ b/core/src/mindustry/editor/EditorTile.java @@ -39,13 +39,6 @@ public class EditorTile extends Tile{ super.setFloor(type); } - @Override - public void updateOcclusion(){ - super.updateOcclusion(); - - ui.editor.editor.renderer().updatePoint(x, y); - } - @Override public void setBlock(Block type, Team team, int rotation){ if(state.isGame()){ @@ -85,8 +78,12 @@ public class EditorTile extends Tile{ } @Override - protected void preChanged(){ - super.preChanged(); + protected void fireChanged(){ + if(state.isGame()){ + super.fireChanged(); + }else{ + ui.editor.editor.renderer().updatePoint(x, y); + } } @Override @@ -112,7 +109,7 @@ public class EditorTile extends Tile{ if(block.hasEntity()){ build = entityprov.get().init(this, team, false, rotation); - build.cons(new ConsumeModule(build)); + build.cons = new ConsumeModule(build); if(block.hasItems) build.items = new ItemModule(); if(block.hasLiquids) build.liquids(new LiquidModule()); if(block.hasPower) build.power(new PowerModule()); diff --git a/core/src/mindustry/editor/EditorTool.java b/core/src/mindustry/editor/EditorTool.java index 47053049e2..b3a84f538e 100644 --- a/core/src/mindustry/editor/EditorTool.java +++ b/core/src/mindustry/editor/EditorTool.java @@ -1,6 +1,7 @@ package mindustry.editor; import arc.func.*; +import arc.input.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; @@ -10,8 +11,8 @@ import mindustry.game.*; import mindustry.world.*; public enum EditorTool{ - zoom, - pick{ + zoom(KeyCode.v), + pick(KeyCode.i){ public void touched(MapEditor editor, int x, int y){ if(!Structs.inBounds(x, y, editor.width(), editor.height())) return; @@ -19,7 +20,7 @@ public enum EditorTool{ editor.drawBlock = tile.block() == Blocks.air ? tile.overlay() == Blocks.air ? tile.floor() : tile.overlay() : tile.block(); } }, - line("replace", "orthogonal"){ + line(KeyCode.l, "replace", "orthogonal"){ @Override public void touchedLine(MapEditor editor, int x1, int y1, int x2, int y2){ @@ -43,7 +44,7 @@ public enum EditorTool{ }); } }, - pencil("replace", "square", "drawteams"){ + pencil(KeyCode.b, "replace", "square", "drawteams"){ { edit = true; draggable = true; @@ -67,7 +68,7 @@ public enum EditorTool{ } }, - eraser("eraseores"){ + eraser(KeyCode.e, "eraseores"){ { edit = true; draggable = true; @@ -86,7 +87,7 @@ public enum EditorTool{ }); } }, - fill("replaceall", "fillteams"){ + fill(KeyCode.g, "replaceall", "fillteams"){ { edit = true; } @@ -205,7 +206,7 @@ public enum EditorTool{ } } }, - spray("replace"){ + spray(KeyCode.r, "replace"){ final double chance = 0.012; { @@ -231,8 +232,12 @@ public enum EditorTool{ } }; + public static final EditorTool[] all = values(); + /** All the internal alternate placement modes of this tool. */ public final String[] altModes; + /** Key to activate this tool. */ + public KeyCode key = KeyCode.unset; /** The current alternate placement mode. -1 is the standard mode, no changes.*/ public int mode = -1; /** Whether this tool causes canvas changes when touched.*/ @@ -244,10 +249,20 @@ public enum EditorTool{ this(new String[]{}); } + EditorTool(KeyCode code){ + this(new String[]{}); + this.key = code; + } + EditorTool(String... altModes){ this.altModes = altModes; } + EditorTool(KeyCode code, String... altModes){ + this.altModes = altModes; + this.key = code; + } + public void touched(MapEditor editor, int x, int y){} public void touchedLine(MapEditor editor, int x1, int y1, int x2, int y2){} diff --git a/core/src/mindustry/editor/MapEditor.java b/core/src/mindustry/editor/MapEditor.java index a41856aaf1..bbef2125ed 100644 --- a/core/src/mindustry/editor/MapEditor.java +++ b/core/src/mindustry/editor/MapEditor.java @@ -126,7 +126,7 @@ public class MapEditor{ x = Mathf.clamp(x, (drawBlock.size - 1) / 2, width() - drawBlock.size / 2 - 1); y = Mathf.clamp(y, (drawBlock.size - 1) / 2, height() - drawBlock.size / 2 - 1); if(!hasOverlap(x, y)){ - tile(x, y).setBlock(drawBlock, drawTeam, 0); + tile(x, y).setBlock(drawBlock, drawTeam, rotation); } }else{ boolean isFloor = drawBlock.isFloor() && drawBlock != Blocks.air; diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 1805df28d0..0cf8477691 100644 --- a/core/src/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -254,14 +254,9 @@ public class MapEditorDialog extends Dialog implements Disposable{ "height", editor.height() )); world.endMapLoad(); - //add entities so they update. is this really needed? - for(Tile tile : world.tiles){ - if(tile.build != null){ - tile.build.add(); - } - } player.set(world.width() * tilesize/2f, world.height() * tilesize/2f); player.clearUnit(); + Groups.unit.clear(); logic.play(); }); } @@ -576,22 +571,20 @@ public class MapEditorDialog extends Dialog implements Disposable{ if(Core.input.ctrl()){ //alt mode select - for(int i = 0; i < view.getTool().altModes.length + 1; i++){ - if(Core.input.keyTap(KeyCode.valueOf("num" + (i + 1)))){ - view.getTool().mode = i - 1; + for(int i = 0; i < view.getTool().altModes.length; i++){ + if(i + 1 < KeyCode.numbers.length && Core.input.keyTap(KeyCode.numbers[i + 1])){ + view.getTool().mode = i; } } }else{ - //tool select - for(int i = 0; i < EditorTool.values().length; i++){ - if(Core.input.keyTap(KeyCode.valueOf("num" + (i + 1)))){ - view.setTool(EditorTool.values()[i]); + for(EditorTool tool : EditorTool.all){ + if(Core.input.keyTap(tool.key)){ + view.setTool(tool); break; } } } - if(Core.input.keyTap(KeyCode.escape)){ if(!menu.isShown()){ menu.show(); @@ -619,7 +612,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ for(int x = 0; x < editor.width(); x++){ for(int y = 0; y < editor.height(); y++){ Tile tile = editor.tile(x, y); - if(tile.block().breakable && tile.block() instanceof Rock){ + if(tile.block().breakable && tile.block() instanceof Boulder){ tile.setBlock(Blocks.air); editor.renderer().updatePoint(x, y); } diff --git a/core/src/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java index c2869a664c..a8ceb58d79 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -275,6 +275,8 @@ public class MapGenerateDialog extends BaseDialog{ } }).grow().left().pad(6).top(); }).width(280f).pad(3).top().left().fillY(); + + if(++i % cols == 0){ filterTable.row(); } @@ -348,6 +350,7 @@ public class MapGenerateDialog extends BaseDialog{ result = executor.submit(() -> { try{ + world.setGenerating(true); generating = true; if(!filters.isEmpty()){ @@ -400,7 +403,7 @@ public class MapGenerateDialog extends BaseDialog{ generating = false; e.printStackTrace(); } - return null; + world.setGenerating(false); }); } diff --git a/core/src/mindustry/editor/MapRenderer.java b/core/src/mindustry/editor/MapRenderer.java index 04bca65167..0976ccbcb2 100644 --- a/core/src/mindustry/editor/MapRenderer.java +++ b/core/src/mindustry/editor/MapRenderer.java @@ -24,7 +24,7 @@ public class MapRenderer implements Disposable{ public MapRenderer(MapEditor editor){ this.editor = editor; - this.texture = Core.atlas.find("clear-editor").getTexture(); + this.texture = Core.atlas.find("clear-editor").texture; } public void resize(int width, int height){ @@ -110,18 +110,13 @@ public class MapRenderer implements Disposable{ if(wall != Blocks.air && wall.synthetic()){ region = !Core.atlas.isFound(wall.editorIcon()) || !center ? Core.atlas.find("clear-editor") : wall.editorIcon(); - if(wall.rotate){ - mesh.draw(idxWall, region, - wx * tilesize + wall.offset, wy * tilesize + wall.offset, - region.getWidth() * Draw.scl, region.getHeight() * Draw.scl, tile.build == null ? 0 : tile.build.rotdeg() - 90); - }else{ - float width = region.getWidth() * Draw.scl, height = region.getHeight() * Draw.scl; + float width = region.width * Draw.scl, height = region.height * Draw.scl; - mesh.draw(idxWall, region, - wx * tilesize + wall.offset + (tilesize - width) / 2f, - wy * tilesize + wall.offset + (tilesize - height) / 2f, - width, height); - } + mesh.draw(idxWall, region, + wx * tilesize + wall.offset + (tilesize - width) / 2f, + wy * tilesize + wall.offset + (tilesize - height) / 2f, + width, height, + tile.build == null || !wall.rotate ? 0 : tile.build.rotdeg() - 90); }else{ region = floor.editorVariantRegions()[Mathf.randomSeed(idxWall, 0, floor.editorVariantRegions().length - 1)]; @@ -135,15 +130,15 @@ public class MapRenderer implements Disposable{ region = Core.atlas.find("block-border-editor"); }else if(!wall.synthetic() && wall != Blocks.air && center){ region = !Core.atlas.isFound(wall.editorIcon()) ? Core.atlas.find("clear-editor") : wall.editorIcon(); - offsetX = tilesize / 2f - region.getWidth() / 2f * Draw.scl; - offsetY = tilesize / 2f - region.getHeight() / 2f * Draw.scl; + offsetX = tilesize / 2f - region.width / 2f * Draw.scl; + offsetY = tilesize / 2f - region.height / 2f * Draw.scl; }else if(wall == Blocks.air && !tile.overlay().isAir()){ region = tile.overlay().editorVariantRegions()[Mathf.randomSeed(idxWall, 0, tile.overlay().editorVariantRegions().length - 1)]; }else{ region = Core.atlas.find("clear-editor"); } - float width = region.getWidth() * Draw.scl, height = region.getHeight() * Draw.scl; + float width = region.width * Draw.scl, height = region.height * Draw.scl; if(!wall.synthetic() && wall != Blocks.air && !wall.isMultiblock()){ offsetX = 0; offsetY = 0; diff --git a/core/src/mindustry/editor/MapView.java b/core/src/mindustry/editor/MapView.java index 7689e7aa48..f3ce2f6630 100644 --- a/core/src/mindustry/editor/MapView.java +++ b/core/src/mindustry/editor/MapView.java @@ -255,7 +255,13 @@ public class MapView extends Element implements GestureListener{ Draw.color(Color.gray); image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); image.draw(); - Draw.color(); + + Lines.stroke(3f); + Draw.color(Pal.accent); + Lines.line(centerx - sclwidth/2f, centery, centerx + sclwidth/2f, centery); + Lines.line(centerx, centery - sclheight/2f, centerx, centery + sclheight/2f); + + Draw.reset(); } int index = 0; diff --git a/core/src/mindustry/editor/WaveGraph.java b/core/src/mindustry/editor/WaveGraph.java index f71a5e6f7d..14b2416085 100644 --- a/core/src/mindustry/editor/WaveGraph.java +++ b/core/src/mindustry/editor/WaveGraph.java @@ -32,7 +32,6 @@ public class WaveGraph extends Table{ rect((x, y, width, height) -> { Lines.stroke(Scl.scl(3f)); - Lines.precise(true); GlyphLayout lay = Pools.obtain(GlyphLayout.class, GlyphLayout::new); Font font = Fonts.outline; @@ -122,7 +121,6 @@ public class WaveGraph extends Table{ Pools.free(lay); - Lines.precise(false); Draw.reset(); }).pad(4).padBottom(10).grow(); diff --git a/core/src/mindustry/entities/Damage.java b/core/src/mindustry/entities/Damage.java index 2650588cb8..5ff4bee8a6 100644 --- a/core/src/mindustry/entities/Damage.java +++ b/core/src/mindustry/entities/Damage.java @@ -20,6 +20,7 @@ import static mindustry.Vars.*; /** Utility class for damaging in an area. */ public class Damage{ + private static Tile furthest; private static Rect rect = new Rect(); private static Rect hitrect = new Rect(); private static Vec2 tr = new Vec2(); @@ -30,24 +31,26 @@ public class Damage{ private static Unit tmpUnit; /** Creates a dynamic explosion based on specified parameters. */ - public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, Color color){ - for(int i = 0; i < Mathf.clamp(power / 20, 0, 6); i++){ - int branches = 5 + Mathf.clamp((int)(power / 30), 1, 20); - Time.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3, x, y, Mathf.random(360f), branches + Mathf.range(2))); - } + public static void dynamicExplosion(float x, float y, float flammability, float explosiveness, float power, float radius, Color color, boolean damage){ + if(damage){ + for(int i = 0; i < Mathf.clamp(power / 20, 0, 6); i++){ + int branches = 5 + Mathf.clamp((int)(power / 30), 1, 20); + Time.run(i * 2f + Mathf.random(4f), () -> Lightning.create(Team.derelict, Pal.power, 3, x, y, Mathf.random(360f), branches + Mathf.range(2))); + } - for(int i = 0; i < Mathf.clamp(flammability / 4, 0, 30); i++){ - Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), Bullets.fireball.damage, 1, 1)); - } + for(int i = 0; i < Mathf.clamp(flammability / 4, 0, 30); i++){ + Time.run(i / 2f, () -> Call.createBullet(Bullets.fireball, Team.derelict, x, y, Mathf.random(360f), Bullets.fireball.damage, 1, 1)); + } - int waves = Mathf.clamp((int)(explosiveness / 4), 0, 30); + int waves = Mathf.clamp((int)(explosiveness / 4), 0, 30); - for(int i = 0; i < waves; i++){ - int f = i; - Time.run(i * 2f, () -> { - Damage.damage(x, y, Mathf.clamp(radius + explosiveness, 0, 50f) * ((f + 1f) / waves), explosiveness / 2f); - Fx.blockExplosionSmoke.at(x + Mathf.range(radius), y + Mathf.range(radius)); - }); + for(int i = 0; i < waves; i++){ + int f = i; + Time.run(i * 2f, () -> { + Damage.damage(x, y, Mathf.clamp(radius + explosiveness, 0, 50f) * ((f + 1f) / waves), explosiveness / 2f); + Fx.blockExplosionSmoke.at(x + Mathf.range(radius), y + Mathf.range(radius)); + }); + } } if(explosiveness > 15f){ @@ -74,6 +77,23 @@ 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){ + 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), + (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; + + Damage.collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), resultLength); + b.fdata = furthest != null ? resultLength : length; + + return resultLength; + } + public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length){ collideLine(hitter, team, effect, x, y, angle, length, false); } @@ -87,7 +107,7 @@ public class Damage{ tr.trns(angle, length); Intc2 collider = (cx, cy) -> { Building tile = world.build(cx, cy); - if(tile != null && !collidedBlocks.contains(tile.pos()) && tile.team() != team && tile.collide(hitter)){ + if(tile != null && !collidedBlocks.contains(tile.pos()) && tile.team != team && tile.collide(hitter)){ tile.collision(hitter); collidedBlocks.add(tile.pos()); hitter.type.hit(hitter, tile.x, tile.y); diff --git a/core/src/mindustry/entities/Effect.java b/core/src/mindustry/entities/Effect.java index 7950c5375c..62ebe99d32 100644 --- a/core/src/mindustry/entities/Effect.java +++ b/core/src/mindustry/entities/Effect.java @@ -40,7 +40,7 @@ public class Effect{ } public Effect(float life, Cons renderer){ - this(life, 28f, renderer); + this(life, 32f, renderer); } public Effect ground(){ @@ -89,6 +89,7 @@ public class Effect{ public void render(int id, Color color, float life, float rotation, float x, float y, Object data){ container.set(id, color, life, lifetime, rotation, x, y, data); Draw.z(ground ? Layer.debris : Layer.effect); + Draw.reset(); renderer.get(container); Draw.reset(); } diff --git a/core/src/mindustry/entities/EntityGroup.java b/core/src/mindustry/entities/EntityGroup.java index f9c6d55316..1157b83ff9 100644 --- a/core/src/mindustry/entities/EntityGroup.java +++ b/core/src/mindustry/entities/EntityGroup.java @@ -57,7 +57,7 @@ public class EntityGroup implements Iterable{ each(Entityc::update); } - public void copy(Seq arr){ + public void copy(Seq arr){ arr.addAll(array); } @@ -101,7 +101,7 @@ public class EntityGroup implements Iterable{ if(map == null) throw new RuntimeException("Mapping is not enabled for group " + id + "!"); T t = map.get(id); if(t != null){ //remove if present in map already - remove(t); + t.remove(); } } diff --git a/core/src/mindustry/entities/Fires.java b/core/src/mindustry/entities/Fires.java index e24d34dac4..2906b4e7d7 100644 --- a/core/src/mindustry/entities/Fires.java +++ b/core/src/mindustry/entities/Fires.java @@ -17,7 +17,7 @@ public class Fires{ /** Start a fire on the tile. If there already is a file there, refreshes its lifetime. */ public static void create(Tile tile){ - if(net.client() || tile == null) return; //not clientside. + if(net.client() || tile == null || !state.rules.fire) return; //not clientside. Fire fire = map.get(tile.pos()); diff --git a/core/src/mindustry/entities/Units.java b/core/src/mindustry/entities/Units.java index 35143817c7..6460e9ce8d 100644 --- a/core/src/mindustry/entities/Units.java +++ b/core/src/mindustry/entities/Units.java @@ -19,8 +19,17 @@ public class Units{ private static boolean boolResult; @Remote(called = Loc.server) - public static void unitDeath(Unit unit){ - unit.killed(); + public static void unitDeath(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.killed(); + } } @Remote(called = Loc.server) @@ -90,7 +99,7 @@ public class Units{ nearby(x, y, width, height, unit -> { if(boolResult) return; - if(unit.isGrounded() == ground){ + if((unit.isGrounded() && !unit.type().hovering) == ground){ unit.hitbox(hitrect); if(hitrect.overlaps(x, y, width, height)){ @@ -242,9 +251,20 @@ public class Units{ /** Iterates over all units that are enemies of this team. */ public static void nearbyEnemies(Team team, float x, float y, float width, float height, Cons cons){ - for(Team enemy : state.teams.enemiesOf(team)){ - nearby(enemy, x, y, width, height, cons); + if(team.active()){ + for(Team enemy : state.teams.enemiesOf(team)){ + nearby(enemy, x, y, width, height, cons); + } + }else{ + //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){ + nearby(other, x, y, width, height, cons); + } + } } + } /** Iterates over all units that are enemies of this team. */ diff --git a/core/src/mindustry/entities/abilities/ForceFieldAbility.java b/core/src/mindustry/entities/abilities/ForceFieldAbility.java index 49da3eee5e..33aa408602 100644 --- a/core/src/mindustry/entities/abilities/ForceFieldAbility.java +++ b/core/src/mindustry/entities/abilities/ForceFieldAbility.java @@ -23,7 +23,6 @@ public class ForceFieldAbility implements Ability{ private float realRad; private Unit paramUnit; - private boolean hadShield; private final Cons shieldConsumer = trait -> { if(trait.team() != paramUnit.team && Intersector.isInsideHexagon(paramUnit.x, paramUnit.y, realRad * 2f, trait.x(), trait.y()) && paramUnit.shield > 0){ trait.absorb(); @@ -32,6 +31,8 @@ public class ForceFieldAbility implements Ability{ //break shield if(paramUnit.shield <= trait.damage()){ paramUnit.shield -= cooldown * regen; + + Fx.shieldBreak.at(paramUnit.x, paramUnit.y, radius, paramUnit.team.color); } paramUnit.shield -= trait.damage(); @@ -54,13 +55,6 @@ public class ForceFieldAbility implements Ability{ unit.shield += Time.delta * regen; } - //break effect - if(hadShield && unit.shield <= 0){ - Fx.shieldBreak.at(paramUnit.x, paramUnit.y, radius, paramUnit.team.color); - } - - hadShield = unit.shield > 0; - if(unit.shield > 0){ unit.timer2 = Mathf.lerpDelta(unit.timer2, 1f, 0.06f); paramUnit = unit; diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index c5d7a086ec..908621e508 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -74,7 +74,7 @@ public abstract class BulletType extends Content{ public float fragCone = 360f; public int fragBullets = 9; - public float fragVelocityMin = 0.2f, fragVelocityMax = 1f; + public float fragVelocityMin = 0.2f, fragVelocityMax = 1f, fragLifeMin = 1f, fragLifeMax = 1f; public BulletType fragBullet = null; public Color hitColor = Color.white; @@ -92,6 +92,7 @@ public abstract class BulletType extends Content{ public float homingPower = 0f; public float homingRange = 50f; + public Color lightningColor = Pal.surge; public int lightning; public int lightningLength = 5; /** Use a negative value to use default bullet damage. */ @@ -148,7 +149,7 @@ public abstract class BulletType extends Content{ for(int i = 0; i < fragBullets; i++){ float len = Mathf.random(1f, 7f); float a = b.rotation() + Mathf.range(fragCone/2); - fragBullet.create(b, x + Angles.trnsx(a, len), y + Angles.trnsy(a, len), a, Mathf.random(fragVelocityMin, fragVelocityMax)); + fragBullet.create(b, x + Angles.trnsx(a, len), y + Angles.trnsy(a, len), a, Mathf.random(fragVelocityMin, fragVelocityMax), Mathf.random(fragLifeMin, fragLifeMax)); } } @@ -172,7 +173,7 @@ public abstract class BulletType extends Content{ } for(int i = 0; i < lightning; i++){ - Lightning.create(b, Pal.surge, lightningDamage < 0 ? damage : lightningDamage, b.x, b.y, Mathf.random(360f), lightningLength); + Lightning.create(b, lightningColor, lightningDamage < 0 ? damage : lightningDamage, b.x, b.y, Mathf.random(360f), lightningLength); } } @@ -246,6 +247,10 @@ public abstract class BulletType extends Content{ return create(parent.owner(), parent.team, x, y, angle); } + public Bullet create(Bullet parent, float x, float y, float angle, float velocityScl, float lifeScale){ + return create(parent.owner(), parent.team, x, y, angle, velocityScl, lifeScale); + } + public Bullet create(Bullet parent, float x, float y, float angle, float velocityScl){ return create(parent.owner(), parent.team, x, y, angle, velocityScl); } diff --git a/core/src/mindustry/entities/bullet/HealBulletType.java b/core/src/mindustry/entities/bullet/HealBulletType.java index af66a4c931..fa3e27c63c 100644 --- a/core/src/mindustry/entities/bullet/HealBulletType.java +++ b/core/src/mindustry/entities/bullet/HealBulletType.java @@ -29,7 +29,7 @@ public class HealBulletType extends BulletType{ @Override public boolean collides(Bullet b, Building tile){ - return tile.team() != b.team || tile.healthf() < 1f; + return tile.team != b.team || tile.healthf() < 1f; } @Override @@ -46,8 +46,8 @@ public class HealBulletType extends BulletType{ public void hitTile(Bullet b, Building tile){ super.hit(b); - if(tile.team() == b.team && !(tile.block() instanceof BuildBlock)){ - Fx.healBlockFull.at(tile.x, tile.y, tile.block().size, Pal.heal); + 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/LaserBulletType.java b/core/src/mindustry/entities/bullet/LaserBulletType.java index 821129f51d..35745d6b34 100644 --- a/core/src/mindustry/entities/bullet/LaserBulletType.java +++ b/core/src/mindustry/entities/bullet/LaserBulletType.java @@ -10,8 +10,6 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.world.*; -import static mindustry.Vars.world; - public class LaserBulletType extends BulletType{ protected static Tile furthest; @@ -49,24 +47,13 @@ public class LaserBulletType extends BulletType{ @Override public void init(Bullet b){ - 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), - (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; - - Damage.collideLine(b, b.team, hitEffect, b.x, b.y, b.rotation(), resultLength); - if(furthest != null) b.data(resultLength); - + float resultLength = Damage.collideLaser(b, length); laserEffect.at(b.x, b.y, b.rotation(), resultLength * 0.75f); } @Override public void draw(Bullet b){ - float realLength = b.data() == null ? length : (Float)b.data(); + float realLength = b.fdata; float f = Mathf.curve(b.fin(), 0f, 0.2f); float baseLen = realLength * f; @@ -74,7 +61,6 @@ public class LaserBulletType extends BulletType{ float compound = 1f; Lines.lineAngle(b.x, b.y, b.rotation(), baseLen); - Lines.precise(true); for(Color color : colors){ Draw.color(color); Lines.stroke((cwidth *= lengthFalloff) * b.fout()); @@ -89,7 +75,6 @@ public class LaserBulletType extends BulletType{ compound *= lengthFalloff; } - Lines.precise(false); Draw.reset(); Tmp.v1.trns(b.rotation(), baseLen * 1.1f); diff --git a/core/src/mindustry/entities/bullet/LiquidBulletType.java b/core/src/mindustry/entities/bullet/LiquidBulletType.java index 45ae536668..22d5c22d42 100644 --- a/core/src/mindustry/entities/bullet/LiquidBulletType.java +++ b/core/src/mindustry/entities/bullet/LiquidBulletType.java @@ -24,6 +24,7 @@ public class LiquidBulletType extends BulletType{ this.status = liquid.effect; } + ammoMultiplier = 1f; lifetime = 74f; statusDuration = 60f * 2f; despawnEffect = Fx.none; diff --git a/core/src/mindustry/entities/bullet/ShrapnelBulletType.java b/core/src/mindustry/entities/bullet/ShrapnelBulletType.java index 8f26efeaae..0d58e683d2 100644 --- a/core/src/mindustry/entities/bullet/ShrapnelBulletType.java +++ b/core/src/mindustry/entities/bullet/ShrapnelBulletType.java @@ -15,7 +15,7 @@ public class ShrapnelBulletType extends BulletType{ public Color fromColor = Color.white, toColor = Pal.lancerLaser; public int serrations = 7; - public float serrationLenScl = 10f, serrationWidth = 4f, serrationSpacing = 8f, serrationSpaceOffset = 80f; + public float serrationLenScl = 10f, serrationWidth = 4f, serrationSpacing = 8f, serrationSpaceOffset = 80f, serrationFadeOffset = 0.5f; public ShrapnelBulletType(){ speed = 0.01f; @@ -24,23 +24,32 @@ public class ShrapnelBulletType extends BulletType{ lifetime = 10f; despawnEffect = Fx.none; pierce = true; + keepVelocity = false; + hittable = false; } @Override public void init(Bullet b){ - Damage.collideLine(b, b.team, hitEffect, b.x, b.y, b.rotation(), length); + Damage.collideLaser(b, length); + } + + @Override + public float range(){ + return length; } @Override public void draw(Bullet b){ + float realLength = b.fdata; + Draw.color(fromColor, toColor, b.fin()); - for(int i = 0; i < serrations; i++){ + for(int i = 0; i < (int)(serrations * realLength / length); i++){ Tmp.v1.trns(b.rotation(), i * serrationSpacing); - float sl = Mathf.clamp(b.fout() - 0.5f) * (serrationSpaceOffset - i * serrationLenScl); + float sl = Mathf.clamp(b.fout() - serrationFadeOffset) * (serrationSpaceOffset - i * serrationLenScl); Drawf.tri(b.x + Tmp.v1.x, b.y + Tmp.v1.y, serrationWidth, sl, b.rotation() + 90); Drawf.tri(b.x + Tmp.v1.x, b.y + Tmp.v1.y, serrationWidth, sl, b.rotation() - 90); } - Drawf.tri(b.x, b.y, width * b.fout(), (length + 50), b.rotation()); + Drawf.tri(b.x, b.y, width * b.fout(), (realLength + 50), b.rotation()); Drawf.tri(b.x, b.y, width * b.fout(), 10f, b.rotation() + 180f); Draw.reset(); } diff --git a/core/src/mindustry/entities/comp/BlockUnitComp.java b/core/src/mindustry/entities/comp/BlockUnitComp.java index 4ae698db2a..d0ec5b9a32 100644 --- a/core/src/mindustry/entities/comp/BlockUnitComp.java +++ b/core/src/mindustry/entities/comp/BlockUnitComp.java @@ -18,16 +18,16 @@ abstract class BlockUnitComp implements Unitc{ this.tile = tile; //sets up block stats - maxHealth(tile.block().health); + maxHealth(tile.block.health); health(tile.health()); - hitSize(tile.block().size * tilesize * 0.7f); + hitSize(tile.block.size * tilesize * 0.7f); set(tile); } @Override public void update(){ if(tile != null){ - team = tile.team(); + team = tile.team; } } @@ -61,7 +61,7 @@ abstract class BlockUnitComp implements Unitc{ public void team(Team team){ if(tile != null && this.team != team){ this.team = team; - if(tile.team() != team){ + if(tile.team != team){ tile.team(team); } } diff --git a/core/src/mindustry/entities/comp/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index 241179e7ae..815f81773f 100644 --- a/core/src/mindustry/entities/comp/BuilderComp.java +++ b/core/src/mindustry/entities/comp/BuilderComp.java @@ -16,7 +16,7 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.world.*; import mindustry.world.blocks.*; -import mindustry.world.blocks.BuildBlock.*; +import mindustry.world.blocks.ConstructBlock.*; import java.util.*; @@ -74,7 +74,7 @@ abstract class BuilderComp implements Unitc{ rotation = Mathf.slerpDelta(rotation, angleTo(tile), 0.4f); } - if(!(tile.block() instanceof BuildBlock)){ + if(!(tile.block() instanceof ConstructBlock)){ if(!current.initialized && !current.breaking && Build.validPlace(current.block, team(), current.x, current.y, current.rotation)){ boolean hasAll = infinite || !Structs.contains(current.block.requirements, i -> core != null && !core.items.has(i.item)); @@ -94,27 +94,23 @@ abstract class BuilderComp implements Unitc{ return; } - if(tile.build instanceof BuildEntity && !current.initialized){ + if(tile.build instanceof ConstructBuild && !current.initialized){ Core.app.post(() -> Events.fire(new BuildSelectEvent(tile, team(), (Builderc)this, current.breaking))); current.initialized = true; } //if there is no core to build with or no build entity, stop building! - if((core == null && !infinite) || !(tile.build instanceof BuildEntity)){ + if((core == null && !infinite) || !(tile.build instanceof ConstructBuild)){ return; } //otherwise, update it. - BuildEntity entity = tile.bc(); + ConstructBuild entity = tile.bc(); if(current.breaking){ entity.deconstruct(base(), core, 1f / entity.buildCost * Time.delta * type().buildSpeed * state.rules.buildSpeedMultiplier); }else{ - if(entity.construct(base(), core, 1f / entity.buildCost * Time.delta * type().buildSpeed * state.rules.buildSpeedMultiplier, current.hasConfig)){ - if(current.hasConfig){ - Call.tileConfig(null, tile.build, current.config); - } - } + entity.construct(base(), core, 1f / entity.buildCost * Time.delta * type().buildSpeed * state.rules.buildSpeedMultiplier, current.config); } current.stuck = Mathf.equal(current.progress, entity.progress); @@ -144,7 +140,6 @@ abstract class BuilderComp implements Unitc{ boolean shouldSkip(BuildPlan request, @Nullable Building core){ //requests that you have at least *started* are considered if(state.rules.infiniteResources || team().rules().infiniteResources || request.breaking || core == null) return false; - //TODO these are bad criteria return (request.stuck && !core.items.has(request.block.requirements)) || (Structs.contains(request.block.requirements, i -> !core.items.has(i.item)) && !request.initialized); } @@ -184,8 +179,8 @@ abstract class BuilderComp implements Unitc{ plans.remove(replace); } Tile tile = world.tile(place.x, place.y); - if(tile != null && tile.build instanceof BuildEntity){ - place.progress = tile.bc().progress; + if(tile != null && tile.build instanceof ConstructBuild){ + place.progress = tile.bc().progress; } if(tail){ plans.addLast(place); diff --git a/core/src/mindustry/entities/comp/BuildingComp.java b/core/src/mindustry/entities/comp/BuildingComp.java index 073a9e62f8..54a7b8569f 100644 --- a/core/src/mindustry/entities/comp/BuildingComp.java +++ b/core/src/mindustry/entities/comp/BuildingComp.java @@ -76,6 +76,12 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public Building init(Tile tile, Team team, boolean shouldAdd, int rotation){ if(!initialized){ create(tile.block(), team); + }else{ + if(block.hasPower){ + //reinit power graph + power.graph = new PowerGraph(); + power.graph.add(base()); + } } this.rotation = rotation; this.tile = tile; @@ -135,8 +141,9 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public final void writeBase(Writes write){ write.f(health); - write.b(rotation); + write.b(rotation | 0b10000000); write.b(team.id); + write.b(0); //extra padding for later use if(items != null) items.write(write); if(power != null) power.write(write); if(liquids != null) liquids.write(write); @@ -145,12 +152,20 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public final void readBase(Reads read){ health = read.f(); - rotation = read.b(); + byte rot = read.b(); team = Team.get(read.b()); - if(items != null) items.read(read); - if(power != null) power.read(read); - if(liquids != null) liquids.read(read); - if(cons != null) cons.read(read); + + rotation = rot & 0b01111111; + boolean legacy = true; + if((rot & 0b10000000) != 0){ + read.b(); //padding + legacy = false; + } + + if(items != null) items.read(read, legacy); + if(power != null) power.read(read, legacy); + if(liquids != null) liquids.read(read, legacy); + if(cons != null) cons.read(read, legacy); } public void writeAll(Writes write){ @@ -410,7 +425,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, int trns = block.size/2 + 1; Tile next = tile.getNearby(Geometry.d4(rotation).x * trns, Geometry.d4(rotation).y * trns); - if(next != null && next.build != null && next.build.team() == team && next.build.acceptPayload(base(), todump)){ + if(next != null && next.build != null && next.build.team == team && next.build.acceptPayload(base(), todump)){ next.build.handlePayload(base(), todump); return true; } @@ -431,7 +446,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, for(int i = 0; i < proximity.size; i++){ Building other = proximity.get((i + dump) % proximity.size); - if(other.team() == team && other.acceptPayload(base(), todump)){ + if(other.team == team && other.acceptPayload(base(), todump)){ other.handlePayload(base(), todump); incrementDump(proximity.size); return true; @@ -510,34 +525,31 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, next = next.getLiquidDestination(base(), liquid); - if(next.team() == team && next.block.hasLiquids && liquids.get(liquid) > 0f){ + if(next.team == team && next.block.hasLiquids && liquids.get(liquid) > 0f){ + float ofract = next.liquids.get(liquid) / next.block.liquidCapacity; + float fract = liquids.get(liquid) / block.liquidCapacity * block.liquidPressure; + float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (block.liquidCapacity), liquids.get(liquid)); + flow = Math.min(flow, next.block.liquidCapacity - next.liquids.get(liquid) - 0.001f); - if(next.acceptLiquid(base(), liquid, 0f)){ - float ofract = next.liquids().get(liquid) / next.block.liquidCapacity; - float fract = liquids.get(liquid) / block.liquidCapacity * block.liquidPressure; - float flow = Math.min(Mathf.clamp((fract - ofract) * (1f)) * (block.liquidCapacity), liquids.get(liquid)); - flow = Math.min(flow, next.block.liquidCapacity - next.liquids().get(liquid) - 0.001f); + if(flow > 0f && ofract <= fract && next.acceptLiquid(base(), liquid, flow)){ + next.handleLiquid(base(), liquid, flow); + liquids.remove(liquid, flow); + return flow; + }else if(next.liquids.currentAmount() / next.block.liquidCapacity > 0.1f && fract > 0.1f){ + //TODO these are incorrect effect positions + float fx = (x + next.x) / 2f, fy = (y + next.y) / 2f; - if(flow > 0f && ofract <= fract && next.acceptLiquid(base(), liquid, flow)){ - next.handleLiquid(base(), liquid, flow); - liquids.remove(liquid, flow); - return flow; - }else if(ofract > 0.1f && fract > 0.1f){ - //TODO these are incorrect effect positions - float fx = (x + next.x) / 2f, fy = (y + next.y) / 2f; - - Liquid other = next.liquids().current(); - if((other.flammability > 0.3f && liquid.temperature > 0.7f) || (liquid.flammability > 0.3f && other.temperature > 0.7f)){ - damage(1 * Time.delta); - next.damage(1 * Time.delta); - if(Mathf.chance(0.1 * Time.delta)){ - Fx.fire.at(fx, fy); - } - }else if((liquid.temperature > 0.7f && other.temperature < 0.55f) || (other.temperature > 0.7f && liquid.temperature < 0.55f)){ - liquids.remove(liquid, Math.min(liquids.get(liquid), 0.7f * Time.delta)); - if(Mathf.chance(0.2f * Time.delta)){ - Fx.steam.at(fx, fy); - } + Liquid other = next.liquids.current(); + if((other.flammability > 0.3f && liquid.temperature > 0.7f) || (liquid.flammability > 0.3f && other.temperature > 0.7f)){ + damage(1 * Time.delta); + next.damage(1 * Time.delta); + if(Mathf.chance(0.1 * Time.delta)){ + Fx.fire.at(fx, fy); + } + }else if((liquid.temperature > 0.7f && other.temperature < 0.55f) || (other.temperature > 0.7f && liquid.temperature < 0.55f)){ + liquids.remove(liquid, Math.min(liquids.get(liquid), 0.7f * Time.delta)); + if(Mathf.chance(0.2f * Time.delta)){ + Fx.steam.at(fx, fy); } } } @@ -568,7 +580,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); Building other = proximity.get((i + dump) % proximity.size); - if(other.team() == team && other.acceptItem(base(), item) && canDump(other, item)){ + if(other.team == team && other.acceptItem(base(), item) && canDump(other, item)){ other.handleItem(base(), item); return; } @@ -586,7 +598,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); Building other = proximity.get((i + dump) % proximity.size); - if(other.team() == team && other.acceptItem(base(), item) && canDump(other, item)){ + if(other.team == team && other.acceptItem(base(), item) && canDump(other, item)){ other.handleItem(base(), item); return true; } @@ -619,7 +631,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, for(int ii = 0; ii < content.items().size; ii++){ Item item = content.item(ii); - if(other.team() == team && items.has(item) && other.acceptItem(base(), item) && canDump(other, item)){ + if(other.team == team && items.has(item) && other.acceptItem(base(), item) && canDump(other, item)){ other.handleItem(base(), item); items.remove(item, 1); incrementDump(proximity.size); @@ -627,7 +639,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } } }else{ - if(other.team() == team && other.acceptItem(base(), todump) && canDump(other, todump)){ + if(other.team == team && other.acceptItem(base(), todump) && canDump(other, todump)){ other.handleItem(base(), todump); items.remove(todump, 1); incrementDump(proximity.size); @@ -653,7 +665,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Try offloading an item to a nearby container in its facing direction. Returns true if success. */ public boolean moveForward(Item item){ Building other = front(); - if(other != null && other.team() == team && other.acceptItem(base(), item)){ + if(other != null && other.team == team && other.acceptItem(base(), item)){ other.handleItem(base(), item); return true; } @@ -691,6 +703,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, other.build.power.links.removeValue(pos()); } } + power.links.clear(); } public Seq getPowerConnections(Seq out){ @@ -806,10 +819,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Called after the block is placed by this client. */ @CallSuper - public void playerPlaced(){ - if(block.saveConfig && block.lastConfig != null){ - configure(block.lastConfig); - } + public void playerPlaced(Object config){ + } /** Called after the block is placed by anyone. */ @@ -825,7 +836,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, if(other != null && other.block instanceof PowerNode && ((PowerNode)other.block).linkValid(other, base()) && !PowerNode.insulated(other, base()) && !other.proximity().contains(this.base()) && !(block.outputsPower && proximity.contains(p -> p.power != null && p.power.graph == other.power.graph))){ - tempTiles.add(other.tile()); + tempTiles.add(other.tile); } }); tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); @@ -850,7 +861,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } /** Called when arbitrary configuration is applied to a tile. */ - public void configured(@Nullable Player player, @Nullable Object value){ + public void configured(@Nullable Unit builder, @Nullable Object value){ //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(); @@ -887,7 +898,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, power += this.power.status * block.consumes.getPower().capacity; } - if(block.hasLiquids){ + if(block.hasLiquids && state.rules.damageExplosions){ liquids.each((liquid, amount) -> { float splash = Mathf.clamp(amount / 4f, 0f, 10f); @@ -903,7 +914,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, }); } - Damage.dynamicExplosion(x, y, flammability, explosiveness * 3.5f, power, tilesize * block.size / 2f, Pal.darkFlame); + Damage.dynamicExplosion(x, y, flammability, explosiveness * 3.5f, power, tilesize * block.size / 2f, Pal.darkFlame, state.rules.damageExplosions); + if(!floor().solid && !floor().isLiquid){ Effect.rubble(x, y, block.size); } @@ -960,7 +972,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, table.row(); table.table(this::displayConsumption).growX(); - boolean displayFlow = (block.category == Category.distribution || block.category == Category.liquid) && Core.settings.getBool("flow"); + boolean displayFlow = (block.category == Category.distribution || block.category == Category.liquid) && Core.settings.getBool("flow") && block.displayFlow; if(displayFlow){ String ps = " " + StatUnit.perSecond.localized(); @@ -998,9 +1010,21 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, if(liquids != null){ table.row(); table.table(l -> { - l.left(); - l.image(() -> liquids.current().icon(Cicon.small)).padRight(3f); - l.label(() -> liquids.getFlowRate() < 0 ? "..." : Strings.fixed(liquids.getFlowRate(), 2) + ps).color(Color.lightGray); + boolean[] had = {false}; + + Runnable rebuild = () -> { + l.clearChildren(); + l.left(); + l.image(() -> liquids.current().icon(Cicon.small)).padRight(3f); + l.label(() -> liquids.getFlowRate() < 0 ? "..." : Strings.fixed(liquids.getFlowRate(), 2) + ps).color(Color.lightGray); + }; + + l.update(() -> { + if(!had[0] && liquids.hadFlow()){ + had[0] = true; + rebuild.run(); + } + }); }).left(); } } @@ -1193,6 +1217,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, 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(); @@ -1201,13 +1226,20 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, if(sensor == LAccess.itemCapacity) return block.itemCapacity; if(sensor == LAccess.liquidCapacity) return block.liquidCapacity; if(sensor == LAccess.powerCapacity) return block.consumes.hasPower() ? block.consumes.getPower().capacity : 0f; - if(sensor == LAccess.powerNetIn && power != null) return power.graph.getPowerProduced(); - if(sensor == LAccess.powerNetOut && power != null) return power.graph.getPowerNeeded(); + if(sensor == LAccess.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.getBatteryCapacity(); + if(sensor == LAccess.powerNetCapacity && power != null) return power.graph.getLastCapacity(); return 0; } + @Override + public Object senseObject(LAccess sensor){ + if(sensor == LAccess.type) return block; + + return noSensed; + } + @Override public double sense(Content content){ if(content instanceof Item && items != null) return items.get((Item)content); diff --git a/core/src/mindustry/entities/comp/BulletComp.java b/core/src/mindustry/entities/comp/BulletComp.java index c94216c923..2f46261be8 100644 --- a/core/src/mindustry/entities/comp/BulletComp.java +++ b/core/src/mindustry/entities/comp/BulletComp.java @@ -25,11 +25,20 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw Object data; BulletType type; float damage; + float fdata; @Override public void getCollisions(Cons consumer){ - for(Team team : team.enemies()){ - consumer.get(teamIndex.tree(team)); + if(team.active()){ + for(Team team : team.enemies()){ + consumer.get(teamIndex.tree(team)); + } + }else{ + for(Team other : Team.all){ + if(other != team && teamIndex.count(other) > 0){ + consumer.get(teamIndex.tree(other)); + } + } } } diff --git a/core/src/mindustry/entities/comp/DecalComp.java b/core/src/mindustry/entities/comp/DecalComp.java index 6db6b58f53..33ce6d406c 100644 --- a/core/src/mindustry/entities/comp/DecalComp.java +++ b/core/src/mindustry/entities/comp/DecalComp.java @@ -27,7 +27,7 @@ abstract class DecalComp implements Drawc, Timedc, Rotc, Posc{ @Replace public float clipSize(){ - return region.getWidth()*2; + return region.width *2; } } diff --git a/core/src/mindustry/entities/comp/FireComp.java b/core/src/mindustry/entities/comp/FireComp.java index 075a96416b..e3b066a60f 100644 --- a/core/src/mindustry/entities/comp/FireComp.java +++ b/core/src/mindustry/entities/comp/FireComp.java @@ -15,14 +15,14 @@ import static mindustry.Vars.*; @EntityDef(value = {Firec.class}, pooled = true) @Component(base = true) -abstract class FireComp implements Timedc, Posc, Firec{ +abstract class FireComp implements Timedc, Posc, Firec, Syncc{ private static final float spreadChance = 0.05f, fireballChance = 0.07f; @Import float time, lifetime, x, y; Tile tile; - private Block block; - private float baseFlammability = -1, puddleFlammability; + private transient Block block; + private transient float baseFlammability = -1, puddleFlammability; @Override public void update(){ @@ -99,4 +99,9 @@ abstract class FireComp implements Timedc, Posc, Firec{ public void afterRead(){ Fires.register(base()); } + + @Override + public void afterSync(){ + Fires.register(base()); + } } diff --git a/core/src/mindustry/entities/comp/FlyingComp.java b/core/src/mindustry/entities/comp/FlyingComp.java index bc27a2b084..415337622b 100644 --- a/core/src/mindustry/entities/comp/FlyingComp.java +++ b/core/src/mindustry/entities/comp/FlyingComp.java @@ -14,7 +14,7 @@ import static mindustry.Vars.net; abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ private static final Vec2 tmp1 = new Vec2(), tmp2 = new Vec2(); - @Import float x, y; + @Import float x, y, speedMultiplier; @Import Vec2 vel; @SyncLocal float elevation; @@ -56,7 +56,7 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ float floorSpeedMultiplier(){ Floor on = isFlying() || hovering ? Blocks.air.asFloor() : floorOn(); - return on.speedMultiplier; + return on.speedMultiplier * speedMultiplier; } @Override diff --git a/core/src/mindustry/entities/comp/HitboxComp.java b/core/src/mindustry/entities/comp/HitboxComp.java index f92948af41..9473dfbca3 100644 --- a/core/src/mindustry/entities/comp/HitboxComp.java +++ b/core/src/mindustry/entities/comp/HitboxComp.java @@ -61,7 +61,8 @@ abstract class HitboxComp implements Posc, QuadTreeObject{ } public void hitboxTile(Rect rect){ - float scale = 0.66f; - rect.setCentered(x, y, hitSize * scale, hitSize * scale); + //tile hitboxes are never bigger than a tile, otherwise units get stuck + float size = Math.min(hitSize * 0.66f, 7.9f); + rect.setCentered(x, y, size, size); } } diff --git a/core/src/mindustry/entities/comp/LaunchCoreComp.java b/core/src/mindustry/entities/comp/LaunchCoreComp.java index 186cff2b2e..7283a9e220 100644 --- a/core/src/mindustry/entities/comp/LaunchCoreComp.java +++ b/core/src/mindustry/entities/comp/LaunchCoreComp.java @@ -44,7 +44,7 @@ abstract class LaunchCoreComp implements Drawc, Timedc{ Draw.z(Layer.weather - 1); TextureRegion region = block.icon(Cicon.full); - float rw = region.getWidth() * Draw.scl * scale, rh = region.getHeight() * Draw.scl * scale; + float rw = region.width * Draw.scl * scale, rh = region.height * Draw.scl * scale; Draw.alpha(alpha); Draw.rect(region, cx, cy, rw, rh, rotation - 45); diff --git a/core/src/mindustry/entities/comp/LegsComp.java b/core/src/mindustry/entities/comp/LegsComp.java index ece772c0d0..68c0de5f00 100644 --- a/core/src/mindustry/entities/comp/LegsComp.java +++ b/core/src/mindustry/entities/comp/LegsComp.java @@ -31,29 +31,41 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ } @Override - public void update(){ - if(Mathf.dst(deltaX(), deltaY()) > 0.001f){ - baseRotation = Mathf.slerpDelta(baseRotation, Mathf.angle(deltaX(), deltaY()), 0.1f); - } + public void add(){ + resetLegs(); + } + public void resetLegs(){ float rot = baseRotation; int count = type.legCount; float legLength = type.legLength; + this.legs = new Leg[count]; + + float spacing = 360f / count; + + for(int i = 0; i < legs.length; i++){ + Leg l = new Leg(); + + l.joint.trns(i * spacing + rot, legLength/2f + type.legBaseOffset).add(x, y); + l.base.trns(i * spacing + rot, legLength + type.legBaseOffset).add(x, y); + + legs[i] = l; + } + } + + @Override + public void update(){ + if(Mathf.dst(deltaX(), deltaY()) > 0.001f){ + baseRotation = Angles.moveToward(baseRotation, Mathf.angle(deltaX(), deltaY()), type.rotateSpeed); + } + + float rot = baseRotation; + float legLength = type.legLength; + //set up initial leg positions if(legs.length != type.legCount){ - this.legs = new Leg[count]; - - float spacing = 360f / count; - - for(int i = 0; i < legs.length; i++){ - Leg l = new Leg(); - - l.joint.trns(i * spacing + rot, legLength/2f + type.legBaseOffset).add(x, y); - l.base.trns(i * spacing + rot, legLength + type.legBaseOffset).add(x, y); - - legs[i] = l; - } + resetLegs(); } float moveSpeed = type.legSpeed; diff --git a/core/src/mindustry/entities/comp/MechComp.java b/core/src/mindustry/entities/comp/MechComp.java index d258e75406..407b256136 100644 --- a/core/src/mindustry/entities/comp/MechComp.java +++ b/core/src/mindustry/entities/comp/MechComp.java @@ -8,7 +8,7 @@ import mindustry.gen.*; @Component abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, ElevationMovec{ @SyncField(false) @SyncLocal float baseRotation; - transient float walkTime; + transient float walkTime, walkExtension; @Override public void update(){ diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index d2bc746aa9..52dc2bb0b5 100644 --- a/core/src/mindustry/entities/comp/PayloadComp.java +++ b/core/src/mindustry/entities/comp/PayloadComp.java @@ -8,16 +8,34 @@ import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; +import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.payloads.*; /** An entity that holds a payload. */ @Component -abstract class PayloadComp implements Posc, Rotc, Hitboxc{ +abstract class PayloadComp implements Posc, Rotc, Hitboxc, Unitc{ @Import float x, y, rotation; + @Import UnitType type; Seq payloads = new Seq<>(); + float payloadUsed(){ + return payloads.sumf(p -> p.size() * p.size()); + } + + boolean canPickup(Unit unit){ + return payloadUsed() + unit.hitSize * unit.hitSize <= type.payloadCapacity; + } + + boolean canPickup(Building build){ + return payloadUsed() + build.block.size * build.block.size * Vars.tilesize * Vars.tilesize <= type.payloadCapacity; + } + + boolean canPickupPayload(Payload pay){ + return payloadUsed() + pay.size()*pay.size() <= type.payloadCapacity; + } + boolean hasPayload(){ return payloads.size > 0; } @@ -33,7 +51,7 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc{ } void pickup(Building tile){ - tile.tile().remove(); + tile.tile.remove(); payloads.add(new BlockPayload(tile)); Fx.unitPickup.at(tile); } @@ -70,13 +88,14 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc{ boolean dropUnit(UnitPayload payload){ Unit u = payload.unit; - Fx.unitDrop.at(this); //can't drop ground units if(((tileOn() == null || tileOn().solid()) && u.elevation < 0.1f) || (!floorOn().isLiquid && u instanceof WaterMovec)){ return false; } + Fx.unitDrop.at(this); + //clients do not drop payloads if(Vars.net.client()) return true; @@ -93,9 +112,9 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc{ /** @return whether the tile has been successfully placed. */ boolean dropBlock(BlockPayload payload){ Building tile = payload.entity; - int tx = Vars.world.toTile(x - tile.block().offset), ty = Vars.world.toTile(y - tile.block().offset); + 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)){ int rot = (int)((rotation + 45f) / 90f) % 4; payload.place(on, rot); diff --git a/core/src/mindustry/entities/comp/PlayerComp.java b/core/src/mindustry/entities/comp/PlayerComp.java index ce0f36d908..50f62e3255 100644 --- a/core/src/mindustry/entities/comp/PlayerComp.java +++ b/core/src/mindustry/entities/comp/PlayerComp.java @@ -34,10 +34,12 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra @Import float x, y; @NonNull @ReadOnly Unit unit = Nulls.unit; + transient private Unit lastReadUnit = Nulls.unit; transient @Nullable NetConnection con; @ReadOnly Team team = Team.sharded; - @SyncLocal boolean admin, typing, shooting, boosting; + @SyncLocal boolean typing, shooting, boosting; + boolean admin; @SyncLocal float mouseX, mouseY; String name = "noname"; Color color = new Color(); @@ -54,13 +56,11 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra return unit instanceof Minerc; } - public @Nullable - CoreBuild closestCore(){ + public @Nullable CoreBuild closestCore(){ return state.teams.closestCore(x, y, team); } - public @Nullable - CoreBuild core(){ + public @Nullable CoreBuild core(){ return team.core(); } @@ -71,6 +71,10 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra return unit.icon(); } + public boolean displayAmmo(){ + return unit instanceof BlockUnitc || state.rules.unitAmmo; + } + public void reset(){ team = state.rules.defaultTeam; admin = typing = false; @@ -93,6 +97,12 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra @Override public void afterSync(){ + //simulate a unit change after sync + Unit set = unit; + unit = lastReadUnit; + unit(set); + lastReadUnit = unit; + unit.aim(mouseX, mouseY); //this is only necessary when the thing being controlled isn't synced unit.controlWeapons(shooting, shooting); @@ -165,6 +175,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra public void unit(Unit unit){ if(unit == null) throw new IllegalArgumentException("Unit cannot be null. Use clearUnit() instead."); if(this.unit == unit) return; + if(this.unit != Nulls.unit){ //un-control the old unit this.unit.controller(this.unit.type().createController()); @@ -173,6 +184,11 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra if(unit != Nulls.unit){ unit.team(team); unit.controller(this); + + //this player just became remote, snap the interpolation so it doesn't go wild + if(unit.isRemote()){ + unit.snapInterpolation(); + } } Events.fire(new UnitChangeEvent(base(), unit)); diff --git a/core/src/mindustry/entities/comp/PosComp.java b/core/src/mindustry/entities/comp/PosComp.java index e004b6db89..d43d097bac 100644 --- a/core/src/mindustry/entities/comp/PosComp.java +++ b/core/src/mindustry/entities/comp/PosComp.java @@ -45,11 +45,16 @@ abstract class PosComp implements Position{ return tile == null || tile.block() != Blocks.air ? (Floor)Blocks.air : tile.floor(); } - Block blockOn(){ + Block blockOn(){ Tile tile = tileOn(); return tile == null ? Blocks.air : tile.block(); } + boolean onSolid(){ + Tile tile = tileOn(); + return tile != null && tile.solid(); + } + @Nullable Tile tileOn(){ return world.tileWorld(x, y); } diff --git a/core/src/mindustry/entities/comp/StatusComp.java b/core/src/mindustry/entities/comp/StatusComp.java index bf61535026..41276274a3 100644 --- a/core/src/mindustry/entities/comp/StatusComp.java +++ b/core/src/mindustry/entities/comp/StatusComp.java @@ -1,7 +1,6 @@ package mindustry.entities.comp; import arc.graphics.*; -import arc.math.*; import arc.struct.*; import arc.util.*; import arc.util.pooling.*; @@ -22,10 +21,7 @@ abstract class StatusComp implements Posc, Flyingc{ @ReadOnly transient float speedMultiplier = 1, damageMultiplier = 1, armorMultiplier = 1, reloadMultiplier = 1; - /** @return damage taken based on status armor multipliers */ - float getShieldDamage(float amount){ - return amount * Mathf.clamp(1f - armorMultiplier / 100f); - } + @Import UnitType type; /** Apply a status effect for 1 tick (for permanent effects) **/ void apply(StatusEffect effect){ @@ -102,7 +98,7 @@ abstract class StatusComp implements Posc, Flyingc{ @Override public void update(){ Floor floor = floorOn(); - if(isGrounded()){ + if(isGrounded() && !type.hovering){ //apply effect apply(floor.status, floor.statusDuration); } diff --git a/core/src/mindustry/entities/comp/SyncComp.java b/core/src/mindustry/entities/comp/SyncComp.java index 0fd3d06cae..8875df0967 100644 --- a/core/src/mindustry/entities/comp/SyncComp.java +++ b/core/src/mindustry/entities/comp/SyncComp.java @@ -13,6 +13,7 @@ abstract class SyncComp implements Entityc{ //all these method bodies are internally generated void snapSync(){} + void snapInterpolation(){} void readSync(Reads read){} void writeSync(Writes write){} void readSyncManual(FloatBuffer buffer){} diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index 85ed95939e..f5a7496451 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -31,6 +31,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health; @Import boolean dead; @Import Team team; + @Import int id; private UnitController controller; private UnitType type; @@ -66,7 +67,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Replace public float clipSize(){ - return type.region.getWidth() * 2f; + return type.region.width * 2f; } @Override @@ -74,6 +75,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I 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; @@ -83,12 +85,25 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I return 0; } + @Override + public Object senseObject(LAccess sensor){ + if(sensor == LAccess.type) return type; + + return noSensed; + } + @Override public double sense(Content content){ if(content == stack().item) return stack().amount; return 0; } + @Override + @Replace + public boolean canDrown(){ + return isGrounded() && !hovering && type.canDrown && !(this instanceof WaterMovec); + } + @Override public int itemCapacity(){ return type.itemCapacity; @@ -223,7 +238,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I //apply knockback based on spawns if(team != state.rules.waveTeam){ - float relativeSize = state.rules.dropZoneRadius + bounds()/2f + 1f; + float relativeSize = state.rules.dropZoneRadius + hitSize/2f + 1f; for(Tile spawn : spawner.getSpawns()){ if(within(spawn.worldx(), spawn.worldy(), relativeSize)){ vel().add(Tmp.v1.set(this).sub(spawn.worldx(), spawn.worldy()).setLength(0.1f + 1f - dst(spawn) / relativeSize).scl(0.45f * Time.delta)); @@ -232,7 +247,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I } //simulate falling down - if(dead){ + if(dead || health <= 0){ //less drag when dead drag = 0.01f; @@ -275,10 +290,10 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I damageContinuous(floor.damageTaken); } - if(!net.client() && tile.solid()){ + if(tile.solid()){ if(type.canBoost){ elevation = 1f; - }else{ + }else if(!net.client()){ kill(); } } @@ -312,9 +327,9 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I /** Actually destroys the unit, removing it and creating explosions. **/ public void destroy(){ - float explosiveness = 2f + item().explosiveness * stack().amount; - float flammability = item().flammability * stack().amount; - Damage.dynamicExplosion(x, y, flammability, explosiveness, 0f, bounds() / 2f, Pal.darkFlame); + float explosiveness = 2f + item().explosiveness * stack().amount / 2f; + float flammability = item().flammability * stack().amount / 2f; + Damage.dynamicExplosion(x, y, flammability, explosiveness, 0f, bounds() / 2f, Pal.darkFlame, state.rules.damageExplosions); float shake = hitSize / 3f; @@ -389,6 +404,6 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I if(dead || net.client()) return; //deaths are synced; this calls killed() - Call.unitDeath(base()); + Call.unitDeath(id); } } diff --git a/core/src/mindustry/entities/comp/WaterMoveComp.java b/core/src/mindustry/entities/comp/WaterMoveComp.java index 92d3fffbf1..9671d694ea 100644 --- a/core/src/mindustry/entities/comp/WaterMoveComp.java +++ b/core/src/mindustry/entities/comp/WaterMoveComp.java @@ -83,12 +83,6 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ } } - @Replace - @Override - public boolean canDrown(){ - return false; - } - @Replace public float floorSpeedMultiplier(){ Floor on = isFlying() ? Blocks.air.asFloor() : floorOn(); diff --git a/core/src/mindustry/entities/comp/WeaponsComp.java b/core/src/mindustry/entities/comp/WeaponsComp.java index 5665bee7db..08472b0609 100644 --- a/core/src/mindustry/entities/comp/WeaponsComp.java +++ b/core/src/mindustry/entities/comp/WeaponsComp.java @@ -16,6 +16,7 @@ import static mindustry.Vars.*; abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ @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; @@ -29,6 +30,10 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ boolean isShooting; float ammo; + float ammof(){ + return ammo / type.ammoCapacity; + } + void setWeaponRotation(float rotation){ for(WeaponMount mount : mounts){ mount.rotation = rotation; diff --git a/core/src/mindustry/entities/units/AIController.java b/core/src/mindustry/entities/units/AIController.java index f2ed8f4476..7ae4447ead 100644 --- a/core/src/mindustry/entities/units/AIController.java +++ b/core/src/mindustry/entities/units/AIController.java @@ -2,7 +2,9 @@ package mindustry.entities.units; import arc.math.*; import arc.math.geom.*; +import arc.util.ArcAnnotate.*; import arc.util.*; +import mindustry.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.type.*; @@ -14,6 +16,8 @@ import static mindustry.Vars.*; public class AIController implements UnitController{ protected static final Vec2 vec = new Vec2(); protected static final int timerTarget = 0; + protected static final int timerTarget2 = 1; + protected static final int timerTarget3 = 2; protected Unit unit; protected Interval timer = new Interval(4); @@ -25,21 +29,37 @@ public class AIController implements UnitController{ { timer.reset(0, Mathf.random(40f)); + timer.reset(1, Mathf.random(60f)); } @Override public void updateUnit(){ + updateVisuals(); updateTargeting(); updateMovement(); } + protected UnitCommand command(){ + return unit.team.data().command; + } + + protected void updateVisuals(){ + + if(unit.isFlying()){ + unit.wobble(); + + if(unit.moving()){ + unit.lookAt(unit.vel.angle()); + } + } + } + protected void updateMovement(){ } protected void updateTargeting(){ if(unit.hasWeapons()){ - updateWeapons(); } } @@ -115,6 +135,10 @@ public class AIController implements UnitController{ } + protected @Nullable Tile getClosestSpawner(){ + return Geometry.findClosest(unit.x, unit.y, Vars.spawner.getSpawns()); + } + protected void circle(Position target, float circleLength){ circle(target, circleLength, unit.type().speed); } diff --git a/core/src/mindustry/entities/units/BuildPlan.java b/core/src/mindustry/entities/units/BuildPlan.java index e8dba045d7..fb4a7a2816 100644 --- a/core/src/mindustry/entities/units/BuildPlan.java +++ b/core/src/mindustry/entities/units/BuildPlan.java @@ -16,8 +16,6 @@ public class BuildPlan{ public @Nullable Block block; /** Whether this is a break request.*/ public boolean breaking; - /** Whether this request comes with a config int. If yes, any blocks placed with this request will not call playerPlaced.*/ - public boolean hasConfig; /** Config int. Not used unless hasConfig is true.*/ public Object config; /** Original position, only used in schematics.*/ @@ -40,6 +38,16 @@ public class BuildPlan{ this.breaking = false; } + /** This creates a build request with a config. */ + public BuildPlan(int x, int y, int rotation, Block block, Object config){ + this.x = x; + this.y = y; + this.rotation = rotation; + this.block = block; + this.breaking = false; + this.config = config; + } + /** This creates a remove request. */ public BuildPlan(int x, int y){ this.x = x; @@ -84,7 +92,6 @@ public class BuildPlan{ copy.rotation = rotation; copy.block = block; copy.breaking = breaking; - copy.hasConfig = hasConfig; copy.config = config; copy.originalX = originalX; copy.originalY = originalY; @@ -127,12 +134,6 @@ public class BuildPlan{ return y*tilesize + block.offset; } - public BuildPlan configure(Object config){ - this.config = config; - this.hasConfig = true; - return this; - } - public @Nullable Tile tile(){ return world.tile(x, y); } diff --git a/core/src/mindustry/entities/units/UnitCommand.java b/core/src/mindustry/entities/units/UnitCommand.java index d04d2481aa..977150a92d 100644 --- a/core/src/mindustry/entities/units/UnitCommand.java +++ b/core/src/mindustry/entities/units/UnitCommand.java @@ -3,7 +3,7 @@ package mindustry.entities.units; import arc.*; public enum UnitCommand{ - attack, retreat, rally, idle; + attack, rally, idle; private final String localized; public static final UnitCommand[] all = values(); diff --git a/core/src/mindustry/game/DefaultWaves.java b/core/src/mindustry/game/DefaultWaves.java index 6abdc46eb5..07269df4c1 100644 --- a/core/src/mindustry/game/DefaultWaves.java +++ b/core/src/mindustry/game/DefaultWaves.java @@ -163,14 +163,14 @@ public class DefaultWaves{ spacing = 3; }}, - new SpawnGroup(UnitTypes.vestige){{ + new SpawnGroup(UnitTypes.scepter){{ begin = 41; unitAmount = 1; unitScaling = 1; spacing = 30; }}, - new SpawnGroup(UnitTypes.cataclyst){{ + new SpawnGroup(UnitTypes.reign){{ begin = 81; unitAmount = 1; unitScaling = 1; diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index 8608f499f6..98622b4bc5 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -30,7 +30,12 @@ public class EventType{ openWiki, teamCoreDamage, socketConfigChanged, - update + update, + draw, + preDraw, + postDraw, + uiDrawBegin, + uiDrawEnd } public static class WinEvent{} @@ -77,7 +82,6 @@ public class EventType{ } } - public static class CommandIssueEvent{ public final Building tile; public final UnitCommand command; @@ -166,11 +170,10 @@ public class EventType{ } } - /** Called from the logic thread. Do not access graphics here! */ - public static class BuildinghangeEvent{ + public static class TileChangeEvent{ public final Tile tile; - public BuildinghangeEvent(Tile tile){ + public TileChangeEvent(Tile tile){ this.tile = tile; } } @@ -221,12 +224,14 @@ public class EventType{ public final Team team; public final @Nullable Unit unit; public final boolean breaking; + public final @Nullable Object config; - public BlockBuildEndEvent(Tile tile, @Nullable Unit unit, Team team, boolean breaking){ + public BlockBuildEndEvent(Tile tile, @Nullable Unit unit, Team team, boolean breaking, @Nullable Object config){ this.tile = tile; this.team = team; this.unit = unit; this.breaking = breaking; + this.config = config; } } diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index d3502845fc..824671dd8c 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -38,6 +38,10 @@ public class Rules{ public boolean canGameOver = true; /** Whether reactors can explode and damage other blocks. */ public boolean reactorExplosions = true; + /** Whether friendly explosions can occur and set fire/damage other blocks. */ + public boolean damageExplosions = true; + /** Whether fire is enabled. */ + public boolean fire = true; /** Whether units use and require ammo. */ public boolean unitAmmo = false; /** How fast unit pads build units. */ @@ -85,9 +89,6 @@ public class Rules{ public boolean enemyLights = true; /** Ambient light color, used when lighting is enabled. */ public Color ambientLight = new Color(0.01f, 0.01f, 0.04f, 0.99f); - /** Multiplier for solar panel power output. - negative = use ambient light if lighting is enabled. */ - public float solarPowerMultiplier = -1f; /** team of the player by default */ public Team defaultTeam = Team.sharded; /** team of the enemy in waves/sectors */ diff --git a/core/src/mindustry/game/Schematic.java b/core/src/mindustry/game/Schematic.java index 01088826bb..334d96cc08 100644 --- a/core/src/mindustry/game/Schematic.java +++ b/core/src/mindustry/game/Schematic.java @@ -12,7 +12,6 @@ import mindustry.world.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.storage.*; import mindustry.world.consumers.*; -import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -43,8 +42,6 @@ public class Schematic implements Publishable, Comparable{ IntIntMap amounts = new IntIntMap(); tiles.each(t -> { - if(t.block.buildVisibility == BuildVisibility.hidden) return; - for(ItemStack stack : t.block.requirements){ amounts.increment(stack.item.id, stack.amount); } diff --git a/core/src/mindustry/game/Schematics.java b/core/src/mindustry/game/Schematics.java index 3c8063d1ac..672f0a23b5 100644 --- a/core/src/mindustry/game/Schematics.java +++ b/core/src/mindustry/game/Schematics.java @@ -28,6 +28,7 @@ import mindustry.io.*; import mindustry.world.*; import mindustry.world.blocks.*; import mindustry.world.blocks.distribution.*; +import mindustry.world.blocks.legacy.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.production.*; import mindustry.world.blocks.sandbox.*; @@ -247,7 +248,7 @@ public class Schematics implements Loadable{ Draw.rect(Tmp.tr1, buffer.getWidth()/2f, buffer.getHeight()/2f, buffer.getWidth(), -buffer.getHeight()); Draw.color(); - Seq requests = schematic.tiles.map(t -> new BuildPlan(t.x, t.y, t.rotation, t.block).configure(t.config)); + Seq requests = schematic.tiles.map(t -> new BuildPlan(t.x, t.y, t.rotation, t.block, t.config)); Draw.flush(); //scale each request to fit schematic @@ -278,7 +279,7 @@ public class Schematics implements Loadable{ /** Creates an array of build requests from a schematic's data, centered on the provided x+y coordinates. */ public Seq toRequests(Schematic schem, int x, int y){ - return schem.tiles.map(t -> new BuildPlan(t.x + x - schem.width/2, t.y + y - schem.height/2, t.rotation, t.block).original(t.x, t.y, schem.width, schem.height).configure(t.config)) + return schem.tiles.map(t -> new BuildPlan(t.x + x - schem.width/2, t.y + y - schem.height/2, t.rotation, t.block, t.config).original(t.x, t.y, schem.width, schem.height)) .removeAll(s -> !s.block.isVisible() || !s.block.unlockedNow()); } @@ -346,9 +347,9 @@ public class Schematics implements Loadable{ for(int cy = y; cy <= y2; cy++){ Building linked = world.build(cx, cy); - if(linked != null &&linked.block().isVisible() && !(linked.block() instanceof BuildBlock)){ - int top = linked.block().size/2; - int bot = linked.block().size % 2 == 1 ? -linked.block().size/2 : -(linked.block().size - 1)/2; + if(linked != null && linked.block.isVisible() && !(linked.block instanceof ConstructBlock)){ + int top = linked.block.size/2; + int bot = linked.block.size % 2 == 1 ? -linked.block.size/2 : -(linked.block.size - 1)/2; minx = Math.min(linked.tileX() + bot, minx); miny = Math.min(linked.tileY() + bot, miny); maxx = Math.max(linked.tileX() + top, maxx); @@ -374,11 +375,11 @@ public class Schematics implements Loadable{ for(int cy = oy; cy <= oy2; cy++){ Building tile = world.build(cx, cy); - if(tile != null && !counted.contains(tile.pos()) && !(tile.block() instanceof BuildBlock) - && (tile.block().isVisible() || (tile.block() instanceof CoreBlock))){ + if(tile != null && !counted.contains(tile.pos()) && !(tile.block instanceof ConstructBlock) + && (tile.block.isVisible() || (tile.block instanceof CoreBlock))){ Object config = tile.config(); - tiles.add(new Stile(tile.block(), tile.tileX() + offsetX, tile.tileY() + offsetY, config, (byte)tile.rotation)); + tiles.add(new Stile(tile.block, tile.tileX() + offsetX, tile.tileY() + offsetY, config, (byte)tile.rotation)); counted.add(tile.pos()); } } @@ -486,8 +487,9 @@ public class Schematics implements Loadable{ IntMap blocks = new IntMap<>(); byte length = stream.readByte(); for(int i = 0; i < length; i++){ - Block block = Vars.content.getByName(ContentType.block, stream.readUTF()); - blocks.put(i, block == null ? Blocks.air : block); + String name = stream.readUTF(); + Block block = Vars.content.getByName(ContentType.block, SaveFileReader.fallback.get(name, name)); + blocks.put(i, block == null || block instanceof LegacyBlock ? Blocks.air : block); } int total = stream.readInt(); diff --git a/core/src/mindustry/game/Teams.java b/core/src/mindustry/game/Teams.java index b9d2f69594..e513c31fc6 100644 --- a/core/src/mindustry/game/Teams.java +++ b/core/src/mindustry/game/Teams.java @@ -102,7 +102,7 @@ public class Teams{ } public void registerCore(CoreBuild core){ - TeamData data = get(core.team()); + TeamData data = get(core.team); //add core if not present if(!data.cores.contains(core)){ data.cores.add(core); @@ -117,7 +117,7 @@ public class Teams{ } public void unregisterCore(CoreBuild entity){ - TeamData data = get(entity.team()); + TeamData data = get(entity.team); //remove core data.cores.remove(entity); //unregister in active list @@ -181,7 +181,7 @@ public class Teams{ /** @return whether this team is controlled by the AI and builds bases. */ public boolean hasAI(){ - return state.rules.attackMode && team.rules().ai; + return team.rules().ai; } @Override diff --git a/core/src/mindustry/game/Tutorial.java b/core/src/mindustry/game/Tutorial.java index bfa18e8e50..e0f73248ed 100644 --- a/core/src/mindustry/game/Tutorial.java +++ b/core/src/mindustry/game/Tutorial.java @@ -250,7 +250,7 @@ public class Tutorial{ Building core = state.teams.playerCores().first(); for(int i = 0; i < blocksToBreak; i++){ - if(world.tile(core.tile().x + blockOffset, core.tile().y + i).block() == Blocks.scrapWall){ + if(world.tile(core.tile.x + blockOffset, core.tile.y + i).block() == Blocks.scrapWall){ return false; } } diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index c38ee07eb9..ec4a666e5e 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -55,9 +55,22 @@ public class Universe{ public void displayTimeEnd(){ if(!headless){ - state.set(State.paused); + //check if any sectors are under attack to display this + Seq attacked = state.getSector().planet.sectors.select(s -> s.hasWaves() && s.hasBase() && !s.isBeingPlayed()); - ui.announce("Next turn incoming."); + 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(); + } } } @@ -140,7 +153,7 @@ public class Universe{ sector.setSecondsPassed(sector.getSecondsPassed() + actuallyPassed); //check if the sector has been attacked too many times... - if(sector.hasBase() && 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)); diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index 97382dd6d7..99996f09eb 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -82,7 +82,7 @@ public class BlockRenderer implements Disposable{ dark.end(); }); - Events.on(BuildinghangeEvent.class, event -> { + Events.on(TileChangeEvent.class, event -> { shadowEvents.add(event.tile); int avgx = (int)(camera.position.x / tilesize); @@ -192,7 +192,9 @@ public class BlockRenderer implements Disposable{ Tile tile = world.rawTile(x, y); Block block = tile.block(); //link to center - if(tile.build != null) tile = tile.build.tile(); + if(tile.build != null){ + tile = tile.build.tile; + } if(block != Blocks.air && block.cacheLayer == CacheLayer.normal && (tile.build == null || !processedEntities.contains(tile.build.id()))){ if(block.expanded || !expanded){ @@ -207,8 +209,8 @@ public class BlockRenderer implements Disposable{ if(tile.build != null && tile.build.power != null && tile.build.power.links.size > 0){ for(Building other : tile.build.getPowerConnections(outArray2)){ - if(other.block() instanceof PowerNode){ //TODO need a generic way to render connections! - tileview.add(other.tile()); + if(other.block instanceof PowerNode){ //TODO need a generic way to render connections! + tileview.add(other.tile); } } } @@ -249,7 +251,7 @@ public class BlockRenderer implements Disposable{ Draw.z(Layer.block); } - if(entity.team() != player.team()){ + if(entity.team != player.team()){ entity.drawTeam(); Draw.z(Layer.block); } diff --git a/core/src/mindustry/graphics/CacheLayer.java b/core/src/mindustry/graphics/CacheLayer.java index 00bd578dc4..d78deca664 100644 --- a/core/src/mindustry/graphics/CacheLayer.java +++ b/core/src/mindustry/graphics/CacheLayer.java @@ -41,7 +41,7 @@ public enum CacheLayer{ } }, normal(5), - walls; + walls(3); public static final CacheLayer[] all = values(); /** Capacity multiplier. */ diff --git a/core/src/mindustry/graphics/Drawf.java b/core/src/mindustry/graphics/Drawf.java index 4b4a00e47d..13c8c87ecb 100644 --- a/core/src/mindustry/graphics/Drawf.java +++ b/core/src/mindustry/graphics/Drawf.java @@ -150,15 +150,14 @@ public class Drawf{ } public static void laser(Team team, TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2, float rotation, float scale){ - Tmp.v1.trns(rotation, 8f * scale * Draw.scl); + float scl = 8f * scale * Draw.scl; + float vx = Mathf.cosDeg(rotation) * scl, vy = Mathf.sinDeg(rotation) * scl; - Draw.rect(edge, x, y, edge.getWidth() * scale * Draw.scl, edge.getHeight() * scale * Draw.scl, rotation + 180); - Draw.rect(edge, x2, y2, edge.getWidth() * scale * Draw.scl, edge.getHeight() * scale * Draw.scl, rotation); + Draw.rect(edge, x, y, edge.width * scale * Draw.scl, edge.height * scale * Draw.scl, rotation + 180); + Draw.rect(edge, x2, y2, edge.width * scale * Draw.scl, edge.height * scale * Draw.scl, rotation); Lines.stroke(12f * scale); - Lines.precise(true); - Lines.line(line, x + Tmp.v1.x, y + Tmp.v1.y, x2 - Tmp.v1.x, y2 - Tmp.v1.y, false, 0f); - Lines.precise(false); + Lines.line(line, x + vx, y + vy, x2 - vx, y2 - vy, false); Lines.stroke(1f); light(team, x, y, x2, y2); @@ -187,7 +186,7 @@ public class Drawf{ Draw.color(Pal.accent); Draw.alpha(speed); - Lines.lineAngleCenter(t.x + Mathf.sin(time, 20f, Vars.tilesize / 2f * t.block().size - 2f), t.y, 90, t.block().size * Vars.tilesize - 4f); + Lines.lineAngleCenter(t.x + Mathf.sin(time, 20f, Vars.tilesize / 2f * t.block.size - 2f), t.y, 90, t.block.size * Vars.tilesize - 4f); Draw.reset(); } diff --git a/core/src/mindustry/graphics/FloorRenderer.java b/core/src/mindustry/graphics/FloorRenderer.java index 43c45ad221..268c4a9a88 100644 --- a/core/src/mindustry/graphics/FloorRenderer.java +++ b/core/src/mindustry/graphics/FloorRenderer.java @@ -228,7 +228,7 @@ public class FloorRenderer implements Disposable{ int chunksx = Mathf.ceil((float)(world.width()) / chunksize), chunksy = Mathf.ceil((float)(world.height()) / chunksize); cache = new Chunk[chunksx][chunksy]; - cbatch = new MultiCacheBatch(chunksize * chunksize * 5); + cbatch = new MultiCacheBatch(chunksize * chunksize * 6); Time.mark(); diff --git a/core/src/mindustry/graphics/IndexedRenderer.java b/core/src/mindustry/graphics/IndexedRenderer.java index 83067c1f96..51389c8fe6 100644 --- a/core/src/mindustry/graphics/IndexedRenderer.java +++ b/core/src/mindustry/graphics/IndexedRenderer.java @@ -68,10 +68,10 @@ public class IndexedRenderer implements Disposable{ public void draw(int index, TextureRegion region, float x, float y, float w, float h){ float fx2 = x + w; float fy2 = y + h; - float u = region.getU(); - float v = region.getV2(); - float u2 = region.getU2(); - float v2 = region.getV(); + float u = region.u; + float v = region.v2; + float u2 = region.u2; + float v2 = region.v; float[] vertices = tmpVerts; float color = this.color; @@ -118,10 +118,10 @@ public class IndexedRenderer implements Disposable{ } public void draw(int index, TextureRegion region, float x, float y, float w, float h, float rotation){ - float u = region.getU(); - float v = region.getV2(); - float u2 = region.getU2(); - float v2 = region.getV(); + float u = region.u; + float v = region.v2; + float u2 = region.u2; + float v2 = region.v; float originX = w / 2, originY = h / 2; diff --git a/core/src/mindustry/graphics/Layer.java b/core/src/mindustry/graphics/Layer.java index 87892852f2..519850a2f9 100644 --- a/core/src/mindustry/graphics/Layer.java +++ b/core/src/mindustry/graphics/Layer.java @@ -5,6 +5,9 @@ public class Layer{ public static final float + //min layer + min = -11, + //background, which may be planets or an image or nothing at all background = -10, @@ -81,7 +84,10 @@ public class Layer{ end = 200, //things after pixelation - used for text - endPixeled = 210 + endPixeled = 210, + + //max layer + max = 220 ; } diff --git a/core/src/mindustry/graphics/LightRenderer.java b/core/src/mindustry/graphics/LightRenderer.java index 63cd3f2783..fbe154a6b9 100644 --- a/core/src/mindustry/graphics/LightRenderer.java +++ b/core/src/mindustry/graphics/LightRenderer.java @@ -58,10 +58,10 @@ public class LightRenderer{ TextureRegion ledge = Core.atlas.find("circle-end"), lmid = Core.atlas.find("circle-mid"); float color = Draw.getColor().toFloatBits(); - float u = lmid.getU(); - float v = lmid.getV2(); - float u2 = lmid.getU2(); - float v2 = lmid.getV(); + float u = lmid.u; + float v = lmid.v2; + float u2 = lmid.u2; + float v2 = lmid.v; Vec2 v1 = Tmp.v1.trnsExact(rot + 90f, stroke); @@ -98,15 +98,15 @@ public class LightRenderer{ vertices[22] = v; vertices[23] = 0; - Draw.vert(ledge.getTexture(), vertices, 0, vertices.length); + Draw.vert(ledge.texture, vertices, 0, vertices.length); Vec2 v3 = Tmp.v2.trnsExact(rot, stroke); - u = ledge.getU(); - v = ledge.getV2(); - u2 = ledge.getU2(); - v2 = ledge.getV(); + u = ledge.u; + v = ledge.v2; + u2 = ledge.u2; + v2 = ledge.v; vertices[0] = lx4; vertices[1] = ly4; @@ -136,7 +136,7 @@ public class LightRenderer{ vertices[22] = v; vertices[23] = 0; - Draw.vert(ledge.getTexture(), vertices, 0, vertices.length); + Draw.vert(ledge.texture, vertices, 0, vertices.length); vertices[0] = lx2; vertices[1] = ly2; @@ -166,7 +166,7 @@ public class LightRenderer{ vertices[22] = v; vertices[23] = 0; - Draw.vert(ledge.getTexture(), vertices, 0, vertices.length); + Draw.vert(ledge.texture, vertices, 0, vertices.length); }); } diff --git a/core/src/mindustry/graphics/LoadRenderer.java b/core/src/mindustry/graphics/LoadRenderer.java index 295205a13d..35674837d6 100644 --- a/core/src/mindustry/graphics/LoadRenderer.java +++ b/core/src/mindustry/graphics/LoadRenderer.java @@ -98,7 +98,6 @@ public class LoadRenderer implements Disposable{ float w = Core.graphics.getWidth(), h = Core.graphics.getHeight(), s = Scl.scl(); //s = 2f; - Lines.precise(true); Draw.proj().setOrtho(0, 0, Core.graphics.getWidth(), Core.graphics.getHeight()); @@ -467,7 +466,6 @@ public class LoadRenderer implements Disposable{ font.draw(red + "[[[[ " + key + " ]]\n"+orange+"<" + Version.modifier + " " + (Version.build == 0 ? " [init]" : Version.build == -1 ? " custom" : " " + Version.build) + ">", w/2f, h/2f + 110*s, Align.center); } - Lines.precise(false); Draw.flush(); fx.end(); diff --git a/core/src/mindustry/graphics/MenuRenderer.java b/core/src/mindustry/graphics/MenuRenderer.java index bc72220c77..5d036ce4e5 100644 --- a/core/src/mindustry/graphics/MenuRenderer.java +++ b/core/src/mindustry/graphics/MenuRenderer.java @@ -50,21 +50,21 @@ public class MenuRenderer implements Disposable{ Simplex s3 = new Simplex(offset + 2); RidgedPerlin rid = new RidgedPerlin(1 + offset, 1); Block[] selected = Structs.select( - new Block[]{Blocks.sand, Blocks.sandRocks}, - new Block[]{Blocks.shale, Blocks.shaleRocks}, - new Block[]{Blocks.ice, Blocks.icerocks}, - new Block[]{Blocks.sand, Blocks.sandRocks}, - new Block[]{Blocks.shale, Blocks.shaleRocks}, - new Block[]{Blocks.ice, Blocks.icerocks}, + new Block[]{Blocks.sand, Blocks.sandWall}, + new Block[]{Blocks.shale, Blocks.shaleWall}, + new Block[]{Blocks.ice, Blocks.iceWall}, + new Block[]{Blocks.sand, Blocks.sandWall}, + new Block[]{Blocks.shale, Blocks.shaleWall}, + new Block[]{Blocks.ice, Blocks.iceWall}, new Block[]{Blocks.moss, Blocks.sporePine} ); Block[] selected2 = Structs.select( - new Block[]{Blocks.ignarock, Blocks.duneRocks}, - new Block[]{Blocks.ignarock, Blocks.duneRocks}, - new Block[]{Blocks.stone, Blocks.rocks}, - new Block[]{Blocks.stone, Blocks.rocks}, - new Block[]{Blocks.moss, Blocks.sporerocks}, - new Block[]{Blocks.salt, Blocks.saltRocks} + new Block[]{Blocks.basalt, Blocks.duneWall}, + new Block[]{Blocks.basalt, Blocks.duneWall}, + new Block[]{Blocks.stone, Blocks.stoneWall}, + new Block[]{Blocks.stone, Blocks.stoneWall}, + new Block[]{Blocks.moss, Blocks.sporeWall}, + new Block[]{Blocks.salt, Blocks.saltWall} ); Block ore1 = ores.random(); @@ -113,7 +113,7 @@ public class MenuRenderer implements Disposable{ if(heat > base){ ore = Blocks.air; wall = Blocks.air; - floor = Blocks.ignarock; + floor = Blocks.basalt; if(heat > base + 0.1){ floor = Blocks.hotrock; @@ -146,7 +146,7 @@ public class MenuRenderer implements Disposable{ floor = Mathf.chance(0.2) ? Blocks.sporeMoss : Blocks.moss; if(wall != Blocks.air){ - wall = Blocks.sporerocks; + wall = Blocks.sporeWall; } } } @@ -243,7 +243,7 @@ public class MenuRenderer implements Disposable{ TextureRegion icon = flyerType.icon(Cicon.full); - float size = Math.max(icon.getWidth(), icon.getHeight()) * Draw.scl * 1.6f; + float size = Math.max(icon.width, icon.height) * Draw.scl * 1.6f; flyers((x, y) -> { Draw.rect(flyerType.region, x - 12f, y - 13f, flyerRot - 90); diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index e0cd9c7a50..bba020f792 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -36,7 +36,11 @@ public class MinimapRenderer implements Disposable{ }); //make sure to call on the graphics thread - Events.on(BuildinghangeEvent.class, event -> Core.app.post(() -> update(event.tile))); + Events.on(TileChangeEvent.class, event -> { + if(!ui.editor.isShown()){ + update(event.tile); + } + }); } public Pixmap getPixmap(){ @@ -119,7 +123,7 @@ public class MinimapRenderer implements Disposable{ dx = Mathf.clamp(dx, sz, world.width() - sz); dy = Mathf.clamp(dy, sz, world.height() - sz); float invTexWidth = 1f / texture.getWidth(); - float invTexHeight = 1f / texture.getHeight(); + float invTexHeight = 1f / texture.height; float x = dx - sz, y = world.height() - dy - sz, width = sz * 2, height = sz * 2; region.set(x * invTexWidth, y * invTexHeight, (x + width) * invTexWidth, (y + height) * invTexHeight); return region; diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index 94a7835b63..ea988e5e78 100644 --- a/core/src/mindustry/graphics/OverlayRenderer.java +++ b/core/src/mindustry/graphics/OverlayRenderer.java @@ -82,7 +82,7 @@ public class OverlayRenderer{ if(select instanceof BlockUnitc){ //special selection for block "units" - Fill.square(select.x, select.y, ((BlockUnitc)select).tile().block().size * tilesize/2f); + Fill.square(select.x, select.y, ((BlockUnitc)select).tile().block.size * tilesize/2f); }else{ Draw.rect(select.type().icon(Cicon.full), select.x(), select.y(), select.rotation() - 90); } @@ -111,7 +111,7 @@ public class OverlayRenderer{ if(dst < state.rules.enemyCoreBuildRadius * 2.2f){ Draw.color(Color.darkGray); Lines.circle(core.x, core.y - 2, state.rules.enemyCoreBuildRadius); - Draw.color(Pal.accent, core.team().color, 0.5f + Mathf.absin(Time.time(), 10f, 0.5f)); + Draw.color(Pal.accent, core.team.color, 0.5f + Mathf.absin(Time.time(), 10f, 0.5f)); Lines.circle(core.x, core.y, state.rules.enemyCoreBuildRadius); } }); @@ -132,23 +132,25 @@ public class OverlayRenderer{ //draw selected block if(input.block == null && !Core.scene.hasMouse()){ Vec2 vec = Core.input.mouseWorld(input.getMouseX(), input.getMouseY()); - Building tile = world.buildWorld(vec.x, vec.y); + Building build = world.buildWorld(vec.x, vec.y); - if(tile != null && tile.team() == player.team()){ - tile.drawSelect(); - if(!tile.enabled && tile.block.drawDisabled){ - tile.drawDisabled(); + if(build != null && build.team == player.team()){ + build.drawSelect(); + if(!build.enabled && build.block.drawDisabled){ + build.drawDisabled(); } - if(Core.input.keyDown(Binding.rotateplaced) && tile.block().rotate && tile.interactable(player.team())){ - control.input.drawArrow(tile.block(), tile.tileX(), tile.tileY(), tile.rotation, true); + if(Core.input.keyDown(Binding.rotateplaced) && build.block.rotate && build.block.quickRotate && build.interactable(player.team())){ + control.input.drawArrow(build.block, build.tileX(), build.tileY(), build.rotation, true); Draw.color(Pal.accent, 0.3f + Mathf.absin(4f, 0.2f)); - Fill.square(tile.x, tile.y, tile.block().size * tilesize/2f); + Fill.square(build.x, build.y, build.block.size * tilesize/2f); Draw.color(); } } } + input.drawOverSelect(); + //draw selection overlay when dropping item if(input.isDroppingItem()){ Vec2 v = Core.input.mouseWorld(input.getMouseX(), input.getMouseY()); @@ -159,11 +161,11 @@ public class OverlayRenderer{ Draw.reset(); Building tile = world.buildWorld(v.x, v.y); - if(tile != null && tile.interactable(player.team()) && tile.acceptStack(player.unit().item(), player.unit().stack.amount, player.unit()) > 0){ + if(tile != null && tile.interactable(player.team()) && tile.acceptStack(player.unit().item(), player.unit().stack.amount, player.unit()) > 0 && player.within(tile, itemTransferRange)){ Lines.stroke(3f, Pal.gray); - Lines.square(tile.x, tile.y, tile.block().size * tilesize / 2f + 3 + Mathf.absin(Time.time(), 5f, 1f)); + Lines.square(tile.x, tile.y, tile.block.size * tilesize / 2f + 3 + Mathf.absin(Time.time(), 5f, 1f)); Lines.stroke(1f, Pal.place); - Lines.square(tile.x, tile.y, tile.block().size * tilesize / 2f + 2 + Mathf.absin(Time.time(), 5f, 1f)); + Lines.square(tile.x, tile.y, tile.block.size * tilesize / 2f + 2 + Mathf.absin(Time.time(), 5f, 1f)); Draw.reset(); } diff --git a/core/src/mindustry/graphics/Pal.java b/core/src/mindustry/graphics/Pal.java index 3bff10a11a..1d154dc5c0 100644 --- a/core/src/mindustry/graphics/Pal.java +++ b/core/src/mindustry/graphics/Pal.java @@ -9,6 +9,8 @@ public class Pal{ command = Color.valueOf("eab678"), sap = Color.valueOf("665c9f"), + sapBullet = Color.valueOf("bf92f9"), + sapBulletBack = Color.valueOf("6d56bf"), spore = Color.valueOf("7457ce"), @@ -44,6 +46,7 @@ public class Pal{ lightishGray = Color.valueOf("a2a2a2"), darkishGray = new Color(0.3f, 0.3f, 0.3f, 1f), darkerGray = new Color(0.2f, 0.2f, 0.2f, 1f), + darkestGray = new Color(0.1f, 0.1f, 0.1f, 1f), ammo = Color.valueOf("ff8947"), rubble = Color.valueOf("1c1817"), diff --git a/core/src/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java index 884f70b84e..a0486fe0e3 100644 --- a/core/src/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -152,9 +152,9 @@ public class Shaders{ setUniformf("u_time", time); setUniformf("u_color", color); setUniformf("u_progress", progress); - setUniformf("u_uv", region.getU(), region.getV()); - setUniformf("u_uv2", region.getU2(), region.getV2()); - setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); + setUniformf("u_uv", region.u, region.v); + setUniformf("u_uv2", region.u2, region.v2); + setUniformf("u_texsize", region.texture.getWidth(), region.texture.height); } } @@ -171,10 +171,10 @@ public class Shaders{ public void apply(){ setUniformf("u_progress", progress); setUniformf("u_color", color); - setUniformf("u_uv", region.getU(), region.getV()); - setUniformf("u_uv2", region.getU2(), region.getV2()); + setUniformf("u_uv", region.u, region.v); + setUniformf("u_uv2", region.u2, region.v2); setUniformf("u_time", Time.time()); - setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); + setUniformf("u_texsize", region.texture.getWidth(), region.texture.height); } } diff --git a/core/src/mindustry/graphics/g3d/PlanetRenderer.java b/core/src/mindustry/graphics/g3d/PlanetRenderer.java index 18611b463b..e0e76c0cee 100644 --- a/core/src/mindustry/graphics/g3d/PlanetRenderer.java +++ b/core/src/mindustry/graphics/g3d/PlanetRenderer.java @@ -37,7 +37,7 @@ public class PlanetRenderer implements Disposable{ /** Camera used for rendering. */ public Camera3D cam = new Camera3D(); /** Raw vertex batch. */ - public final VertexBatch3D batch = new VertexBatch3D(10000, false, true, 0); + public final VertexBatch3D batch = new VertexBatch3D(20000, false, true, 0); public float zoom = 1f; diff --git a/core/src/mindustry/input/Binding.java b/core/src/mindustry/input/Binding.java index 517e50ca69..75655412cb 100644 --- a/core/src/mindustry/input/Binding.java +++ b/core/src/mindustry/input/Binding.java @@ -8,7 +8,8 @@ import arc.input.*; public enum Binding implements KeyBind{ move_x(new Axis(KeyCode.a, KeyCode.d), "general"), move_y(new Axis(KeyCode.s, KeyCode.w)), - mouse_move(KeyCode.mouseForward), + mouse_move(KeyCode.mouseBack), + pan(KeyCode.mouseForward), boost(KeyCode.shiftLeft), control(KeyCode.controlLeft), diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index f69266fa1f..a93a480eae 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -27,24 +27,35 @@ import static mindustry.Vars.*; import static mindustry.input.PlaceMode.*; public class DesktopInput extends InputHandler{ - private Vec2 movement = new Vec2(); + public Vec2 movement = new Vec2(); /** Current cursor type. */ - private Cursor cursorType = SystemCursor.arrow; + public Cursor cursorType = SystemCursor.arrow; /** Position where the player started dragging a line. */ - private int selectX, selectY, schemX, schemY; + public int selectX = -1, selectY = -1, schemX = -1, schemY = -1; /** Last known line positions.*/ - private int lastLineX, lastLineY, schematicX, schematicY; + public int lastLineX, lastLineY, schematicX, schematicY; /** Whether selecting mode is active. */ - private PlaceMode mode; + public PlaceMode mode; /** Animation scale for line. */ - private float selectScale; + public float selectScale; /** Selected build request for movement. */ - private @Nullable BuildPlan sreq; + public @Nullable BuildPlan sreq; /** Whether player is currently deleting removal requests. */ - private boolean deleting = false, shouldShoot = false; + public boolean deleting = false, shouldShoot = false, panning = false; + /** Mouse pan speed. */ + public float panScale = 0.005f, panSpeed = 4.5f, panBoostSpeed = 9f; @Override public void buildUI(Group group){ + group.fill(t -> { + t.visible(() -> Core.settings.getBool("hints") && ui.hudfrag.shown() && !player.dead() && !player.unit().spawnedByCore() && !(Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty())); + t.bottom(); + t.table(Styles.black6, b -> { + b.defaults().left(); + b.label(() -> Core.bundle.format("respawn", Core.keybinds.get(Binding.respawn).key.toString())).style(Styles.outlineLabel); + }).margin(6f); + }); + group.fill(t -> { t.bottom(); t.visible(() -> { @@ -64,28 +75,19 @@ public class DesktopInput extends InputHandler{ }); group.fill(t -> { - t.visible(() -> Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty()); + t.visible(() -> lastSchematic != null && !selectRequests.isEmpty()); t.bottom(); t.table(Styles.black6, b -> { b.defaults().left(); - b.label( () -> Core.bundle.format("schematic.flip", - Core.keybinds.get(Binding.schematic_flip_x).key.toString(), - Core.keybinds.get(Binding.schematic_flip_y).key.toString())).style(Styles.outlineLabel); + b.label(() -> Core.bundle.format("schematic.flip", + Core.keybinds.get(Binding.schematic_flip_x).key.toString(), + Core.keybinds.get(Binding.schematic_flip_y).key.toString())).style(Styles.outlineLabel).visible(() -> Core.settings.getBool("hints")); b.row(); b.table(a -> { a.button("@schematic.add", Icon.save, this::showSchematicSave).colspan(2).size(250f, 50f).disabled(f -> lastSchematic == null || lastSchematic.file != null); }); }).margin(6f); }); - - group.fill(t -> { - t.visible(() -> Core.settings.getBool("hints") && !player.dead() && !player.unit().spawnedByCore()); - t.bottom(); - t.table(Styles.black6, b -> { - b.defaults().left(); - b.label(() -> Core.bundle.format("respawn", Core.keybinds.get(Binding.respawn).key.toString())).style(Styles.outlineLabel); - }).margin(6f); - }); } @Override @@ -96,10 +98,10 @@ public class DesktopInput extends InputHandler{ //draw break selection if(mode == breaking){ - drawBreakSelection(selectX, selectY, cursorX, cursorY); + drawBreakSelection(selectX, selectY, cursorX, cursorY, !Core.input.keyDown(Binding.schematic_select) ? maxLength : Vars.maxSchematicSize); } - if(Core.input.keyDown(Binding.schematic_select) && !Core.scene.hasKeyboard()){ + if(Core.input.keyDown(Binding.schematic_select) && !Core.scene.hasKeyboard() && mode != breaking){ drawSelection(schemX, schemY, cursorX, cursorY, Vars.maxSchematicSize); } @@ -132,14 +134,12 @@ public class DesktopInput extends InputHandler{ } //draw schematic requests - for(BuildPlan request : selectRequests){ - request.animScale = 1f; - drawRequest(request); - } + selectRequests.each(req -> { + req.animScale = 1f; + drawRequest(req); + }); - for(BuildPlan request : selectRequests){ - drawOverRequest(request); - } + selectRequests.each(this::drawOverRequest); if(player.isBuilder()){ //draw things that may be placed soon @@ -180,22 +180,35 @@ public class DesktopInput extends InputHandler{ ui.listfrag.toggle(); } - //TODO awful UI state checking code - if((player.dead() || state.isPaused()) && !ui.chatfrag.shown()){ - if(!(scene.getKeyboardFocus() instanceof TextField) && !scene.hasDialog()){ - //move camera around - float camSpeed = !Core.input.keyDown(Binding.boost) ? 3f : 8f; - Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(Time.delta * camSpeed)); + boolean panCam = false; + float camSpeed = (!Core.input.keyDown(Binding.boost) ? panSpeed : panBoostSpeed) * Time.delta; - if(Core.input.keyDown(Binding.mouse_move)){ - Core.camera.position.x += Mathf.clamp((Core.input.mouseX() - Core.graphics.getWidth() / 2f) * 0.005f, -1, 1) * camSpeed; - Core.camera.position.y += Mathf.clamp((Core.input.mouseY() - Core.graphics.getHeight() / 2f) * 0.005f, -1, 1) * camSpeed; - } + if(input.keyDown(Binding.pan)){ + panCam = true; + panning = true; + } + + if((Math.abs(Core.input.axis(Binding.move_x)) > 0 || Math.abs(Core.input.axis(Binding.move_y)) > 0 || input.keyDown(Binding.mouse_move)) && (!scene.hasField())){ + panning = false; + } + + //TODO awful UI state checking code + if(((player.dead() || state.isPaused()) && !ui.chatfrag.shown()) && (!scene.hasField() && !scene.hasDialog())){ + if(input.keyDown(Binding.mouse_move)){ + panCam = true; } - }else if(!player.dead()){ + 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)); + }else if(!player.dead() && !panning){ Core.camera.position.lerpDelta(player, Core.settings.getBool("smoothcamera") ? 0.08f : 1f); } + if(panCam){ + Core.camera.position.x += Mathf.clamp((Core.input.mouseX() - Core.graphics.getWidth() / 2f) * panScale, -1, 1) * camSpeed; + Core.camera.position.y += Mathf.clamp((Core.input.mouseY() - Core.graphics.getHeight() / 2f) * panScale, -1, 1) * camSpeed; + } + shouldShoot = !scene.hasMouse(); if(!scene.hasMouse()){ @@ -293,7 +306,7 @@ public class DesktopInput extends InputHandler{ cursorType = ui.unloadCursor; } - if(cursor.build != null && cursor.interactable(player.team()) && !isPlacing() && Math.abs(Core.input.axisTap(Binding.rotate)) > 0 && Core.input.keyDown(Binding.rotateplaced) && cursor.block().rotate){ + if(cursor.build != null && cursor.interactable(player.team()) && !isPlacing() && Math.abs(Core.input.axisTap(Binding.rotate)) > 0 && Core.input.keyDown(Binding.rotateplaced) && cursor.block().rotate && cursor.block().quickRotate){ Call.rotateBlock(player, cursor.build, Core.input.axisTap(Binding.rotate) > 0); } } @@ -329,20 +342,19 @@ public class DesktopInput extends InputHandler{ table.button(Icon.paste, Styles.clearPartiali, () -> { ui.schematics.show(); - }).tooltip("Schematics"); + }).tooltip("@schematics"); table.button(Icon.tree, Styles.clearPartiali, () -> { ui.research.show(); - }).visible(() -> state.isCampaign()).tooltip("Research"); + }).visible(() -> state.isCampaign()).tooltip("@research"); table.button(Icon.map, Styles.clearPartiali, () -> { ui.planet.show(); - }).visible(() -> state.isCampaign()).tooltip("Planet Map"); + }).visible(() -> state.isCampaign()).tooltip("@planetmap"); table.button(Icon.up, Styles.clearPartiali, () -> { ui.planet.show(state.getSector(), player.team().core()); - }).visible(() -> state.isCampaign()) - .disabled(b -> player.team().core() == null || !player.team().core().items.has(player.team().core().block.requirements)).tooltip("Launch Core"); + }).visible(() -> state.isCampaign()).tooltip("@launchcore").disabled(b -> player.team().core() == null); } void pollInput(){ @@ -379,7 +391,7 @@ public class DesktopInput extends InputHandler{ player.builder().clearBuilding(); } - if(Core.input.keyTap(Binding.schematic_select) && !Core.scene.hasKeyboard()){ + if(Core.input.keyTap(Binding.schematic_select) && !Core.scene.hasKeyboard() && mode != breaking){ schemX = rawCursorX; schemY = rawCursorY; } @@ -398,12 +410,14 @@ public class DesktopInput extends InputHandler{ selectRequests.clear(); } - if(Core.input.keyRelease(Binding.schematic_select) && !Core.scene.hasKeyboard()){ + if(Core.input.keyRelease(Binding.schematic_select) && !Core.scene.hasKeyboard() && selectX == -1 && selectY == -1 && schemX != -1 && schemY != -1){ lastSchematic = schematics.create(schemX, schemY, rawCursorX, rawCursorY); useSchematic(lastSchematic); if(selectRequests.isEmpty()){ lastSchematic = null; } + schemX = -1; + schemY = -1; } if(!selectRequests.isEmpty()){ @@ -482,6 +496,8 @@ public class DesktopInput extends InputHandler{ mode = breaking; selectX = tileX(Core.input.mouseX()); selectY = tileY(Core.input.mouseY()); + schemX = rawCursorX; + schemY = rawCursorY; } if(Core.input.keyDown(Binding.select) && mode == none && !isPlacing() && deleting){ @@ -502,6 +518,12 @@ public class DesktopInput extends InputHandler{ overrideLineRotation = false; } + if(Core.input.keyRelease(Binding.break_block) && Core.input.keyDown(Binding.schematic_select) && mode == breaking){ + lastSchematic = schematics.create(schemX, schemY, rawCursorX, rawCursorY); + schemX = -1; + schemY = -1; + } + if(Core.input.keyRelease(Binding.break_block) || Core.input.keyRelease(Binding.select)){ if(mode == placing && block != null){ //touch up while placing, place everything in selection @@ -509,8 +531,14 @@ public class DesktopInput extends InputHandler{ lineRequests.clear(); Events.fire(new LineConfirmEvent()); }else if(mode == breaking){ //touch up while breaking, break everything in selection - removeSelection(selectX, selectY, cursorX, cursorY); + removeSelection(selectX, selectY, cursorX, cursorY, !Core.input.keyDown(Binding.schematic_select) ? maxLength : Vars.maxSchematicSize); + if(lastSchematic != null){ + useSchematic(lastSchematic); + lastSchematic = null; + } } + selectX = -1; + selectY = -1; tryDropItems(selected == null ? null : selected.build, Core.input.mouseWorld().x, Core.input.mouseWorld().y); @@ -555,6 +583,8 @@ public class DesktopInput extends InputHandler{ @Override public void updateState(){ + super.updateState(); + if(state.isMenu()){ droppingItem = false; mode = none; @@ -574,7 +604,7 @@ public class DesktopInput extends InputHandler{ //limit speed to minimum formation speed to preserve formation if(unit instanceof Commanderc && ((Commanderc)unit).isCommanding()){ //add a tiny multiplier to let units catch up just in case - baseSpeed = ((Commanderc)unit).minFormationSpeed() * 0.98f; + baseSpeed = ((Commanderc)unit).minFormationSpeed() * 0.95f; } float speed = baseSpeed * Mathf.lerp(1f, unit.type().canBoost ? unit.type().boostMultiplier : 1f, unit.elevation) * strafePenalty; diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index f71d56b517..89ffc7c7c0 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -31,7 +31,7 @@ import mindustry.type.*; import mindustry.ui.fragments.*; import mindustry.world.*; import mindustry.world.blocks.*; -import mindustry.world.blocks.BuildBlock.*; +import mindustry.world.blocks.ConstructBlock.*; import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.storage.CoreBlock.*; @@ -59,16 +59,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public int rotation; public boolean droppingItem; public Group uiGroup; - public boolean isBuilding = true, buildWasAutoPaused = false; + public boolean isBuilding = true, buildWasAutoPaused = false, wasShooting = false; public @Nullable UnitType controlledType; - protected @Nullable Schematic lastSchematic; - protected GestureDetector detector; - protected PlaceLine line = new PlaceLine(); - protected BuildPlan resultreq; - protected BuildPlan brequest = new BuildPlan(); - protected Seq lineRequests = new Seq<>(); - protected Seq selectRequests = new Seq<>(); + public @Nullable Schematic lastSchematic; + public GestureDetector detector; + public PlaceLine line = new PlaceLine(); + public BuildPlan resultreq; + public BuildPlan brequest = new BuildPlan(); + public Seq lineRequests = new Seq<>(); + public Seq selectRequests = new Seq<>(); //methods to override @@ -105,52 +105,107 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.builder().removeBuild(x, y, breaking); } - @Remote(targets = Loc.both, called = Loc.server, forward = true) - public static void pickupUnitPayload(Player player, Unit target){ + @Remote(targets = Loc.both, called = Loc.server) + public static void requestUnitPayload(Player player, Unit target){ + if(player == null) return; + Unit unit = player.unit(); Payloadc pay = (Payloadc)unit; - if(target.isAI() && target.isGrounded() && pay.payloads().size < unit.type().payloadCapacity - && target.mass() < unit.mass() - && target.within(unit, unit.type().hitsize * 1.5f + target.type().hitsize)){ - pay.pickup(target); + if(target.isAI() && target.isGrounded() && pay.canPickup(target) + && target.within(unit, unit.type().hitsize * 2f + target.type().hitsize * 2f)){ + Call.pickedUnitPayload(player, target); } } - @Remote(targets = Loc.both, called = Loc.server, forward = true) - public static void pickupBlockPayload(Player player, Building tile){ + @Remote(targets = Loc.both, called = Loc.server) + public static void requestBlockPayload(Player player, Building tile){ + if(player == null) return; + Unit unit = player.unit(); Payloadc pay = (Payloadc)unit; - if(tile != null && tile.team() == unit.team && pay.payloads().size < unit.type().payloadCapacity - && unit.within(tile, tilesize * tile.block.size * 1.2f)){ + if(tile != null && tile.team == unit.team + && unit.within(tile, tilesize * tile.block.size * 1.2f + tilesize * 5f)){ //pick up block directly - if(tile.block().buildVisibility != BuildVisibility.hidden && tile.block().size <= 2 && tile.canPickup()){ - pay.pickup(tile); + if(tile.block.buildVisibility != BuildVisibility.hidden && tile.canPickup() && pay.canPickup(tile)){ + Call.pickedBlockPayload(player, tile, true); }else{ //pick up block payload Payload current = tile.getPayload(); - if(current != null && current.canBeTaken(pay)){ - Payload taken = tile.takePayload(); - if(taken != null){ - pay.addPayload(taken); - Fx.unitPickup.at(tile); - } + if(current != null && pay.canPickupPayload(current)){ + Call.pickedBlockPayload(player, tile, false); } } } } - @Remote(targets = Loc.both, called = Loc.server, forward = true) - public static void dropPayload(Player player, float x, float y){ + @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; + } + + ((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); + Fx.unitPickup.at(tile); + } + } + } + } + + @Remote(targets = Loc.both, called = Loc.server) + public static void requestDropPayload(Player player, float x, float y){ + if(player == null || net.client()) return; + Payloadc pay = (Payloadc)player.unit(); - //allow a slight margin of error - if(pay.within(x, y, tilesize * 2f)){ - float prevx = pay.x(), prevy = pay.y(); - pay.set(x, y); - pay.dropLastPayload(); - pay.set(prevx, prevy); - } + //apply margin of error + Tmp.v1.set(x, y).sub(pay).limit(tilesize * 4f).add(pay); + float cx = Tmp.v1.x, cy = Tmp.v1.y; + + Call.payloadDropped(player, 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); } @Remote(targets = Loc.client, called = Loc.server) @@ -167,6 +222,8 @@ 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){ + if(tile == null) return; + if(net.server() && (!Units.canInteract(player, tile) || !netServer.admins.allowAction(player, ActionType.rotate, tile.tile(), action -> action.rotation = Mathf.mod(tile.rotation + Mathf.sign(direction), 4)))){ throw new ValidateException(player, "Player cannot rotate a block."); @@ -179,9 +236,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ @Remote(targets = Loc.both, forward = true, called = Loc.server) public static void transferInventory(Player player, Building tile){ - if(player == null || tile == null) return; + if(player == null || tile == null || !player.within(tile, buildingRange)) return; + if(net.server() && (player.unit().stack.amount <= 0 || !Units.canInteract(player, tile) || - !netServer.admins.allowAction(player, ActionType.depositItem, tile.tile(), action -> { + !netServer.admins.allowAction(player, ActionType.depositItem, tile.tile, action -> { action.itemAmount = player.unit().stack.amount; action.item = player.unit().item(); }))){ @@ -208,11 +266,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } @Remote(targets = Loc.both, called = Loc.both, forward = true) - public static void tileConfig(Player player, Building tile, @Nullable Object value){ + public static void tileConfig(@Nullable Player player, Building tile, @Nullable Object value){ if(tile == null) return; if(net.server() && (!Units.canInteract(player, tile) || - !netServer.admins.allowAction(player, ActionType.configure, tile.tile(), action -> action.config = value))) throw new ValidateException(player, "Player cannot configure a tile."); - tile.configured(player, value); + !netServer.admins.allowAction(player, ActionType.configure, tile.tile, action -> action.config = value))) throw new ValidateException(player, "Player cannot configure a tile."); + tile.configured(player == null || player.dead() ? null : player.unit(), value); Core.app.post(() -> Events.fire(new ConfigEvent(tile, player, value))); } @@ -229,11 +287,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.clearUnit(); player.deathTimer = 61f; + ((CoreBuild)((BlockUnitc)unit).tile()).requestSpawn(player); + }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){ - player.unit(unit); + if(!net.client()){ + player.unit(unit); + } + Time.run(Fx.unitSpirit.lifetime, () -> Fx.unitControl.at(unit.x, unit.y, 0f, unit)); if(!player.dead()){ Fx.unitSpirit.at(player.x, player.y, 0f, unit); @@ -290,6 +353,12 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.builder().updateBuilding(isBuilding); } + if(player.shooting && !wasShooting && player.unit().hasWeapons() && state.rules.unitAmmo && player.unit().ammo <= 0){ + player.unit().type().weapons.first().noAmmoSound.at(player.unit()); + } + + wasShooting = player.shooting; + if(!player.dead()){ controlledType = player.unit().type(); } @@ -325,16 +394,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(!(unit instanceof Payloadc)) return; Payloadc pay = (Payloadc)unit; - if(pay.payloads().size >= unit.type().payloadCapacity) return; - - Unit target = Units.closest(player.team(), pay.x(), pay.y(), unit.type().hitsize * 2.5f, u -> u.isAI() && u.isGrounded() && u.mass() < unit.mass() && u.within(unit, u.hitSize + unit.hitSize * 1.2f)); + Unit target = Units.closest(player.team(), pay.x(), pay.y(), unit.type().hitsize * 2.5f, u -> u.isAI() && u.isGrounded() && pay.canPickup(u) && u.within(unit, u.hitSize + unit.hitSize * 1.2f)); if(target != null){ - Call.pickupUnitPayload(player, target); - }else if(!pay.hasPayload()){ + Call.requestUnitPayload(player, target); + }else{ Building tile = world.buildWorld(pay.x(), pay.y()); if(tile != null && tile.team == unit.team){ - Call.pickupBlockPayload(player, tile); + Call.requestBlockPayload(player, tile); } } } @@ -342,10 +409,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public void tryDropPayload(){ Unit unit = player.unit(); if(!(unit instanceof Payloadc)) return; - Payloadc pay = (Payloadc)unit; - Call.dropPayload(player, player.x, player.y); - pay.dropLastPayload(); + Call.requestDropPayload(player, player.x, player.y); } public float getMouseX(){ @@ -365,7 +430,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public void updateState(){ - + if(state.isMenu()){ + controlledType = null; + } } public void drawBottom(){ @@ -376,6 +443,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } + public void drawOverSelect(){ + + } + public void drawSelected(int x, int y, Block block, Color color){ Drawf.selected(x, y, block, color); } @@ -390,7 +461,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public boolean requestMatches(BuildPlan request){ Tile tile = world.tile(request.x, request.y); - return tile != null && tile.block() instanceof BuildBlock && tile.bc().cblock == request.block; + return tile != null && tile.block() instanceof ConstructBlock && tile.bc().cblock == request.block; } public void drawBreaking(int x, int y){ @@ -531,14 +602,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(test.get(req)) return req; } - for(BuildPlan req : selectRequests){ - if(test.get(req)) return req; - } - - return null; + return selectRequests.find(test); } - protected void drawBreakSelection(int x1, int y1, int x2, int y2){ + protected void drawBreakSelection(int x1, int y1, int x2, int y2, int maxLength){ NormalizeDrawResult result = Placement.normalizeDrawArea(Blocks.air, x1, y1, x2, y2, false, maxLength, 1f); NormalizeResult dresult = Placement.normalizeArea(x1, y1, x2, y2, rotation, false, maxLength); @@ -585,6 +652,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y); } + protected void drawBreakSelection(int x1, int y1, int x2, int y2){ + drawBreakSelection(x1, y1, x2, y2, maxLength); + } + protected void drawSelection(int x1, int y1, int x2, int y2, int maxLength){ NormalizeDrawResult result = Placement.normalizeDrawArea(Blocks.air, x1, y1, x2, y2, false, maxLength, 1f); @@ -631,13 +702,6 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ protected void drawRequest(BuildPlan request){ request.block.drawRequest(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation)); - - if(request.block.saveConfig && request.block.lastConfig != null && !request.hasConfig){ - Object conf = request.config; - request.config = request.block.lastConfig; - request.block.drawRequestConfig(request, allRequests()); - request.config = conf; - } } /** Draws a placement icon for a specific block. */ @@ -652,8 +716,18 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ removeSelection(x1, y1, x2, y2, false); } + /** Remove everything from the queue in a selection. */ + protected void removeSelection(int x1, int y1, int x2, int y2, int maxLength){ + removeSelection(x1, y1, x2, y2, false, maxLength); + } + /** Remove everything from the queue in a selection. */ protected void removeSelection(int x1, int y1, int x2, int y2, boolean flush){ + removeSelection(x1, y1, x2, y2, false, maxLength); + } + + /** Remove everything from the queue in a selection. */ + protected void removeSelection(int x1, int y1, int x2, int y2, boolean flush, int maxLength){ NormalizeResult result = Placement.normalizeArea(x1, y1, x2, y2, rotation, false, maxLength); for(int x = 0; x <= Math.abs(result.x2 - result.x); x++){ for(int y = 0; y <= Math.abs(result.y2 - result.y); y++){ @@ -706,7 +780,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ lineRequests.clear(); iterateLine(x1, y1, x2, y2, l -> { rotation = l.rotation; - BuildPlan req = new BuildPlan(l.x, l.y, l.rotation, block); + BuildPlan req = new BuildPlan(l.x, l.y, l.rotation, block, block.nextConfig()); req.animScale = 1f; lineRequests.add(req); }); @@ -735,7 +809,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ boolean consumed = false, showedInventory = false; //check if tapped block is configurable - if(tile.block().configurable && tile.interactable(player.team())){ + if(tile.block.configurable && tile.interactable(player.team())){ consumed = true; if(((!frag.config.isShown() && tile.shouldShowConfigure(player)) //if the config fragment is hidden, show //alternatively, the current selected block can 'agree' to switch config tiles @@ -762,10 +836,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } //consume tap event if necessary - if(tile.interactable(player.team()) && tile.block().consumesTap){ + if(tile.interactable(player.team()) && tile.block.consumesTap){ consumed = true; - }else if(tile.interactable(player.team()) && tile.block().synthetic() && !consumed){ - if(tile.block().hasItems && tile.items.total() > 0){ + }else if(tile.interactable(player.team()) && tile.block.synthetic() && !consumed){ + if(tile.block.hasItems && tile.items.total() > 0){ frag.inv.showFor(tile); consumed = true; showedInventory = true; @@ -866,7 +940,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } Building tile = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); - if(tile instanceof ControlBlock && tile.team() == player.team()){ + if(tile instanceof ControlBlock && tile.team == player.team()){ return ((ControlBlock)tile).unit(); } @@ -935,7 +1009,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ ItemStack stack = player.unit().stack; - if(tile != null && tile.acceptStack(stack.item, stack.amount, player.unit()) > 0 && tile.interactable(player.team()) && tile.block().hasItems && player.unit().stack().amount > 0 && tile.interactable(player.team())){ + if(tile != null && tile.acceptStack(stack.item, stack.amount, player.unit()) > 0 && tile.interactable(player.team()) && tile.block.hasItems && player.unit().stack().amount > 0 && tile.interactable(player.team())){ Call.transferInventory(player, tile); }else{ Call.dropItem(player.angleTo(x, y)); @@ -979,13 +1053,12 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(req != null){ player.builder().plans().remove(req); } - player.builder().addBuild(new BuildPlan(x, y, rotation, block)); + player.builder().addBuild(new BuildPlan(x, y, rotation, block, block.nextConfig())); } public void breakBlock(int x, int y){ Tile tile = world.tile(x, y); - //TODO hacky - if(tile != null && tile.build != null) tile = tile.build.tile(); + if(tile != null && tile.build != null) tile = tile.build.tile; player.builder().addBuild(new BuildPlan(tile.x, tile.y)); } @@ -1001,15 +1074,15 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Draw.rect(Core.atlas.find("place-arrow"), x * tilesize + block.offset + dx*trns, y * tilesize + block.offset - 1 + dy*trns, - Core.atlas.find("place-arrow").getWidth() * Draw.scl, - Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90); + Core.atlas.find("place-arrow").width * Draw.scl, + Core.atlas.find("place-arrow").height * Draw.scl, rotation * 90 - 90); Draw.color(!valid ? Pal.remove : Pal.accent); Draw.rect(Core.atlas.find("place-arrow"), x * tilesize + block.offset + dx*trns, y * tilesize + block.offset + dy*trns, - Core.atlas.find("place-arrow").getWidth() * Draw.scl, - Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90); + Core.atlas.find("place-arrow").width * Draw.scl, + Core.atlas.find("place-arrow").height * Draw.scl, rotation * 90 - 90); } void iterateLine(int startX, int startY, int endX, int endY, Cons cons){ diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index db6a008662..28ffb9e1b6 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -31,39 +31,39 @@ public class MobileInput extends InputHandler implements GestureListener{ /** Maximum speed the player can pan. */ private static final float maxPanSpeed = 1.3f; /** Distance to edge of screen to start panning. */ - private final float edgePan = Scl.scl(60f); + public final float edgePan = Scl.scl(60f); //gesture data - private Vec2 vector = new Vec2(), movement = new Vec2(), targetPos = new Vec2(); - private float lastZoom = -1; + public Vec2 vector = new Vec2(), movement = new Vec2(), targetPos = new Vec2(); + public float lastZoom = -1; /** Position where the player started dragging a line. */ - private int lineStartX, lineStartY, lastLineX, lastLineY; + public int lineStartX, lineStartY, lastLineX, lastLineY; /** Animation scale for line. */ - private float lineScale; + public float lineScale; /** Animation data for crosshair. */ - private float crosshairScale; - private Teamc lastTarget; + public float crosshairScale; + public Teamc lastTarget; /** Used for shifting build requests. */ - private float shiftDeltaX, shiftDeltaY; + public float shiftDeltaX, shiftDeltaY; /** Place requests to be removed. */ - private Seq removals = new Seq<>(); + public Seq removals = new Seq<>(); /** Whether or not the player is currently shifting all placed tiles. */ - private boolean selecting; + public boolean selecting; /** Whether the player is currently in line-place mode. */ - private boolean lineMode, schematicMode; + public boolean lineMode, schematicMode; /** Current place mode. */ - private PlaceMode mode = none; + public PlaceMode mode = none; /** Whether no recipe was available when switching to break mode. */ - private Block lastBlock; + public Block lastBlock; /** Last placed request. Used for drawing block overlay. */ - private BuildPlan lastPlaced; + public BuildPlan lastPlaced; /** Down tracking for panning.*/ - private boolean down = false; + public boolean down = false; - private Teamc target, moveTarget; + public Teamc target, moveTarget; //region utility methods @@ -77,7 +77,7 @@ public class MobileInput extends InputHandler implements GestureListener{ }else{ Building tile = world.buildWorld(x, y); - if(tile != null && player.team().isEnemy(tile.team())){ + if(tile != null && player.team().isEnemy(tile.team)){ player.miner().mineTile(null); target = tile; }else if(tile != null && player.unit().type().canHeal && tile.team == player.team() && tile.damaged()){ @@ -277,7 +277,7 @@ public class MobileInput extends InputHandler implements GestureListener{ public void drawBottom(){ Lines.stroke(1f); - //draw removals + //draw requests about to be removed for(BuildPlan request : removals){ Tile tile = request.tile(); @@ -292,6 +292,43 @@ public class MobileInput extends InputHandler implements GestureListener{ } } + Draw.mixcol(); + Draw.color(Pal.accent); + + //Draw lines + if(lineMode){ + int tileX = tileX(Core.input.mouseX()); + int tileY = tileY(Core.input.mouseY()); + + if(mode == placing && block != null){ + //draw placing + for(int i = 0; i < lineRequests.size; i++){ + BuildPlan request = lineRequests.get(i); + if(i == lineRequests.size - 1 && request.block.rotate){ + drawArrow(block, request.x, request.y, request.rotation); + } + request.block.drawRequest(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation) && getRequest(request.x, request.y, request.block.size, null) == null); + drawSelected(request.x, request.y, request.block, Pal.accent); + } + }else if(mode == breaking){ + drawBreakSelection(lineStartX, lineStartY, tileX, tileY); + } + } + + Draw.reset(); + } + + @Override + public void drawTop(){ + + //draw schematic selection + if(mode == schematicSelect){ + drawSelection(lineStartX, lineStartY, lastLineX, lastLineY, Vars.maxSchematicSize); + } + } + + @Override + public void drawOverSelect(){ //draw list of requests for(BuildPlan request : selectRequests){ Tile tile = request.tile(); @@ -322,29 +359,6 @@ public class MobileInput extends InputHandler implements GestureListener{ } } - Draw.mixcol(); - Draw.color(Pal.accent); - - //Draw lines - if(lineMode){ - int tileX = tileX(Core.input.mouseX()); - int tileY = tileY(Core.input.mouseY()); - - if(mode == placing && block != null){ - //draw placing - for(int i = 0; i < lineRequests.size; i++){ - BuildPlan request = lineRequests.get(i); - if(i == lineRequests.size - 1 && request.block.rotate){ - drawArrow(block, request.x, request.y, request.rotation); - } - request.block.drawRequest(request, allRequests(), validPlace(request.x, request.y, request.block, request.rotation) && getRequest(request.x, request.y, request.block.size, null) == null); - drawSelected(request.x, request.y, request.block, Pal.accent); - } - }else if(mode == breaking){ - drawBreakSelection(lineStartX, lineStartY, tileX, tileY); - } - } - //draw targeting crosshair if(target != null && !state.isEditor()){ if(target != lastTarget){ @@ -366,15 +380,6 @@ public class MobileInput extends InputHandler implements GestureListener{ Draw.reset(); } - @Override - public void drawTop(){ - - //draw schematic selection - if(mode == schematicSelect){ - drawSelection(lineStartX, lineStartY, lastLineX, lastLineY, Vars.maxSchematicSize); - } - } - @Override protected void drawRequest(BuildPlan request){ if(request.tile() == null) return; @@ -553,16 +558,18 @@ public class MobileInput extends InputHandler implements GestureListener{ //ignore off-screen taps if(cursor == null || Core.scene.hasMouse(x, y)) return false; - Tile linked = cursor.build == null ? cursor : cursor.build.tile(); + Tile linked = cursor.build == null ? cursor : cursor.build.tile; - checkTargets(worldx, worldy); + if(!player.dead()){ + checkTargets(worldx, worldy); + } //remove if request present if(hasRequest(cursor)){ removeRequest(getRequest(cursor)); }else if(mode == placing && isPlacing() && validPlace(cursor.x, cursor.y, block, rotation) && !checkOverlapPlacement(cursor.x, cursor.y, block)){ //add to selection queue if it's a valid place position - selectRequests.add(lastPlaced = new BuildPlan(cursor.x, cursor.y, rotation, block)); + selectRequests.add(lastPlaced = new BuildPlan(cursor.x, cursor.y, rotation, block, block.nextConfig())); }else if(mode == breaking && validBreak(linked.x,linked.y) && !hasRequest(linked)){ //add to selection queue if it's a valid BREAK position selectRequests.add(new BuildPlan(linked.x, linked.y)); @@ -850,17 +857,6 @@ public class MobileInput extends InputHandler implements GestureListener{ movement.set(targetPos).sub(player).limit(speed); movement.setAngle(Mathf.slerp(movement.angle(), unit.vel.angle(), 0.05f)); - //pathfind for ground units - if(!flying && !type.canBoost && !(unit instanceof WaterMovec)){ - Tile on = unit.tileOn(); - if(on != null && !on.solid()){ - Tile to = pathfinder.getTargetTile(unit.tileOn(), unit.team, targetPos); - if(to != null){ - movement.set(to).sub(unit).setLength(speed); - } - } - } - if(player.within(targetPos, attractDst)){ movement.setZero(); unit.vel.approachDelta(Vec2.ZERO, type.speed * type.accel / 2f); diff --git a/core/src/mindustry/io/SaveFileReader.java b/core/src/mindustry/io/SaveFileReader.java index 38187ed207..c925dc48a4 100644 --- a/core/src/mindustry/io/SaveFileReader.java +++ b/core/src/mindustry/io/SaveFileReader.java @@ -8,11 +8,7 @@ import mindustry.world.*; import java.io.*; public abstract class SaveFileReader{ - protected final ReusableByteOutStream byteOutput = new ReusableByteOutStream(); - protected final DataOutputStream dataBytes = new DataOutputStream(byteOutput); - protected final ReusableByteOutStream byteOutputSmall = new ReusableByteOutStream(); - protected final DataOutputStream dataBytesSmall = new DataOutputStream(byteOutputSmall); - protected final ObjectMap fallback = ObjectMap.of( + public static final ObjectMap fallback = ObjectMap.of( "dart-mech-pad", "legacy-mech-pad", "dart-ship-pad", "legacy-mech-pad", "javelin-ship-pad", "legacy-mech-pad", @@ -34,10 +30,33 @@ public abstract class SaveFileReader{ "titan-factory", "legacy-unit-factory", "fortress-factory", "legacy-unit-factory", - "command-center", "legacy-command-center", - "mass-conveyor", "payload-conveyor" + "mass-conveyor", "payload-conveyor", + "vestige", "scepter", + "turbine-generator", "steam-generator", + + "rocks", "stone-wall", + "sporerocks", "spore-wall", + "icerocks", "ice-wall", + "dunerocks", "dune-wall", + "sandrocks", "sand-wall", + "shalerocks", "shale-wall", + "snowrocks", "snow-wall", + "saltrocks", "salt-wall", + "dirtwall", "dirt-wall", + + "ignarock", "basalt", + "holostone", "dacite", + "holostone-wall", "dacite-wall", + "rock", "boulder", + "snowrock", "snow-boulder", + "cliffs", "stone-wall" ); + protected final ReusableByteOutStream byteOutput = new ReusableByteOutStream(); + protected final DataOutputStream dataBytes = new DataOutputStream(byteOutput); + protected final ReusableByteOutStream byteOutputSmall = new ReusableByteOutStream(); + protected final DataOutputStream dataBytesSmall = new DataOutputStream(byteOutputSmall); + protected int lastRegionLength; protected void region(String name, DataInput stream, CounterInputStream counter, IORunner cons) throws IOException{ diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index db2746039e..733bb27c28 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -92,6 +92,9 @@ public class TypeIO{ write.b((byte)14); write.i(((byte[])object).length); write.b((byte[])object); + }else if(object instanceof UnitCommand){ + write.b((byte)15); + write.b(((UnitCommand)object).ordinal()); }else{ throw new IllegalArgumentException("Unknown object type: " + object.getClass()); } @@ -116,6 +119,7 @@ public class TypeIO{ case 12: return world.build(read.i()); case 13: return LAccess.all[read.s()]; case 14: int blen = read.i(); byte[] bytes = new byte[blen]; read.b(bytes); return bytes; + case 15: return UnitCommand.all[read.b()]; default: throw new IllegalArgumentException("Unknown object type: " + type); } } @@ -227,7 +231,7 @@ public class TypeIO{ if(!request.breaking){ write.s(request.block.id); write.b((byte)request.rotation); - write.b(request.hasConfig ? (byte)1 : 0); + write.b(1); //always has config writeObject(write, request.config); } } @@ -250,8 +254,9 @@ public class TypeIO{ boolean hasConfig = read.b() == 1; Object config = readObject(read); currentRequest = new BuildPlan(Point2.x(position), Point2.y(position), rotation, content.block(block)); + //should always happen, but is kept for legacy reasons just in case if(hasConfig){ - currentRequest.configure(config); + currentRequest.config = config; } } diff --git a/core/src/mindustry/io/legacy/LegacyIO.java b/core/src/mindustry/io/legacy/LegacyIO.java index 1d0a790159..545487d8ca 100644 --- a/core/src/mindustry/io/legacy/LegacyIO.java +++ b/core/src/mindustry/io/legacy/LegacyIO.java @@ -10,8 +10,8 @@ public class LegacyIO{ /** Maps old unit names to new ones. */ public static final StringMap unitMap = StringMap.of( "titan", "mace", - "chaos-array", "vestige", - "eradicator", "cataclyst", + "chaos-array", "scepter", + "eradicator", "reign", "eruptor", "atrax", "wraith", "flare", "ghoul", "horizon", diff --git a/core/src/mindustry/io/legacy/LegacySaveVersion.java b/core/src/mindustry/io/legacy/LegacySaveVersion.java index 7e78855f7e..cd8302d16d 100644 --- a/core/src/mindustry/io/legacy/LegacySaveVersion.java +++ b/core/src/mindustry/io/legacy/LegacySaveVersion.java @@ -54,7 +54,7 @@ public abstract class LegacySaveVersion extends SaveVersion{ if(block == null) block = Blocks.air; //occupied by multiblock part - boolean occupied = tile.build != null && !tile.isCenter() && (tile.build.block() == block || block == Blocks.air); + boolean occupied = tile.build != null && !tile.isCenter() && (tile.build.block == block || block == Blocks.air); //do not override occupied cells if(!occupied){ @@ -74,10 +74,10 @@ public abstract class LegacySaveVersion extends SaveVersion{ tile.setTeam(Team.get(team)); tile.build.rotation = rotation; - if(tile.build.items != null) tile.build.items.read(Reads.get(stream)); - if(tile.build.power != null) tile.build.power.read(Reads.get(stream)); - if(tile.build.liquids != null) tile.build.liquids.read(Reads.get(stream)); - if(tile.build.cons != null) tile.build.cons.read(Reads.get(stream)); + if(tile.build.items != null) tile.build.items.read(Reads.get(stream), true); + if(tile.build.power != null) tile.build.power.read(Reads.get(stream), true); + if(tile.build.liquids != null) tile.build.liquids.read(Reads.get(stream), true); + if(tile.build.cons != null) tile.build.cons.read(Reads.get(stream), true); //read only from subclasses! tile.build.read(Reads.get(in), version); diff --git a/core/src/mindustry/logic/BinaryOp.java b/core/src/mindustry/logic/BinaryOp.java deleted file mode 100644 index 97601a231d..0000000000 --- a/core/src/mindustry/logic/BinaryOp.java +++ /dev/null @@ -1,46 +0,0 @@ -package mindustry.logic; - -import arc.math.*; - -public enum BinaryOp{ - add("+", (a, b) -> a + b), - sub("-", (a, b) -> a - b), - mul("*", (a, b) -> a * b), - div("/", (a, b) -> a / b), - mod("%", (a, b) -> a % b), - equal("==", (a, b) -> Math.abs(a - b) < 0.000001 ? 1 : 0), - notEqual("not", (a, b) -> Math.abs(a - b) < 0.000001 ? 0 : 1), - lessThan("<", (a, b) -> a < b ? 1 : 0), - lessThanEq("<=", (a, b) -> a <= b ? 1 : 0), - greaterThan(">", (a, b) -> a > b ? 1 : 0), - greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0), - pow("^", Math::pow), - shl(">>", (a, b) -> (int)a >> (int)b), - shr("<<", (a, b) -> (int)a << (int)b), - or("or", (a, b) -> (int)a | (int)b), - and("and", (a, b) -> (int)a & (int)b), - xor("xor", (a, b) -> (int)a ^ (int)b), - max("max", Math::max), - min("min", Math::min), - atan2("atan2", (x, y) -> Mathf.atan2((float)x, (float)y) * Mathf.radDeg), - dst("dst", (x, y) -> Mathf.dst((float)x, (float)y)); - - public static final BinaryOp[] all = values(); - - public final OpLambda function; - public final String symbol; - - BinaryOp(String symbol, OpLambda function){ - this.symbol = symbol; - this.function = function; - } - - @Override - public String toString(){ - return symbol; - } - - interface OpLambda{ - double get(double a, double b); - } -} diff --git a/core/src/mindustry/logic/ConditionOp.java b/core/src/mindustry/logic/ConditionOp.java index c85bc6f37a..2661509c7e 100644 --- a/core/src/mindustry/logic/ConditionOp.java +++ b/core/src/mindustry/logic/ConditionOp.java @@ -1,8 +1,8 @@ package mindustry.logic; public enum ConditionOp{ - equal("==", (a, b) -> Math.abs(a - b) < 0.000001), - notEqual("not", (a, b) -> Math.abs(a - b) >= 0.000001), + equal("==", (a, b) -> Math.abs(a - b) < 0.000001, (a, b) -> a == b), + notEqual("not", (a, b) -> Math.abs(a - b) >= 0.000001, (a, b) -> a != b), lessThan("<", (a, b) -> a < b), lessThanEq("<=", (a, b) -> a <= b), greaterThan(">", (a, b) -> a > b), @@ -10,12 +10,18 @@ public enum ConditionOp{ public static final ConditionOp[] all = values(); + public final CondObjOpLambda objFunction; public final CondOpLambda function; public final String symbol; ConditionOp(String symbol, CondOpLambda function){ + this(symbol, function, null); + } + + ConditionOp(String symbol, CondOpLambda function, CondObjOpLambda objFunction){ this.symbol = symbol; this.function = function; + this.objFunction = objFunction; } @Override @@ -23,6 +29,10 @@ public enum ConditionOp{ return symbol; } + interface CondObjOpLambda{ + boolean get(Object a, Object b); + } + interface CondOpLambda{ boolean get(double a, double b); } diff --git a/core/src/mindustry/logic/LAccess.java b/core/src/mindustry/logic/LAccess.java index 2128028153..30eacf2402 100644 --- a/core/src/mindustry/logic/LAccess.java +++ b/core/src/mindustry/logic/LAccess.java @@ -15,6 +15,7 @@ public enum LAccess{ powerNetIn, powerNetOut, health, + maxHealth, heat, efficiency, rotation, @@ -24,6 +25,7 @@ public enum LAccess{ shootY, shooting, team, + type, //values with parameters are considered controllable enabled("to"), //"to" is standard for single parameter access diff --git a/core/src/mindustry/logic/LAssembler.java b/core/src/mindustry/logic/LAssembler.java index 21a3c95e8b..7ca74ca83c 100644 --- a/core/src/mindustry/logic/LAssembler.java +++ b/core/src/mindustry/logic/LAssembler.java @@ -8,7 +8,7 @@ import mindustry.gen.*; import mindustry.logic.LExecutor.*; import mindustry.logic.LStatements.*; import mindustry.type.*; -import mindustry.world.blocks.logic.*; +import mindustry.world.*; /** "Compiles" a sequence of statements into instructions. */ public class LAssembler{ @@ -39,6 +39,12 @@ public class LAssembler{ putConst("@" + liquid.name, liquid); } + for(Block block : Vars.content.blocks()){ + if(block.synthetic()){ + putConst("@" + block.name, block); + } + } + //store sensor constants for(LAccess sensor : LAccess.all){ @@ -66,7 +72,7 @@ public class LAssembler{ } public static Seq read(String data){ - return read(data, LogicBlock.maxInstructions); + return read(data, LExecutor.maxInstructions); } public static Seq read(String data, int max){ @@ -82,6 +88,8 @@ public class LAssembler{ if(index++ > max) break; + line = line.replace("\t", "").trim(); + try{ String[] arr; @@ -96,7 +104,7 @@ public class LAssembler{ if(c == '"'){ inString = !inString; }else if(c == ' ' && !inString){ - tokens.add(line.substring(lastIdx, i).replace("\\n", "\n")); + tokens.add(line.substring(lastIdx, i)); lastIdx = i + 1; } } @@ -106,6 +114,32 @@ public class LAssembler{ arr = new String[]{line}; } + String type = arr[0]; + + //legacy stuff + if(type.equals("bop")){ + arr[0] = "op"; + + //field order for bop used to be op a, b, result, but now it's op result a b + String res = arr[4]; + arr[4] = arr[3]; + arr[3] = arr[2]; + arr[2] = res; + }else if(type.equals("uop")){ + arr[0] = "op"; + + if(arr[1].equals("negate")){ + arr = new String[]{ + "op", "mul", arr[3], arr[2], "-1" + }; + }else{ + //field order for uop used to be op a, result, but now it's op result a + String res = arr[3]; + arr[3] = arr[2]; + arr[2] = res; + } + } + LStatement st = LogicIO.read(arr); if(st != null){ @@ -121,6 +155,7 @@ public class LAssembler{ } } }catch(Exception parseFailed){ + parseFailed.printStackTrace(); //when parsing fails, add a dummy invalid statement statements.add(new InvalidStatement()); } @@ -135,7 +170,7 @@ public class LAssembler{ //string case if(symbol.startsWith("\"") && symbol.endsWith("\"")){ - return putConst("___" + symbol, symbol.substring(1, symbol.length() - 1)).id; + return putConst("___" + symbol, symbol.substring(1, symbol.length() - 1).replace("\\n", "\n")).id; } try{ diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index 11415c0e97..d626f95388 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -17,19 +17,20 @@ import arc.util.ArcAnnotate.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; -import mindustry.world.blocks.logic.*; public class LCanvas extends Table{ - private static final Color backgroundCol = Pal.darkMetal.cpy().mul(0.1f), gridCol = Pal.darkMetal.cpy().mul(0.5f); - static Seq postDraw = new Seq<>(); - private Vec2 offset = new Vec2(); + //ew static variables + static LCanvas canvas; DragLayout statements; StatementElem dragging; ScrollPane pane; + Group jumps; float targetWidth; public LCanvas(){ + canvas = this; + rebuild(); } @@ -46,12 +47,16 @@ public class LCanvas extends Table{ clear(); statements = new DragLayout(); + jumps = new WidgetGroup(); pane = pane(t -> { t.center(); t.add(statements).pad(2f).center().width(targetWidth); + t.addChild(jumps); + + jumps.cullable = false; }).grow().get(); - pane.setClip(false); + //pane.setClip(false); pane.setFlickScroll(false); //load old scroll percent @@ -77,8 +82,10 @@ public class LCanvas extends Table{ } void load(String asm){ + jumps.clear(); + Seq statements = LAssembler.read(asm); - statements.truncate(LogicBlock.maxInstructions); + statements.truncate(LExecutor.maxInstructions); this.statements.clearChildren(); for(LStatement st : statements){ add(st); @@ -92,16 +99,24 @@ public class LCanvas extends Table{ } @Override - public void draw(){ - postDraw.clear(); - super.draw(); - postDraw.each(Runnable::run); + public void act(float delta){ + super.act(delta); + + if(Core.input.isTouched()){ + float y = Core.input.mouseY(); + float dst = Math.min(y - this.y, Core.graphics.getHeight() - y); + if(dst < Scl.scl(100f)){ //scroll margin + int sign = Mathf.sign(Core.graphics.getHeight()/2f - y); + pane.setScrollY(pane.getScrollY() + sign * Scl.scl(15f)); + } + } } public class DragLayout extends WidgetGroup{ float space = Scl.scl(10f), prefWidth, prefHeight; Seq seq = new Seq<>(); int insertPosition = 0; + boolean invalidated; { setTransform(true); @@ -109,6 +124,7 @@ public class LCanvas extends Table{ @Override public void layout(){ + invalidated = true; float cy = 0; seq.clear(); @@ -156,6 +172,10 @@ public class LCanvas extends Table{ } invalidateHierarchy(); + + if(parent != null && parent instanceof Table){ + setCullingArea(parent.getCullingArea()); + } } @Override @@ -181,7 +201,16 @@ public class LCanvas extends Table{ Tex.pane.draw(lastX, lastY - shiftAmount, width, dragging.getHeight()); } + if(invalidated){ + children.each(c -> c.cullable = false); + } + super.draw(); + + if(invalidated){ + children.each(c -> c.cullable = true); + invalidated = false; + } } void finishLayout(){ @@ -252,7 +281,7 @@ public class LCanvas extends Table{ return false; } - Vec2 v = localToStageCoordinates(Tmp.v1.set(x, y)); + Vec2 v = localToParentCoordinates(Tmp.v1.set(x, y)); lastx = v.x; lasty = v.y; dragging = StatementElem.this; @@ -263,7 +292,7 @@ public class LCanvas extends Table{ @Override public void touchDragged(InputEvent event, float x, float y, int pointer){ - Vec2 v = localToStageCoordinates(Tmp.v1.set(x, y)); + Vec2 v = localToParentCoordinates(Tmp.v1.set(x, y)); translation.add(v.x - lastx, v.y - lasty); lastx = v.x; @@ -317,16 +346,21 @@ public class LCanvas extends Table{ } public static class JumpButton extends ImageButton{ + Color hoverColor = Pal.place; + Color defaultColor = Color.white; @NonNull Prov to; boolean selecting; float mx, my; + ClickListener listener; + StatementElem hovered; - public JumpButton(Color color, @NonNull Prov getter, Cons setter){ + JumpCurve curve; + + public JumpButton(@NonNull Prov getter, Cons setter){ super(Tex.logicNode, Styles.colori); to = getter; - - getStyle().imageUpColor = color; + addListener(listener = new ClickListener()); addListener(new InputListener(){ @Override @@ -362,52 +396,30 @@ public class LCanvas extends Table{ if(to.get() != null && to.get().parent == null){ setter.get(null); } + + setColor(listener.isOver() ? hoverColor : defaultColor); + getStyle().imageUpColor = this.color; }); + + curve = new JumpCurve(this); } @Override - public void draw(){ - super.draw(); + public void act(float delta){ + super.act(delta); - postDraw.add(() -> { - Element hover = to.get() == null && selecting ? hovered() : to.get(); - float tx = 0, ty = 0; - boolean draw = false; - //capture coordinates for use in lambda - float rx = x + translation.x, ry = y + translation.y; + hovered = hovered(); + } - Element p = parent; - while(p != null){ - rx += p.x + p.translation.x; - ry += p.y + p.translation.y; - p = p.parent; - } + @Override + protected void setScene(Scene stage){ + super.setScene(stage); - if(hover != null){ - tx = hover.getX(Align.right) + hover.translation.x; - ty = hover.getY(Align.right) + hover.translation.y; - - Element op = hover.parent; - while(op != null){ - tx += op.x + op.translation.x; - ty += op.y + op.translation.y; - op = op.parent; - } - - draw = true; - }else if(selecting){ - tx = rx + mx; - ty = ry + my; - draw = true; - } - - if(draw){ - drawCurve(rx + width/2f, ry + height/2f, tx, ty, color); - - float s = width; - Tex.logicNode.draw(tx + s*0.75f, ty - s/2f, -s, s); - } - }); + if(stage == null){ + curve.remove(); + }else{ + canvas.jumps.addChild(curve); + } } StatementElem hovered(){ @@ -420,9 +432,60 @@ public class LCanvas extends Table{ if(e == null || isDescendantOf(e)) return null; return (StatementElem)e; } + } - void drawCurve(float x, float y, float x2, float y2, Color color){ - Lines.stroke(4f, color); + public static class JumpCurve extends Element{ + JumpButton button; + + public JumpCurve(JumpButton button){ + this.button = button; + } + + @Override + public void act(float delta){ + super.act(delta); + + if(button.listener.isOver()){ + toFront(); + } + } + + @Override + public void draw(){ + Element hover = button.to.get() == null && button.selecting ? button.hovered : button.to.get(); + boolean draw = false; + Vec2 t = Tmp.v1, r = Tmp.v2; + + Group desc = canvas.pane; + + button.localToAscendantCoordinates(desc, r.set(0, 0)); + + if(hover != null){ + hover.localToAscendantCoordinates(desc, t.set(hover.getWidth(), hover.getHeight()/2f)); + + draw = true; + }else if(button.selecting){ + t.set(r).add(button.mx, button.my); + draw = true; + } + + float offset = canvas.pane.getVisualScrollY() - canvas.pane.getMaxY(); + + t.y += offset; + r.y += offset; + + if(draw){ + drawCurve(r.x + button.getWidth()/2f, r.y + button.getHeight()/2f, t.x, t.y); + + float s = button.getWidth(); + Draw.color(button.color); + Tex.logicNode.draw(t.x + s*0.75f, t.y - s/2f, -s, s); + Draw.reset(); + } + } + + void drawCurve(float x, float y, float x2, float y2){ + Lines.stroke(4f, button.color); Draw.alpha(parentAlpha); float dist = 100f; @@ -432,10 +495,8 @@ public class LCanvas extends Table{ x + dist, y, x2 + dist, y2, x2, y2, - Math.max(20, (int)(Mathf.dst(x, y, x2, y2) / 5)) + Math.max(20, (int)(Mathf.dst(x, y, x2, y2) / 6)) ); - - Draw.reset(); } } } diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index dbdb146513..b532151f1c 100644 --- a/core/src/mindustry/logic/LExecutor.java +++ b/core/src/mindustry/logic/LExecutor.java @@ -3,6 +3,7 @@ package mindustry.logic; import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; +import arc.util.noise.*; import mindustry.*; import mindustry.ctype.*; import mindustry.entities.*; @@ -15,13 +16,19 @@ import mindustry.world.blocks.logic.MessageBlock.*; import static mindustry.Vars.*; public class LExecutor{ + public static final int maxInstructions = 1000; + + //for noise operations + public static final Simplex noise = new Simplex(); + //special variables public static final int varCounter = 0, varTime = 1; public static final int - maxGraphicsBuffer = 512, + maxGraphicsBuffer = 256, + maxDisplayBuffer = 1024, maxTextBuffer = 256; public LInstruction[] instructions = {}; @@ -41,7 +48,8 @@ public class LExecutor{ vars[varTime].numval = Time.millis(); //reset to start - if(vars[varCounter].numval >= instructions.length) vars[varCounter].numval = 0; + if(vars[varCounter].numval >= instructions.length + || vars[varCounter].numval < 0) vars[varCounter].numval = 0; if(vars[varCounter].numval < instructions.length){ instructions[(int)(vars[varCounter].numval++)].run(this); @@ -177,9 +185,7 @@ public class LExecutor{ public void run(LExecutor exec){ int address = exec.numi(index); - if(address >= 0 && address < exec.links.length){ - exec.setobj(output, exec.links[address]); - } + exec.setobj(output, address >= 0 && address < exec.links.length ? exec.links[address] : null); } } @@ -253,18 +259,24 @@ public class LExecutor{ Object target = exec.obj(from); Object sense = exec.obj(type); - double output = 0; - if(target instanceof Senseable){ + Senseable se = (Senseable)target; if(sense instanceof Content){ - output = ((Senseable)target).sense(((Content)sense)); + exec.setnum(to, se.sense(((Content)sense))); }else if(sense instanceof LAccess){ - output = ((Senseable)target).sense(((LAccess)sense)); + Object objOut = se.senseObject((LAccess)sense); + + if(objOut == Senseable.noSensed){ + //numeric output + exec.setnum(to, se.sense((LAccess)sense)); + }else{ + //object output + exec.setobj(to, objOut); + } } + }else{ + exec.setnum(to, 0); } - - exec.setnum(to, output); - } } @@ -379,40 +391,36 @@ public class LExecutor{ } } - public static class BinaryOpI implements LInstruction{ - public BinaryOp op = BinaryOp.add; + public static class OpI implements LInstruction{ + public LogicOp op = LogicOp.add; public int a, b, dest; - public BinaryOpI(BinaryOp op, int a, int b, int dest){ + public OpI(LogicOp op, int a, int b, int dest){ this.op = op; this.a = a; this.b = b; this.dest = dest; } - BinaryOpI(){} + OpI(){} @Override public void run(LExecutor exec){ - exec.setnum(dest, op.function.get(exec.num(a), exec.num(b))); - } - } + if(op.unary){ + exec.setnum(dest, op.function1.get(exec.num(a))); + }else{ + Var va = exec.vars[a]; + Var vb = exec.vars[b]; - public static class UnaryOpI implements LInstruction{ - public UnaryOp op = UnaryOp.negate; - public int value, dest; + if(op.objFunction2 != null && (va.isobj || vb.isobj)){ + //use object function if provided, and one of the variables is an object + exec.setnum(dest, op.objFunction2.get(exec.obj(a), exec.obj(b))); + }else{ + //otherwise use the numeric function + exec.setnum(dest, op.function2.get(exec.num(a), exec.num(b))); + } - public UnaryOpI(UnaryOp op, int value, int dest){ - this.op = op; - this.value = value; - this.dest = dest; - } - - UnaryOpI(){} - - @Override - public void run(LExecutor exec){ - exec.setnum(dest, op.function.get(exec.num(value))); + } } } @@ -478,8 +486,10 @@ public class LExecutor{ Building build = exec.building(target); if(build instanceof LogicDisplayBuild){ LogicDisplayBuild d = (LogicDisplayBuild)build; - for(int i = 0; i < exec.graphicsBuffer.size; i++){ - d.commands.addLast(exec.graphicsBuffer.items[i]); + if(d.commands.size + exec.graphicsBuffer.size < maxDisplayBuffer){ + for(int i = 0; i < exec.graphicsBuffer.size; i++){ + d.commands.addLast(exec.graphicsBuffer.items[i]); + } } exec.graphicsBuffer.clear(); } @@ -503,7 +513,9 @@ public class LExecutor{ //this should avoid any garbage allocation Var v = exec.vars[value]; if(v.isobj && value != 0){ - String strValue = v.objval instanceof String ? (String)v.objval : v.objval == null ? "null" : + String strValue = + v.objval == null ? "null" : + v.objval instanceof String ? (String)v.objval : v.objval instanceof Content ? "[content]" : v.objval instanceof Building ? "[building]" : v.objval instanceof Unit ? "[unit]" : @@ -562,8 +574,21 @@ public class LExecutor{ @Override public void run(LExecutor exec){ - if(address != -1 && op.function.get(exec.num(value), exec.num(compare))){ - exec.vars[varCounter].numval = address; + if(address != -1){ + Var va = exec.vars[value]; + Var vb = exec.vars[compare]; + boolean cmp = false; + + if(op.objFunction != null && (va.isobj || vb.isobj)){ + //use object function if provided, and one of the variables is an object + cmp = op.objFunction.get(exec.obj(value), exec.obj(compare)); + }else{ + cmp = op.function.get(exec.num(value), exec.num(compare)); + } + + if(cmp){ + exec.vars[varCounter].numval = address; + } } } } diff --git a/core/src/mindustry/logic/LStatement.java b/core/src/mindustry/logic/LStatement.java index f7e39c6088..cbe5029d94 100644 --- a/core/src/mindustry/logic/LStatement.java +++ b/core/src/mindustry/logic/LStatement.java @@ -93,7 +93,13 @@ public abstract class LStatement{ Core.scene.add(t); t.update(() -> { - if(b.parent == null) return; + if(b.parent == null || !b.isDescendantOf(Core.scene.root)){ + Core.app.post(() -> { + hitter.remove(); + t.remove(); + }); + return; + } b.localToStageCoordinates(Tmp.v1.set(b.getWidth()/2f, b.getHeight()/2f)); t.setPosition(Tmp.v1.x, Tmp.v1.y, Align.center); diff --git a/core/src/mindustry/logic/LStatements.java b/core/src/mindustry/logic/LStatements.java index bcfbb9c3f3..1a8abf221b 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -1,7 +1,6 @@ package mindustry.logic; import arc.func.*; -import arc.graphics.*; import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; @@ -56,15 +55,23 @@ public class LStatements{ } } - @RegisterStatement("getlink") - public static class GetLinkStatement extends LStatement{ - public String output = "result", address = "0"; + @RegisterStatement("read") + public static class ReadStatement extends LStatement{ + public String output = "result", target = "cell1", address = "0"; @Override public void build(Table table){ + table.add(" read "); + field(table, output, str -> output = str); - table.add(" = link# "); + table.add(" = "); + + fields(table, target, str -> target = str); + + row(table); + + table.add(" at "); field(table, address, str -> address = str); } @@ -76,7 +83,7 @@ public class LStatements{ @Override public LInstruction build(LAssembler builder){ - return new GetLinkI(builder.var(output), builder.var(address)); + return new ReadI(builder.var(target), builder.var(address), builder.var(output)); } } @@ -112,38 +119,6 @@ public class LStatements{ } } - @RegisterStatement("read") - public static class ReadStatement extends LStatement{ - public String output = "result", target = "cell1", address = "0"; - - @Override - public void build(Table table){ - table.add(" read "); - - field(table, output, str -> output = str); - - table.add(" = "); - - fields(table, target, str -> target = str); - - row(table); - - table.add(" at "); - - field(table, address, str -> address = str); - } - - @Override - public LCategory category(){ - return LCategory.io; - } - - @Override - public LInstruction build(LAssembler builder){ - return new ReadI(builder.var(target), builder.var(address), builder.var(output)); - } - } - @RegisterStatement("draw") public static class DrawStatement extends LStatement{ public GraphicsType type = GraphicsType.clear; @@ -253,6 +228,26 @@ public class LStatements{ } } + @RegisterStatement("print") + public static class PrintStatement extends LStatement{ + public String value = "\"frog\""; + + @Override + public void build(Table table){ + field(table, value, str -> value = str).width(0f).growX().padRight(3); + } + + @Override + public LInstruction build(LAssembler builder){ + return new PrintI(builder.var(value)); + } + + @Override + public LCategory category(){ + return LCategory.io; + } + } + @RegisterStatement("drawflush") public static class DrawFlushStatement extends LStatement{ public String target = "display1"; @@ -274,26 +269,6 @@ public class LStatements{ } } - @RegisterStatement("print") - public static class PrintStatement extends LStatement{ - public String value = "\"frog\""; - - @Override - public void build(Table table){ - field(table, value, str -> value = str).width(0f).growX().padRight(3); - } - - @Override - public LInstruction build(LAssembler builder){ - return new PrintI(builder.var(value)); - } - - @Override - public LCategory category(){ - return LCategory.control; - } - } - @RegisterStatement("printflush") public static class PrintFlushStatement extends LStatement{ public String target = "message1"; @@ -315,6 +290,30 @@ public class LStatements{ } } + @RegisterStatement("getlink") + public static class GetLinkStatement extends LStatement{ + public String output = "result", address = "0"; + + @Override + public void build(Table table){ + field(table, output, str -> output = str); + + table.add(" = link# "); + + field(table, address, str -> address = str); + } + + @Override + public LCategory category(){ + return LCategory.blocks; + } + + @Override + public LInstruction build(LAssembler builder){ + return new GetLinkI(builder.var(output), builder.var(address)); + } + } + @RegisterStatement("control") public static class ControlStatement extends LStatement{ public LAccess type = LAccess.enabled; @@ -561,62 +560,51 @@ public class LStatements{ } } - @RegisterStatement("bop") - public static class BinaryOpStatement extends LStatement{ - public BinaryOp op = BinaryOp.add; - public String a = "a", b = "b", dest = "result"; + @RegisterStatement("op") + public static class OperationStatement extends LStatement{ + public LogicOp op = LogicOp.add; + public String dest = "result", a = "a", b = "b"; @Override public void build(Table table){ + rebuild(table); + } + + void rebuild(Table table){ + table.clearChildren(); + field(table, dest, str -> dest = str); table.add(" = "); - row(table); + if(op.unary){ + opButton(table); - field(table, a, str -> a = str); + field(table, a, str -> a = str); + }else{ + row(table); + field(table, a, str -> a = str); + + opButton(table); + + field(table, b, str -> b = str); + } + } + + void opButton(Table table){ table.button(b -> { b.label(() -> op.symbol); - b.clicked(() -> showSelect(b, BinaryOp.all, op, o -> op = o)); + b.clicked(() -> showSelect(b, LogicOp.all, op, o -> { + op = o; + rebuild(table); + })); }, Styles.logict, () -> {}).size(60f, 40f).pad(4f).color(table.color); - - field(table, b, str -> b = str); } @Override public LInstruction build(LAssembler builder){ - return new BinaryOpI(op,builder.var(a), builder.var(b), builder.var(dest)); - } - - @Override - public LCategory category(){ - return LCategory.operations; - } - } - - @RegisterStatement("uop") - public static class UnaryOpStatement extends LStatement{ - public UnaryOp op = UnaryOp.negate; - public String value = "b", dest = "result"; - - @Override - public void build(Table table){ - field(table, dest, str -> dest = str); - - table.add(" = "); - - table.button(b -> { - b.label(() -> op.symbol); - b.clicked(() -> showSelect(b, UnaryOp.all, op, o -> op = o)); - }, Styles.logict, () -> {}).size(50f, 40f).pad(3f).color(table.color); - - field(table, value, str -> value = str); - } - - @Override - public LInstruction build(LAssembler builder){ - return new UnaryOpI(op, builder.var(value), builder.var(dest)); + return new OpI(op,builder.var(a), builder.var(b), builder.var(dest)); } @Override @@ -666,7 +654,7 @@ public class LStatements{ field(table, compare, str -> compare = str); table.add().growX(); - table.add(new JumpButton(Color.white, () -> dest, s -> dest = s)).size(30).right().padLeft(-8); + table.add(new JumpButton(() -> dest, s -> dest = s)).size(30).right().padLeft(-8); } //elements need separate conversion logic diff --git a/core/src/mindustry/logic/LogicDialog.java b/core/src/mindustry/logic/LogicDialog.java index daef141a29..fb97e5c4bc 100644 --- a/core/src/mindustry/logic/LogicDialog.java +++ b/core/src/mindustry/logic/LogicDialog.java @@ -7,7 +7,6 @@ import mindustry.gen.*; import mindustry.logic.LStatements.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; -import mindustry.world.blocks.logic.*; import static mindustry.Vars.*; @@ -21,6 +20,7 @@ public class LogicDialog extends BaseDialog{ clearChildren(); canvas = new LCanvas(); + shouldPause = true; addCloseButton(); buttons.getCells().first().width(170f); @@ -36,7 +36,7 @@ public class LogicDialog extends BaseDialog{ t.button("@schematic.copy.import", Icon.download, style, () -> { dialog.hide(); try{ - canvas.load(Core.app.getClipboardText()); + canvas.load(Core.app.getClipboardText().replace("\r\n", "\n")); }catch(Throwable e){ ui.showException(e); } @@ -61,7 +61,12 @@ public class LogicDialog extends BaseDialog{ for(Prov prov : LogicIO.allStatements){ LStatement example = prov.get(); if(example instanceof InvalidStatement) continue; - t.button(example.name(), Styles.cleart, () -> { + + TextButtonStyle style = new TextButtonStyle(Styles.cleart); + style.fontColor = example.category().color; + style.font = Fonts.outline; + + t.button(example.name(), style, () -> { canvas.add(prov.get()); dialog.hide(); }).size(140f, 50f); @@ -70,7 +75,7 @@ public class LogicDialog extends BaseDialog{ }); dialog.addCloseButton(); dialog.show(); - }).width(170f).disabled(t -> canvas.statements.getChildren().size >= LogicBlock.maxInstructions); + }).width(170f).disabled(t -> canvas.statements.getChildren().size >= LExecutor.maxInstructions); add(canvas).grow(); diff --git a/core/src/mindustry/logic/LogicOp.java b/core/src/mindustry/logic/LogicOp.java new file mode 100644 index 0000000000..126f5bd607 --- /dev/null +++ b/core/src/mindustry/logic/LogicOp.java @@ -0,0 +1,87 @@ +package mindustry.logic; + +import arc.math.*; + +public enum LogicOp{ + add("+", (a, b) -> a + b), + sub("-", (a, b) -> a - b), + mul("*", (a, b) -> a * b), + div("/", (a, b) -> 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), + lessThan("<", (a, b) -> a < b ? 1 : 0), + lessThanEq("<=", (a, b) -> a <= b ? 1 : 0), + greaterThan(">", (a, b) -> a > b ? 1 : 0), + greaterThanEq(">=", (a, b) -> a >= b ? 1 : 0), + pow("^", Math::pow), + shl(">>", (a, b) -> (long)a >> (long)b), + shr("<<", (a, b) -> (long)a << (long)b), + or("or", (a, b) -> (long)a | (long)b), + and("and", (a, b) -> (long)a & (long)b), + xor("xor", (a, b) -> (long)a ^ (long)b), + max("max", Math::max), + min("min", Math::min), + atan2("atan2", (x, y) -> Mathf.atan2((float)x, (float)y) * Mathf.radDeg), + dst("dst", (x, y) -> Mathf.dst((float)x, (float)y)), + noise("noise", LExecutor.noise::rawNoise2D), + + not("not", a -> ~(long)(a)), + abs("abs", a -> Math.abs(a)), + log("log", Math::log), + log10("log10", Math::log10), + sin("sin", d -> Math.sin(d * 0.017453292519943295D)), + cos("cos", d -> Math.cos(d * 0.017453292519943295D)), + tan("tan", d -> Math.tan(d * 0.017453292519943295D)), + floor("floor", Math::floor), + ceil("ceil", Math::ceil), + sqrt("sqrt", Math::sqrt), + rand("rand", d -> Mathf.rand.nextDouble() * d), + + ; + + public static final LogicOp[] all = values(); + + public final OpObjLambda2 objFunction2; + public final OpLambda2 function2; + public final OpLambda1 function1; + public final boolean unary; + public final String symbol; + + LogicOp(String symbol, OpLambda2 function){ + this(symbol, function, null); + } + + LogicOp(String symbol, OpLambda2 function, OpObjLambda2 objFunction){ + this.symbol = symbol; + this.function2 = function; + this.function1 = null; + this.unary = false; + this.objFunction2 = objFunction; + } + + LogicOp(String symbol, OpLambda1 function){ + this.symbol = symbol; + this.function1 = function; + this.function2 = null; + this.unary = true; + this.objFunction2 = null; + } + + @Override + public String toString(){ + return symbol; + } + + interface OpObjLambda2{ + double get(Object a, Object b); + } + + interface OpLambda2{ + double get(double a, double b); + } + + interface OpLambda1{ + double get(double a); + } +} diff --git a/core/src/mindustry/logic/Senseable.java b/core/src/mindustry/logic/Senseable.java index 3f9e3798a4..6ae99afbfa 100644 --- a/core/src/mindustry/logic/Senseable.java +++ b/core/src/mindustry/logic/Senseable.java @@ -3,6 +3,12 @@ package mindustry.logic; import mindustry.ctype.*; public interface Senseable{ + Object noSensed = new Object(); + double sense(LAccess sensor); double sense(Content content); + + default Object senseObject(LAccess sensor){ + return noSensed; + } } diff --git a/core/src/mindustry/logic/UnaryOp.java b/core/src/mindustry/logic/UnaryOp.java deleted file mode 100644 index 80e8fd1ef3..0000000000 --- a/core/src/mindustry/logic/UnaryOp.java +++ /dev/null @@ -1,38 +0,0 @@ -package mindustry.logic; - -import arc.math.*; - -public enum UnaryOp{ - negate("-", a -> -a), - not("not", a -> ~(int)(a)), - abs("abs", Math::abs), - log("log", Math::log), - log10("log10", Math::log10), - sin("sin", d -> Math.sin(d * 0.017453292519943295D)), - cos("cos", d -> Math.cos(d * 0.017453292519943295D)), - tan("tan", d -> Math.tan(d * 0.017453292519943295D)), - floor("floor", Math::floor), - ceil("ceil", Math::ceil), - sqrt("sqrt", Math::sqrt), - rand("rand", d -> Mathf.rand.nextDouble() * d), - ; - - public static final UnaryOp[] all = values(); - - public final UnaryOpLambda function; - public final String symbol; - - UnaryOp(String symbol, UnaryOpLambda function){ - this.symbol = symbol; - this.function = function; - } - - @Override - public String toString(){ - return symbol; - } - - interface UnaryOpLambda{ - double get(double a); - } -} diff --git a/core/src/mindustry/maps/Maps.java b/core/src/mindustry/maps/Maps.java index 137b91bb36..44f8c8db6f 100644 --- a/core/src/mindustry/maps/Maps.java +++ b/core/src/mindustry/maps/Maps.java @@ -292,25 +292,29 @@ public class Maps{ if(str == null || str.isEmpty()){ //create default filters list Seq filters = Seq.with( - new ScatterFilter(){{ - flooronto = Blocks.stone; - block = Blocks.rock; - }}, - new ScatterFilter(){{ - flooronto = Blocks.shale; - block = Blocks.shaleBoulder; - }}, new ScatterFilter(){{ flooronto = Blocks.snow; - block = Blocks.snowrock; + block = Blocks.snowBoulder; }}, new ScatterFilter(){{ flooronto = Blocks.ice; - block = Blocks.snowrock; + block = Blocks.snowBoulder; }}, new ScatterFilter(){{ flooronto = Blocks.sand; block = Blocks.sandBoulder; + }}, + new ScatterFilter(){{ + flooronto = Blocks.dacite; + block = Blocks.daciteBoulder; + }}, + new ScatterFilter(){{ + flooronto = Blocks.stone; + block = Blocks.boulder; + }}, + new ScatterFilter(){{ + flooronto = Blocks.shale; + block = Blocks.shaleBoulder; }} ); diff --git a/core/src/mindustry/maps/SectorDamage.java b/core/src/mindustry/maps/SectorDamage.java index da946ea686..5f4e267d74 100644 --- a/core/src/mindustry/maps/SectorDamage.java +++ b/core/src/mindustry/maps/SectorDamage.java @@ -35,7 +35,8 @@ public class SectorDamage{ if(core != null && !frontier.isEmpty()){ for(Tile spawner : frontier){ //find path from spawn to core - Seq path = Astar.pathfind(spawner, core.tile, t -> t.cost, t -> !(t.block().isStatic() && t.solid())); + //TODO this is broken + Seq path = Astar.pathfind(spawner, core.tile, SectorDamage::cost, t -> !(t.block().isStatic() && t.solid())); int amount = (int)(path.size * fraction); for(int i = 0; i < amount; i++){ Tile t = path.get(i); @@ -104,8 +105,12 @@ public class SectorDamage{ } } } + } - - + static float cost(Tile tile){ + return 1f + + (tile.block().isStatic() && tile.solid() ? 200f : 0f) + + (tile.build != null ? tile.build.health / 40f : 0f) + + (tile.floor().isLiquid ? 10f : 0f); } } diff --git a/core/src/mindustry/maps/filters/NoiseFilter.java b/core/src/mindustry/maps/filters/NoiseFilter.java index 8635966486..1feba11ad1 100644 --- a/core/src/mindustry/maps/filters/NoiseFilter.java +++ b/core/src/mindustry/maps/filters/NoiseFilter.java @@ -11,7 +11,7 @@ import static mindustry.maps.filters.FilterOption.wallsOnly; public class NoiseFilter extends GenerateFilter{ float scl = 40, threshold = 0.5f, octaves = 3f, falloff = 0.5f; - Block floor = Blocks.stone, block = Blocks.rocks; + Block floor = Blocks.stone, block = Blocks.stoneWall; @Override public FilterOption[] options(){ diff --git a/core/src/mindustry/maps/filters/RiverNoiseFilter.java b/core/src/mindustry/maps/filters/RiverNoiseFilter.java index 79755e1e8e..0a462548cc 100644 --- a/core/src/mindustry/maps/filters/RiverNoiseFilter.java +++ b/core/src/mindustry/maps/filters/RiverNoiseFilter.java @@ -11,7 +11,7 @@ import static mindustry.maps.filters.FilterOption.wallsOnly; public class RiverNoiseFilter extends GenerateFilter{ float scl = 40, threshold = 0f, threshold2 = 0.1f; - Block floor = Blocks.water, floor2 = Blocks.deepwater, block = Blocks.sandRocks; + Block floor = Blocks.water, floor2 = Blocks.deepwater, block = Blocks.sandWall; @Override public FilterOption[] options(){ diff --git a/core/src/mindustry/maps/filters/TerrainFilter.java b/core/src/mindustry/maps/filters/TerrainFilter.java index d525f74d14..f6dcaeaf27 100644 --- a/core/src/mindustry/maps/filters/TerrainFilter.java +++ b/core/src/mindustry/maps/filters/TerrainFilter.java @@ -12,7 +12,7 @@ import static mindustry.maps.filters.FilterOption.wallsOnly; public class TerrainFilter extends GenerateFilter{ float scl = 40, threshold = 0.9f, octaves = 3f, falloff = 0.5f, magnitude = 1f, circleScl = 2.1f; - Block floor = Blocks.stone, block = Blocks.rocks; + Block floor = Blocks.stone, block = Blocks.stoneWall; @Override public FilterOption[] options(){ diff --git a/core/src/mindustry/maps/generators/BaseGenerator.java b/core/src/mindustry/maps/generators/BaseGenerator.java index 74672f2fb0..7a752a453a 100644 --- a/core/src/mindustry/maps/generators/BaseGenerator.java +++ b/core/src/mindustry/maps/generators/BaseGenerator.java @@ -15,6 +15,7 @@ import mindustry.world.blocks.defense.*; import mindustry.world.blocks.environment.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.production.*; +import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -26,9 +27,10 @@ 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){ + public void generate(Tiles tiles, Seq cores, Tile spawn, Team team, Sector sector, float difficulty){ this.tiles = tiles; this.team = team; this.cores = cores; @@ -41,16 +43,24 @@ public class BaseGenerator{ 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; - Seq wallsSmall = content.blocks().select(b -> b instanceof Wall && b.size == 1); - Seq wallsLarge = content.blocks().select(b -> b instanceof Wall && b.size == 2); + Seq wallsSmall = content.blocks().select(b -> b instanceof Wall && b.size == 1 && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door)); + Seq wallsLarge = content.blocks().select(b -> b instanceof Wall && b.size == 2 && b.buildVisibility == BuildVisibility.shown && !(b instanceof Door)); - float bracket = 0.1f; + //sort by cost for correct fraction + wallsSmall.sort(b -> b.buildCost); + wallsLarge.sort(b -> b.buildCost); + + //TODO proper difficulty selection + float bracket = difficulty; + float bracketRange = 0.2f; int wallAngle = 70; //180 for full coverage double resourceChance = 0.5; double nonResourceChance = 0.0005; @@ -65,7 +75,7 @@ public class BaseGenerator{ //fill core with every type of item (even non-material) Building entity = tile.build; for(Item item : content.items()){ - entity.items.add(item, entity.block().itemCapacity); + entity.items.add(item, entity.block.itemCapacity); } } @@ -73,13 +83,22 @@ public class BaseGenerator{ pass(tile -> { if(!tile.block().alwaysReplace) return; - if((tile.drop() != null || (tile.floor().liquidDrop != null && Mathf.chance(nonResourceChance * 2))) && Mathf.chance(resourceChance)){ + if(((tile.overlay().asFloor().itemDrop != null || (tile.drop() != null && Mathf.chance(nonResourceChance))) + || (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.random(), tile.x, tile.y); + tryPlace(parts.getFrac(bracket + Mathf.range(bracketRange)), tile.x, tile.y); } }else if(Mathf.chance(nonResourceChance)){ - tryPlace(bases.parts.random(), tile.x, tile.y); + tryPlace(bases.parts.getFrac(bracket + Mathf.range(bracketRange)), tile.x, tile.y); + } + }); + + //replace walls with the correct type (disabled) + if(false) + pass(tile -> { + if(tile.block() instanceof Wall && tile.team() == team && tile.block() != wall && tile.block() != wallLarge){ + tile.setBlock(tile.block().size == 2 ? wallLarge : wall, team); } }); @@ -87,6 +106,7 @@ public class BaseGenerator{ //small walls pass(tile -> { + if(tile.block().alwaysReplace){ boolean any = false; @@ -163,19 +183,20 @@ public class BaseGenerator{ } if(part.required instanceof Item){ + Item item = (Item)part.required; 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){ - tiles.getn(ex, ey).setOverlay(ores.get((Item)part.required)); + set(tiles.getn(ex, ey), item); } Tile rand = tiles.getc(ex + Mathf.range(1), ey + Mathf.range(1)); if(!rand.floor().isLiquid){ //random ores nearby to make it look more natural - rand.setOverlay(ores.get((Item)part.required)); + set(rand, item); } }); } @@ -184,24 +205,43 @@ public class BaseGenerator{ Schematics.place(result, cx + result.width/2, cy + result.height/2, team); - return true; - } + //fill drills with items after placing + if(part.required instanceof Item){ + Item item = (Item)part.required; + for(Stile tile : result.tiles){ + if(tile.block instanceof Drill){ - boolean isTaken(Block block, int x, int y){ - if(block.isMultiblock()){ - int offsetx = -(block.size - 1) / 2; - int offsety = -(block.size - 1) / 2; + Building build = world.tile(tile.x + cx, tile.y + cy).build; - for(int dx = 0; dx < block.size; dx++){ - for(int dy = 0; dy < block.size; dy++){ - if(overlaps(dx + offsetx + x, dy + offsety + y)){ - return true; + if(build != null){ + build.items.add(item, build.block.itemCapacity); } } } + } - }else{ - return overlaps(x, y); + 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)); + } + } + + boolean isTaken(Block block, int x, int y){ + int offsetx = -(block.size - 1) / 2; + int offsety = -(block.size - 1) / 2; + int pad = 1; + + for(int dx = -pad; dx < block.size + pad; dx++){ + for(int dy = -pad; dy < block.size + pad; dy++){ + if(overlaps(dx + offsetx + x, dy + offsety + y)){ + return true; + } + } } return false; diff --git a/core/src/mindustry/maps/generators/BasicGenerator.java b/core/src/mindustry/maps/generators/BasicGenerator.java index d7db4d12ff..542f84cf29 100644 --- a/core/src/mindustry/maps/generators/BasicGenerator.java +++ b/core/src/mindustry/maps/generators/BasicGenerator.java @@ -39,63 +39,6 @@ public abstract class BasicGenerator implements WorldGenerator{ } - //for visual testing only - public void cliffs2(){ - for(Tile tile : tiles){ - tile.setBlock(Blocks.air); - tile.cost = tile.floor().isLiquid ? 0 : (byte)(noise(tile.x, tile.y, 4, 0.5f, 90f, 1) * 5); - } - - for(Tile tile : tiles){ - if(tile.floor().isLiquid) continue; - - int rotation = 0; - for(int i = 0; i < 8; i++){ - Tile other = tiles.get(tile.x + Geometry.d8[i].x, tile.y + Geometry.d8[i].y); - if(other != null && other.cost < tile.cost){ //down slope - rotation |= (1 << i); - } - } - - tile.data = (byte)rotation; - } - - for(Tile tile : tiles){ - if(tile.data != 0){ - int rotation = tile.data; - tile.setBlock(Blocks.cliff); - tile.setOverlay(Blocks.air); - tile.data = (byte)rotation; - } - } - } - - public void cliffs(){ - for(Tile tile : tiles){ - if(!tile.block().isStatic()) continue; - - int rotation = 0; - for(int i = 0; i < 8; i++){ - Tile other = tiles.get(tile.x + Geometry.d8[i].x, tile.y + Geometry.d8[i].y); - if(other != null && !other.block().isStatic()){ - rotation |= (1 << i); - } - } - - if(rotation != 0){ - tile.setBlock(Blocks.cliff); - } - - tile.data = (byte)rotation; - } - - for(Tile tile : tiles){ - if(tile.block() != Blocks.cliff && tile.block().isStatic()){ - tile.setBlock(Blocks.air); - } - } - } - public void median(int radius){ median(radius, 0.5); } @@ -331,18 +274,20 @@ public abstract class BasicGenerator implements WorldGenerator{ } public void inverseFloodFill(Tile start){ + GridBits used = new GridBits(tiles.width, tiles.height); + IntSeq arr = new IntSeq(); arr.add(start.pos()); while(!arr.isEmpty()){ int i = arr.pop(); int x = Point2.x(i), y = Point2.y(i); - tiles.getn(x, y).cost = 2; + used.set(x, y); for(Point2 point : Geometry.d4){ int newx = x + point.x, newy = y + point.y; if(tiles.in(newx, newy)){ Tile child = tiles.getn(newx, newy); - if(child.block() == Blocks.air && child.cost != 2){ - child.cost = 2; + if(child.block() == Blocks.air && !used.get(child.x, child.y)){ + used.set(child.x, child.y); arr.add(child.pos()); } } @@ -350,7 +295,7 @@ public abstract class BasicGenerator implements WorldGenerator{ } for(Tile tile : tiles){ - if(tile.cost != 2 && tile.block() == Blocks.air){ + if(!used.get(tile.x, tile.y) && tile.block() == Blocks.air){ tile.setBlock(tile.floor().wall); } } diff --git a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java index a8dccace17..4e15baf9e1 100644 --- a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java @@ -27,10 +27,10 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ {Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.darksand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.darksandTaintedWater, Blocks.stone, Blocks.stone, Blocks.stone}, {Blocks.water, Blocks.darksandWater, Blocks.darksand, Blocks.sand, Blocks.salt, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.darksandTaintedWater, Blocks.stone, Blocks.stone, Blocks.stone}, {Blocks.water, Blocks.sandWater, Blocks.sand, Blocks.salt, Blocks.salt, Blocks.salt, Blocks.sand, Blocks.stone, Blocks.stone, Blocks.stone, Blocks.snow, Blocks.iceSnow, Blocks.ice}, - {Blocks.deepwater, Blocks.water, Blocks.sandWater, Blocks.sand, Blocks.salt, Blocks.sand, Blocks.sand, Blocks.ignarock, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice}, + {Blocks.deepwater, Blocks.water, Blocks.sandWater, Blocks.sand, Blocks.salt, Blocks.sand, Blocks.sand, Blocks.basalt, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice}, {Blocks.deepwater, Blocks.water, Blocks.sandWater, Blocks.sand, Blocks.sand, Blocks.sand, Blocks.moss, Blocks.iceSnow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.snow, Blocks.ice}, {Blocks.deepwater, Blocks.sandWater, Blocks.sand, Blocks.sand, Blocks.moss, Blocks.moss, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.ice, Blocks.snow, Blocks.ice}, - {Blocks.taintedWater, Blocks.darksandTaintedWater, Blocks.darksand, Blocks.darksand, Blocks.ignarock, Blocks.moss, Blocks.snow, Blocks.snow, Blocks.snow, Blocks.ice, Blocks.snow, Blocks.ice, Blocks.ice}, + {Blocks.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.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}, @@ -284,20 +284,25 @@ public class SerpuloPlanetGenerator extends PlanetGenerator{ float difficulty = sector.baseCoverage; 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); + 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, 1); + state.rules.winWave = 15 * (int)Math.max(difficulty * 5, 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 *= difficulty; + group.unitAmount *= waveScaling; if(group.unitScaling != SpawnGroup.never){ - group.unitScaling *= difficulty; + group.unitScaling /= waveScaling; } } } diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index d4a8087e91..b63a0b17dc 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -241,8 +241,8 @@ public class ContentParser{ readFields(block, value, true); - if(block.size > BuildBlock.maxSize){ - throw new IllegalArgumentException("Blocks cannot be larger than " + BuildBlock.maxSize); + if(block.size > ConstructBlock.maxSize){ + throw new IllegalArgumentException("Blocks cannot be larger than " + ConstructBlock.maxSize); } //add research tech node diff --git a/core/src/mindustry/mod/ModLoadingMusic.java b/core/src/mindustry/mod/ModLoadingMusic.java new file mode 100644 index 0000000000..8797456a18 --- /dev/null +++ b/core/src/mindustry/mod/ModLoadingMusic.java @@ -0,0 +1,79 @@ +package mindustry.mod; + +import arc.audio.*; +import arc.mock.*; +import arc.util.ArcAnnotate.*; + +public class ModLoadingMusic implements Music{ + public @NonNull Music music = new MockMusic(); + + @Override + public void play(){ + music.play(); + } + + @Override + public void pause(){ + music.pause(); + } + + @Override + public void stop(){ + music.stop(); + } + + @Override + public boolean isPlaying(){ + return music.isPlaying(); + } + + @Override + public boolean isLooping(){ + return music.isLooping(); + } + + @Override + public void setLooping(boolean isLooping){ + music.setLooping(isLooping); + } + + @Override + public float getVolume(){ + return music.getVolume(); + } + + @Override + public void setVolume(float volume){ + music.setVolume(volume); + } + + @Override + public void setPan(float pan, float volume){ + music.setPan(pan, volume); + } + + @Override + public float getPosition(){ + return music.getPosition(); + } + + @Override + public void setPosition(float position){ + music.setPosition(position); + } + + @Override + public void dispose(){ + music.dispose(); + } + + @Override + public void setCompletionListener(OnCompletionListener listener){ + music.setCompletionListener(listener); + } + + @Override + public boolean isDisposed(){ + return music.isDisposed(); + } +} diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 03e994d757..42035abf4f 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -192,10 +192,10 @@ public class Mods implements Loadable{ private PageType getPage(AtlasRegion region){ return - region.getTexture() == Core.atlas.find("white").getTexture() ? PageType.main : - region.getTexture() == Core.atlas.find("stone1").getTexture() ? PageType.environment : - region.getTexture() == Core.atlas.find("clear-editor").getTexture() ? PageType.editor : - region.getTexture() == Core.atlas.find("whiteui").getTexture() ? PageType.ui : + region.texture == Core.atlas.find("white").texture ? PageType.main : + region.texture == Core.atlas.find("stone1").texture ? PageType.environment : + region.texture == Core.atlas.find("clear-editor").texture ? PageType.editor : + region.texture == Core.atlas.find("whiteui").texture ? PageType.ui : PageType.main; } @@ -425,6 +425,7 @@ public class Mods implements Loadable{ /** This must be run on the main thread! */ public void loadScripts(){ Time.mark(); + boolean[] any = {false}; try{ eachEnabled(mod -> { @@ -438,6 +439,7 @@ public class Mods implements Loadable{ if(scripts == null){ scripts = platform.createScripts(); } + any[0] = true; scripts.run(mod, main); }catch(Throwable e){ Core.app.post(() -> { @@ -454,7 +456,9 @@ public class Mods implements Loadable{ content.setCurrentMod(null); } - Log.info("Time to initialize modded scripts: @", Time.elapsed()); + if(any[0]){ + Log.info("Time to initialize modded scripts: @", Time.elapsed()); + } } /** Creates all the content found in mod files. */ @@ -588,59 +592,68 @@ public class Mods implements Loadable{ private LoadedMod loadMod(Fi sourceFile) throws Exception{ Time.mark(); - Fi zip = sourceFile.isDirectory() ? sourceFile : new ZipFi(sourceFile); - if(zip.list().length == 1 && zip.list()[0].isDirectory()){ - zip = zip.list()[0]; - } + ZipFi rootZip = null; - Fi metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json"); - if(!metaf.exists()){ - Log.warn("Mod @ doesn't have a 'mod.json'/'mod.hjson'/'plugin.json' file, skipping.", sourceFile); - throw new IllegalArgumentException("Invalid file: No mod.json found."); - } - - ModMeta meta = json.fromJson(ModMeta.class, Jval.read(metaf.readString()).toString(Jformat.plain)); - meta.cleanup(); - String camelized = meta.name.replace(" ", ""); - String mainClass = meta.main == null ? camelized.toLowerCase() + "." + camelized + "Mod" : meta.main; - String baseName = meta.name.toLowerCase().replace(" ", "-"); - - if(mods.contains(m -> m.name.equals(baseName))){ - throw new IllegalArgumentException("A mod with the name '" + baseName + "' is already imported."); - } - - Mod mainMod; - - Fi mainFile = zip; - String[] path = (mainClass.replace('.', '/') + ".class").split("/"); - for(String str : path){ - if(!str.isEmpty()){ - mainFile = mainFile.child(str); - } - } - - //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."); + try{ + Fi zip = sourceFile.isDirectory() ? sourceFile : (rootZip = new ZipFi(sourceFile)); + if(zip.list().length == 1 && zip.list()[0].isDirectory()){ + zip = zip.list()[0]; } - URLClassLoader classLoader = new URLClassLoader(new URL[]{sourceFile.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); - Class main = classLoader.loadClass(mainClass); - metas.put(main, meta); - mainMod = (Mod)main.getDeclaredConstructor().newInstance(); - }else{ - mainMod = null; - } + Fi metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json"); + if(!metaf.exists()){ + Log.warn("Mod @ doesn't have a 'mod.json'/'mod.hjson'/'plugin.json' file, skipping.", sourceFile); + throw new IllegalArgumentException("Invalid file: No mod.json found."); + } - //all plugins are hidden implicitly - if(mainMod instanceof Plugin){ - meta.hidden = true; - } + ModMeta meta = json.fromJson(ModMeta.class, Jval.read(metaf.readString()).toString(Jformat.plain)); + meta.cleanup(); + String camelized = meta.name.replace(" ", ""); + String mainClass = meta.main == null ? camelized.toLowerCase() + "." + camelized + "Mod" : meta.main; + String baseName = meta.name.toLowerCase().replace(" ", "-"); - Log.info("Loaded mod '@' in @", meta.name, Time.elapsed()); - return new LoadedMod(sourceFile, zip, mainMod, meta); + if(mods.contains(m -> m.name.equals(baseName))){ + throw new IllegalArgumentException("A mod with the name '" + baseName + "' is already imported."); + } + + Mod mainMod; + + Fi mainFile = zip; + String[] path = (mainClass.replace('.', '/') + ".class").split("/"); + for(String str : path){ + if(!str.isEmpty()){ + mainFile = mainFile.child(str); + } + } + + //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."); + } + + URLClassLoader classLoader = new URLClassLoader(new URL[]{sourceFile.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); + Class main = classLoader.loadClass(mainClass); + metas.put(main, meta); + mainMod = (Mod)main.getDeclaredConstructor().newInstance(); + }else{ + mainMod = null; + } + + //all plugins are hidden implicitly + if(mainMod instanceof Plugin){ + meta.hidden = true; + } + + Log.info("Loaded mod '@' in @", meta.name, Time.elapsed()); + return new LoadedMod(sourceFile, zip, mainMod, meta); + + }catch(Exception e){ + //delete root zip file so it can be closed on windows + if(rootZip != null) rootZip.delete(); + throw e; + } } /** Represents a mod's state. May be a jar file, folder or zip. */ @@ -694,14 +707,49 @@ public class Mods implements Loadable{ /** @return whether this mod is supported by the game verison */ public boolean isSupported(){ - if(Version.build <= 0 || meta.minGameVersion == null) return true; - if(meta.minGameVersion.contains(".")){ - String[] split = meta.minGameVersion.split("\\."); + if(isOutdated()) return false; + + int major = getMinMajor(), minor = getMinMinor(); + + if(Version.build <= 0) return true; + + return Version.build >= major && Version.revision >= minor; + } + + /** @return whether this mod is outdated, e.g. not compatible with v6. */ + public boolean isOutdated(){ + //must be at least 105 to indicate v6 compat + return getMinMajor() < 105; + } + + public int getMinMajor(){ + int major = 0; + + String ver = meta.minGameVersion == null ? "0" : meta.minGameVersion; + + if(ver.contains(".")){ + String[] split = ver.split("\\."); if(split.length == 2){ - return Version.build >= Strings.parseInt(split[0], 0) && Version.revision >= Strings.parseInt(split[1], 0); + major = Strings.parseInt(split[0], 0); + } + }else{ + major = Strings.parseInt(ver, 0); + } + + return major; + } + + public int getMinMinor(){ + String ver = meta.minGameVersion == null ? "0" : meta.minGameVersion; + + if(ver.contains(".")){ + String[] split = ver.split("\\."); + if(split.length == 2){ + return Strings.parseInt(split[1], 0); } } - return Version.build >= Strings.parseInt(meta.minGameVersion, 0); + + return 0; } @Override @@ -779,7 +827,7 @@ public class Mods implements Loadable{ /** Mod metadata information.*/ public static class ModMeta{ - public String name, displayName, author, description, version, main, minGameVersion; + public String name, displayName, author, description, version, main, minGameVersion = "0"; public Seq dependencies = Seq.with(); /** Hidden mods are only server-side or client-side, and do not support adding new content. */ public boolean hidden; diff --git a/core/src/mindustry/mod/Scripts.java b/core/src/mindustry/mod/Scripts.java index 9a77de94c1..14a9e4326f 100644 --- a/core/src/mindustry/mod/Scripts.java +++ b/core/src/mindustry/mod/Scripts.java @@ -1,7 +1,10 @@ package mindustry.mod; import arc.*; +import arc.assets.*; +import arc.audio.*; import arc.files.*; +import arc.mock.*; import arc.struct.*; import arc.util.*; import arc.util.Log.*; @@ -19,7 +22,7 @@ public class Scripts implements Disposable{ private final Seq blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk", "runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system", ".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream", "org."); - private final Seq whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic."); + private final Seq whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic.", "mindustry.async."); private final Context context; private final Scriptable scope; private boolean errored; @@ -73,7 +76,7 @@ public class Scripts implements Disposable{ Log.log(level, "[@]: @", source, message); } - //utility mod functions + //region utility mod functions public String readString(String path){ return Vars.tree.get(path, true).readString(); @@ -83,6 +86,38 @@ public class Scripts implements Disposable{ return Vars.tree.get(path, true).readBytes(); } + public Sound loadSound(String soundName){ + if(Vars.headless) return new MockSound(); + + String name = "sounds/" + soundName; + String path = Vars.tree.get(name + ".ogg").exists() && !Vars.ios ? name + ".ogg" : name + ".mp3"; + + if(Core.assets.contains(path, Sound.class)) return Core.assets.get(path, Sound.class); + ModLoadingSound sound = new ModLoadingSound(); + AssetDescriptor desc = Core.assets.load(path, Sound.class); + desc.loaded = result -> sound.sound = (Sound)result; + desc.errored = Throwable::printStackTrace; + + return sound; + } + + public Music loadMusic(String soundName){ + if(Vars.headless) return new MockMusic(); + + String name = "music/" + soundName; + String path = Vars.tree.get(name + ".ogg").exists() && !Vars.ios ? name + ".ogg" : name + ".mp3"; + + if(Core.assets.contains(path, Music.class)) return Core.assets.get(path, Music.class); + ModLoadingMusic sound = new ModLoadingMusic(); + AssetDescriptor desc = Core.assets.load(path, Music.class); + desc.loaded = result -> sound.music = (Music)result; + desc.errored = Throwable::printStackTrace; + + return sound; + } + + //endregion + public void run(LoadedMod mod, Fi file){ currentMod = mod; run(file.readString(), file.name(), true); diff --git a/core/src/mindustry/net/Administration.java b/core/src/mindustry/net/Administration.java index 0f289328d0..fde1a9c4fc 100644 --- a/core/src/mindustry/net/Administration.java +++ b/core/src/mindustry/net/Administration.java @@ -5,6 +5,7 @@ import arc.func.*; import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; +import arc.util.Log.*; import arc.util.pooling.Pool.*; import arc.util.pooling.*; import mindustry.*; @@ -18,28 +19,18 @@ import static mindustry.Vars.*; import static mindustry.game.EventType.*; public class Administration{ - /** All player info. Maps UUIDs to info. This persists throughout restarts. */ + public Seq bannedIPs = new Seq<>(); + public Seq whitelist = new Seq<>(); + public Seq chatFilters = new Seq<>(); + public Seq actionFilters = new Seq<>(); + public Seq subnetBans = new Seq<>(); + + /** All player info. Maps UUIDs to info. This persists throughout restarts. Do not access directly. */ private ObjectMap playerInfo = new ObjectMap<>(); - private Seq bannedIPs = new Seq<>(); - private Seq whitelist = new Seq<>(); - private Seq chatFilters = new Seq<>(); - private Seq actionFilters = new Seq<>(); - private Seq subnetBans = new Seq<>(); - private IntIntMap lastPlaced = new IntIntMap(); public Administration(){ load(); - Events.on(ResetEvent.class, e -> lastPlaced = new IntIntMap()); - - //keep track of who placed what on the server - Events.on(BlockBuildEndEvent.class, e -> { - //players should be able to configure their own tiles - if(net.server() && e.unit != null && e.unit.isPlayer()){ - lastPlaced.put(e.tile.pos(), e.unit.getPlayer().id()); - } - }); - //anti-spam addChatFilter((player, message) -> { long resetTime = Config.messageRateLimit.num() * 1000; @@ -72,12 +63,11 @@ public class Administration{ }); //block interaction rate limit + //TODO when someone disconnects, a different player is mistakenly kicked for spamming actions addActionFilter(action -> { if(action.type != ActionType.breakBlock && action.type != ActionType.placeBlock && - Config.antiSpam.bool() && - //make sure players can configure their own stuff, e.g. in schematics - lastPlaced.get(action.tile.pos(), -1) != action.player.id()){ + Config.antiSpam.bool()){ Ratekeeper rate = action.player.getInfo().rate; if(rate.allow(Config.interactRateWindow.num() * 1000, Config.interactRateLimit.num())){ @@ -85,7 +75,7 @@ public class Administration{ }else{ if(rate.occurences > Config.interactRateKick.num()){ action.player.kick("You are interacting with too many blocks.", 1000 * 30); - }else{ + }else if(action.player.getInfo().messageTimer.get(60f * 2f)){ action.player.sendMessage("[scarlet]You are interacting with blocks too quickly."); } @@ -161,7 +151,7 @@ public class Administration{ Core.settings.put("playerlimit", limit); } - public boolean getStrict(){ + public boolean isStrict(){ return Config.strict.bool(); } @@ -572,7 +562,8 @@ public class Administration{ motd("The message displayed to people on connection.", "off"), autosave("Whether the periodically save the map when playing.", false), autosaveAmount("The maximum amount of autosaves. Older ones get replaced.", 10), - autosaveSpacing("Spacing between autosaves in seconds.", 60 * 5); + autosaveSpacing("Spacing between autosaves in seconds.", 60 * 5), + debug("Enable debug logging", false, () -> Log.setLogLevel(debug() ? LogLevel.debug : LogLevel.info)); public static final Config[] all = values(); @@ -631,6 +622,10 @@ public class Administration{ Core.settings.put(key, value); changed.run(); } + + private static boolean debug(){ + return Config.debug.bool(); + } } public static class PlayerInfo{ @@ -648,6 +643,7 @@ public class Administration{ public transient String lastSentMessage; public transient int messageInfractions; public transient Ratekeeper rate = new Ratekeeper(); + public transient Interval messageTimer = new Interval(); PlayerInfo(String id){ this.id = id; diff --git a/core/src/mindustry/net/ArcNetProvider.java b/core/src/mindustry/net/ArcNetProvider.java index 5fce1d1373..ea0146312e 100644 --- a/core/src/mindustry/net/ArcNetProvider.java +++ b/core/src/mindustry/net/ArcNetProvider.java @@ -1,10 +1,10 @@ package mindustry.net; import arc.*; -import arc.struct.*; import arc.func.*; import arc.net.*; import arc.net.FrameworkMessage.*; +import arc.struct.*; import arc.util.*; import arc.util.async.*; import arc.util.pooling.*; @@ -28,7 +28,9 @@ public class ArcNetProvider implements NetProvider{ Thread serverThread; public ArcNetProvider(){ - client = new Client(8192, 4096, new PacketSerializer()); + ArcNet.errorHandler = e -> Log.debug(Strings.getStackTrace(e)); + + client = new Client(8192, 8192, new PacketSerializer()); client.setDiscoveryPacket(packetSupplier); client.addListener(new NetListener(){ @Override @@ -66,7 +68,7 @@ public class ArcNetProvider implements NetProvider{ } }); - server = new Server(4096 * 2, 4096, new PacketSerializer()); + server = new Server(8192, 8192, new PacketSerializer()); server.setMulticast(multicastGroup, multicastPort); server.setDiscoveryHandler((address, handler) -> { ByteBuffer buffer = NetworkIO.writeServerData(); diff --git a/core/src/mindustry/net/BeControl.java b/core/src/mindustry/net/BeControl.java index 5c3e370256..a30308ed52 100644 --- a/core/src/mindustry/net/BeControl.java +++ b/core/src/mindustry/net/BeControl.java @@ -44,6 +44,17 @@ public class BeControl{ } }, updateInterval, updateInterval); } + + if(System.getProperties().contains("becopy")){ + try{ + Fi dest = Fi.get(System.getProperty("becopy")); + Fi self = Fi.get(BeControl.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); + + self.copyTo(dest); + }catch(Throwable e){ + e.printStackTrace(); + } + } } /** asynchronously checks for updates. */ @@ -68,13 +79,7 @@ public class BeControl{ }else{ Core.app.post(() -> done.get(false)); } - }, error -> Core.app.post(() -> { - if(!headless){ - ui.showException(error); - }else{ - error.printStackTrace(); - } - })); + }, error -> {}); //ignore errors } /** @return whether a new update is available */ @@ -89,31 +94,41 @@ public class BeControl{ if(!headless){ checkUpdates = false; ui.showCustomConfirm(Core.bundle.format("be.update", "") + " " + updateBuild, "@be.update.confirm", "@ok", "@be.ignore", () -> { - boolean[] cancel = {false}; - float[] progress = {0}; - int[] length = {0}; - Fi file = bebuildDirectory.child("client-be-" + updateBuild + ".jar"); + try{ + boolean[] cancel = {false}; + float[] progress = {0}; + int[] length = {0}; + Fi file = bebuildDirectory.child("client-be-" + updateBuild + ".jar"); + Fi fileDest = System.getProperties().contains("becopy") ? + Fi.get(System.getProperty("becopy")) : + Fi.get(BeControl.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()); - BaseDialog dialog = new BaseDialog("@be.updating"); - download(updateUrl, file, i -> length[0] = i, v -> progress[0] = v, () -> cancel[0], () -> { - try{ - Runtime.getRuntime().exec(new String[]{"java", "-DlastBuild=" + Version.build, "-Dberestart", "-jar", file.absolutePath()}); - System.exit(0); - }catch(IOException e){ + BaseDialog dialog = new BaseDialog("@be.updating"); + download(updateUrl, file, i -> length[0] = i, v -> progress[0] = v, () -> cancel[0], () -> { + try{ + Runtime.getRuntime().exec(OS.isMac ? + new String[]{"java", "-XstartOnFirstThread", "-DlastBuild=" + Version.build, "-Dberestart", "-Dbecopy=" + fileDest.absolutePath(), "-jar", file.absolutePath()} : + new String[]{"java", "-DlastBuild=" + Version.build, "-Dberestart", "-Dbecopy=" + fileDest.absolutePath(), "-jar", file.absolutePath()} + ); + System.exit(0); + }catch(IOException e){ + ui.showException(e); + } + }, e -> { + dialog.hide(); ui.showException(e); - } - }, e -> { - dialog.hide(); - ui.showException(e); - }); + }); - dialog.cont.add(new Bar(() -> length[0] == 0 ? Core.bundle.get("be.updating") : (int)(progress[0] * length[0]) / 1024/ 1024 + "/" + length[0]/1024/1024 + " MB", () -> Pal.accent, () -> progress[0])).width(400f).height(70f); - dialog.buttons.button("@cancel", Icon.cancel, () -> { - cancel[0] = true; - dialog.hide(); - }).size(210f, 64f); - dialog.setFillParent(false); - dialog.show(); + dialog.cont.add(new Bar(() -> length[0] == 0 ? Core.bundle.get("be.updating") : (int)(progress[0] * length[0]) / 1024/ 1024 + "/" + length[0]/1024/1024 + " MB", () -> Pal.accent, () -> progress[0])).width(400f).height(70f); + dialog.buttons.button("@cancel", Icon.cancel, () -> { + cancel[0] = true; + dialog.hide(); + }).size(210f, 64f); + dialog.setFillParent(false); + dialog.show(); + }catch(Exception e){ + ui.showException(e); + } }, () -> checkUpdates = false); }else{ Log.info("&lcA new update is available: &lyBleeding Edge build @", updateBuild); diff --git a/core/src/mindustry/net/Net.java b/core/src/mindustry/net/Net.java index 8993b84f83..3170a92617 100644 --- a/core/src/mindustry/net/Net.java +++ b/core/src/mindustry/net/Net.java @@ -152,7 +152,9 @@ public class Net{ } public void disconnect(){ - Log.info("Disconnecting."); + if(active && !server){ + Log.info("Disconnecting."); + } provider.disconnectClient(); server = false; active = false; diff --git a/core/src/mindustry/net/NetConnection.java b/core/src/mindustry/net/NetConnection.java index 2cad7d40e8..07de024e7f 100644 --- a/core/src/mindustry/net/NetConnection.java +++ b/core/src/mindustry/net/NetConnection.java @@ -1,6 +1,5 @@ package mindustry.net; -import arc.math.geom.*; import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; @@ -12,15 +11,14 @@ import mindustry.net.Packets.*; import java.io.*; -import static mindustry.Vars.netServer; +import static mindustry.Vars.*; public abstract class NetConnection{ public final String address; public String uuid = "AAAAAAAA", usid = uuid; public boolean mobile, modclient; public @Nullable Player player; - public @Nullable Unitc lastUnit; - public Vec2 lastPosition = new Vec2(); + public boolean kicked = false; /** ID of last received client snapshot. */ public int lastReceivedClientSnapshot = -1; @@ -38,6 +36,8 @@ public abstract class NetConnection{ /** Kick with a special, localized reason. Use this if possible. */ public void kick(KickReason reason){ + if(kicked) return; + Log.info("Kicking connection @; Reason: @", address, reason.name()); if((reason == KickReason.kick || reason == KickReason.banned || reason == KickReason.vote)){ @@ -51,6 +51,7 @@ public abstract class NetConnection{ Time.runTask(2f, this::close); netServer.admins.save(); + kicked = true; } /** Kick with an arbitrary reason. */ @@ -60,6 +61,8 @@ public abstract class NetConnection{ /** Kick with an arbitrary reason, and a kick duration in milliseconds. */ public void kick(String reason, int kickDuration){ + if(kicked) return; + Log.info("Kicking connection @; Reason: @", address, reason.replace("\n", " ")); PlayerInfo info = netServer.admins.getInfo(uuid); @@ -71,6 +74,7 @@ public abstract class NetConnection{ Time.runTask(2f, this::close); netServer.admins.save(); + kicked = true; } public boolean isConnected(){ diff --git a/core/src/mindustry/net/NetworkIO.java b/core/src/mindustry/net/NetworkIO.java index 05bd69fe32..271ea5f9d1 100644 --- a/core/src/mindustry/net/NetworkIO.java +++ b/core/src/mindustry/net/NetworkIO.java @@ -42,6 +42,8 @@ public class NetworkIO{ try(DataInputStream stream = new DataInputStream(is)){ Time.clear(); state.rules = JsonIO.read(Rules.class, stream.readUTF()); + //campaign is not valid in multiplayer + state.rules.sector = null; state.map = new Map(SaveIO.getSaveWriter().readStringMap(stream)); state.wave = stream.readInt(); diff --git a/core/src/mindustry/type/ItemSeq.java b/core/src/mindustry/type/ItemSeq.java index af8436bf44..018d77a10f 100644 --- a/core/src/mindustry/type/ItemSeq.java +++ b/core/src/mindustry/type/ItemSeq.java @@ -11,8 +11,6 @@ import mindustry.world.modules.ItemModule.*; import java.util.*; public class ItemSeq implements Iterable, Serializable{ - private final static ItemStack tmp = new ItemStack(); - protected final int[] values; public int total; diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index e217b3431e..570671de4f 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -205,7 +205,7 @@ public class Planet extends UnlockableContent{ sum += 2f; } - sector.baseCoverage = sum; + sector.baseCoverage = Mathf.clamp(sum / 5f); } } diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index bf20d55b3f..856dd2219d 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -32,6 +32,7 @@ public class Sector{ public @Nullable SaveSlot save; public @Nullable SectorPreset preset; + /** Number 0-1 indicating the difficulty based on nearby bases. */ public float baseCoverage; //TODO implement a dynamic launch period @@ -390,6 +391,8 @@ public class Sector{ /** Has an enemy base. */ base, /** Has spore weather. */ - spores + spores, + /** Path from core to spawns requires traversing water. */ + navalPath } } diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index f2e521cb48..9b8b7f2312 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -48,8 +48,7 @@ public class UnitType extends UnlockableContent{ public boolean canBoost = false; public boolean destructibleWreck = true; public float groundLayer = Layer.groundUnit; - public float sway = 1f; - public int payloadCapacity = 1; + public float payloadCapacity = 8; public int commandLimit = 24; public float visualElevation = -1f; public boolean allowLegStep = false; @@ -63,11 +62,18 @@ public class UnitType extends UnlockableContent{ public float legSplashDamage = 0f, legSplashRange = 5; public boolean flipBackLegs = true; - public int itemCapacity = 30; + public float mechSideSway = 0.54f, mechFrontSway = 0.1f; + public float mechStride = -1f; + public float mechStepShake = -1f; + public boolean mechStepParticles = false; + public Color mechLegColor = Pal.darkMetal; + + public int itemCapacity = -1; public int ammoCapacity = 220; public int mineTier = -1; public float buildSpeed = 1f, mineSpeed = 1f; + public boolean canDrown = true; public float engineOffset = 5f, engineSize = 2.5f; public float strafePenalty = 0.5f; public float hitsize = 6f; @@ -110,6 +116,17 @@ public class UnitType extends UnlockableContent{ return unit; } + public Unit spawn(Team team, float x, float y){ + Unit out = create(team); + out.set(x, y); + out.add(); + return out; + } + + public Unit spawn(float x, float y){ + return spawn(state.rules.defaultTeam, x, y); + } + public boolean hasWeapons(){ return weapons.size > 0; } @@ -120,6 +137,42 @@ public class UnitType extends UnlockableContent{ a.update(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){} @@ -127,7 +180,7 @@ public class UnitType extends UnlockableContent{ public void display(Unit unit, Table table){ table.table(t -> { t.left(); - t.add(new Image(icon(Cicon.medium))).size(8 * 4); + t.add(new Image(icon(Cicon.medium))).size(8 * 4).scaling(Scaling.fit); t.labelWrap(localizedName).left().width(190f).padLeft(5); }).growX().left(); table.row(); @@ -183,6 +236,10 @@ public class UnitType extends UnlockableContent{ singleTarget = weapons.size <= 1; + if(itemCapacity < 0){ + itemCapacity = Math.max(Mathf.round(hitsize * 7, 20), 20); + } + //set up default range if(range < 0){ range = Float.MAX_VALUE; @@ -191,6 +248,15 @@ public class UnitType extends UnlockableContent{ } } + if(mechStride < 0){ + mechStride = 4f + (hitsize-8f)/2.1f; + } + + if(mechStepShake < 0){ + mechStepShake = Mathf.round((hitsize - 11f) / 9f); + mechStepParticles = hitsize > 15f; + } + canHeal = weapons.contains(w -> w.bullet instanceof HealBulletType); //add mirrored weapon variants @@ -254,25 +320,29 @@ public class UnitType extends UnlockableContent{ //region drawing public void draw(Unit unit){ - Mechc legs = unit instanceof Mechc ? (Mechc)unit : null; - float z = unit.elevation > 0.5f ? (lowAltitude ? Layer.flyingUnitLow : Layer.flyingUnit) : groundLayer; + 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); if(unit.controller().isBeingControlled(player.unit())){ drawControl(unit); } - if(unit.isFlying()){ + if(unit.isFlying() || visualElevation > 0){ Draw.z(Math.min(Layer.darkness, z - 1f)); drawShadow(unit); } Draw.z(z - 0.02f); - if(legs != null){ - drawMech((Unit & Mechc)legs); + if(mech != null){ + drawMech(mech); + + //side + legOffset.trns(mech.baseRotation(), 0f, Mathf.lerp(Mathf.sin(walkExtend(mech, 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))); - float ft = Mathf.sin(legs.walkTime(), 3f, 3f); - legOffset.trns(legs.baseRotation(), 0f, Mathf.lerp(ft * 0.18f * sway, 0f, unit.elevation)); unit.trns(legOffset.x, legOffset.y); } @@ -300,7 +370,7 @@ public class UnitType extends UnlockableContent{ drawShield(unit); } - if(legs != null){ + if(mech != null){ unit.trns(-legOffset.x, -legOffset.y); } @@ -361,7 +431,7 @@ public class UnitType extends UnlockableContent{ public void drawOcclusion(Unit unit){ Draw.color(0, 0, 0, 0.4f); float rad = 1.6f; - float size = Math.max(region.getWidth(), region.getHeight()) * Draw.scl; + float size = Math.max(region.width, region.height) * Draw.scl; Draw.rect(occlusionRegion, unit, size * rad, size * rad); Draw.color(); } @@ -433,7 +503,7 @@ public class UnitType extends UnlockableContent{ float rotation = unit.rotation - 90; float weaponRotation = rotation + (weapon.rotate ? mount.rotation : 0); - float width = weapon.region.getWidth(); + 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); @@ -444,7 +514,7 @@ public class UnitType extends UnlockableContent{ Draw.rect(weapon.region, wx, wy, width * Draw.scl * -Mathf.sign(weapon.flipSprite), - weapon.region.getHeight() * Draw.scl, + weapon.region.height * Draw.scl, weaponRotation); } @@ -478,11 +548,11 @@ public class UnitType extends UnlockableContent{ } public void drawLegs(T unit){ - //Draw.z(Layer.groundUnit - 0.02f); + applyColor(unit); Leg[] legs = unit.legs(); - float ssize = footRegion.getWidth() * Draw.scl * 1.5f; + float ssize = footRegion.width * Draw.scl * 1.5f; float rotation = unit.baseRotation(); for(Leg leg : legs){ @@ -494,8 +564,9 @@ public class UnitType extends UnlockableContent{ Draw.rect(baseRegion, unit.x, unit.y, rotation); } - //TODO figure out layering - for(int i = 0; i < legs.length; i++){ + //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); Leg leg = legs[i]; float angle = unit.legAngle(rotation, i); boolean flip = i >= legs.length/2f; @@ -515,11 +586,11 @@ public class UnitType extends UnlockableContent{ Draw.rect(footRegion, leg.base.x, leg.base.y, position.angleTo(leg.base)); - Lines.stroke(legRegion.getHeight() * Draw.scl * flips); - Lines.line(legRegion, position.x, position.y, leg.joint.x, leg.joint.y, false, 0); + Lines.stroke(legRegion.height * Draw.scl * flips); + Lines.line(legRegion, position.x, position.y, leg.joint.x, leg.joint.y, false); - Lines.stroke(legBaseRegion.getHeight() * Draw.scl * flips); - Lines.line(legBaseRegion, leg.joint.x + Tmp.v1.x, leg.joint.y + Tmp.v1.y, leg.base.x, leg.base.y, false, 0); + Lines.stroke(legBaseRegion.height * Draw.scl * flips); + Lines.line(legBaseRegion, leg.joint.x + Tmp.v1.x, leg.joint.y + Tmp.v1.y, leg.base.x, leg.base.y, false); if(jointRegion.found()){ Draw.rect(jointRegion, leg.joint.x, leg.joint.y); @@ -533,14 +604,15 @@ public class UnitType extends UnlockableContent{ Draw.reset(); } - public void drawMech(T unit){ + public void drawMech(Mechc mech){ + Unit unit = (Unit)mech; + Draw.reset(); - Draw.mixcol(Color.white, unit.hitTime); - float e = unit.elevation; - float sin = Mathf.lerp(Mathf.sin(unit.walkTime(), 3f, 1f), 0f, e); - float ft = sin*(2.5f + (unit.hitSize-8f)/2f); + + 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 boostTrns = e * 2f; Floor floor = unit.isFlying() ? Blocks.air.asFloor() : unit.floorOn(); @@ -550,26 +622,45 @@ public class UnitType extends UnlockableContent{ } for(int i : Mathf.signs){ + Draw.mixcol(Tmp.c1.set(mechLegColor).lerp(Color.white, Mathf.clamp(unit.hitTime)), Math.max(Math.max(0, i * extension / mechStride), unit.hitTime)); + Draw.rect(legRegion, - unit.x + Angles.trnsx(unit.baseRotation(), ft * i - boostTrns, -boostTrns*i), - unit.y + Angles.trnsy(unit.baseRotation(), ft * i - boostTrns, -boostTrns*i), - legRegion.getWidth() * i * Draw.scl, - legRegion.getHeight() * Draw.scl - Math.max(-sin * i, 0) * legRegion.getHeight() * 0.5f * Draw.scl, - unit.baseRotation() - 90 + 35f*i*e); + unit.x + Angles.trnsx(mech.baseRotation(), extension * i - boostTrns, -boostTrns*i), + unit.y + Angles.trnsy(mech.baseRotation(), extension * i - boostTrns, -boostTrns*i), + legRegion.width * i * Draw.scl, + legRegion.height * Draw.scl - Math.max(-sin * i, 0) * legRegion.height * 0.5f * Draw.scl, + mech.baseRotation() - 90 + 35f*i*e); } + Draw.mixcol(Color.white, unit.hitTime); + if(floor.isLiquid){ Draw.color(Color.white, floor.mapColor, unit.drownTime() * 0.4f); }else{ Draw.color(Color.white); } - Draw.rect(baseRegion, unit, unit.baseRotation() - 90); + Draw.rect(baseRegion, unit, mech.baseRotation() - 90); Draw.mixcol(); } + 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); if(unit.drownTime > 0 && unit.floorOn().isDeep()){ Draw.mixcol(unit.floorOn().mapColor, unit.drownTime * 0.8f); diff --git a/core/src/mindustry/type/Weapon.java b/core/src/mindustry/type/Weapon.java index b83478cd24..a1d67a221f 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -59,6 +59,8 @@ public class Weapon{ public int otherSide = -1; /** sound used for shooting */ public Sound shootSound = Sounds.pew; + /** sound played when there is nothing to shoot */ + public Sound noAmmoSound = Sounds.click; /** displayed region (autoloaded) */ public TextureRegion region; diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index 9b1ca3a09f..c8547b8d2b 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -3,6 +3,8 @@ package mindustry.type; import arc.func.*; import arc.graphics.g2d.*; import arc.math.*; +import arc.math.geom.*; +import arc.scene.ui.layout.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -13,9 +15,9 @@ import mindustry.world.blocks.*; import static mindustry.Vars.*; -public abstract class Weather extends MappableContent{ +public abstract class Weather extends UnlockableContent{ /** Default duration of this weather event in ticks. */ - public float duration = 15f * Time.toMinutes; + public float duration = 9f * Time.toMinutes; public Attributes attrs = new Attributes(); //internals @@ -88,14 +90,24 @@ public abstract class Weather extends MappableContent{ } + @Override + public void displayInfo(Table table){ + //do not + } + + @Override + public boolean isHidden(){ + return true; + } + @Override public ContentType getContentType(){ return ContentType.weather; } @Remote(called = Loc.server) - public static void createWeather(Weather weather, float intensity, float duration){ - weather.create(intensity, duration); + public static void createWeather(Weather weather, float intensity, float duration, float windX, float windY){ + weather.create(intensity, duration).windVector.set(windX, windY); } public static class WeatherEntry{ @@ -103,14 +115,14 @@ public abstract class Weather extends MappableContent{ public Weather weather; /** Minimum and maximum spacing between weather events. Does not include the time of the event itself. */ public float minFrequency, maxFrequency, minDuration, maxDuration; - /** Cooldown time before the next weather event takes place. */ + /** Cooldown time before the next weather event takes place This is *state*, not configuration. */ public float cooldown; /** Intensity of the weather produced. */ public float intensity = 1f; /** Creates a weather entry with some approximate weather values. */ public WeatherEntry(Weather weather){ - this(weather, weather.duration/2f, weather.duration * 1.5f, weather.duration/2f, weather.duration * 1.5f); + this(weather, weather.duration * 1f, weather.duration * 3f, weather.duration / 2f, weather.duration * 1.5f); } public WeatherEntry(Weather weather, float minFrequency, float maxFrequency, float minDuration, float maxDuration){ @@ -136,6 +148,7 @@ public abstract class Weather extends MappableContent{ Weather weather; float intensity = 1f, opacity = 0f, life, effectTimer; + Vec2 windVector = new Vec2().setToRandomDirection(); void init(Weather weather){ this.weather = weather; @@ -144,7 +157,7 @@ public abstract class Weather extends MappableContent{ @Override public void update(){ if(life < fadeTime){ - opacity = life / fadeTime; + opacity = Math.min(life / fadeTime, opacity); }else{ opacity = Mathf.lerpDelta(opacity, 1f, 0.004f); } diff --git a/core/src/mindustry/ui/Bar.java b/core/src/mindustry/ui/Bar.java index 5cc23d27ca..cb1588650d 100644 --- a/core/src/mindustry/ui/Bar.java +++ b/core/src/mindustry/ui/Bar.java @@ -63,7 +63,7 @@ public class Bar extends Element{ if(fraction == null) return; float computed = Mathf.clamp(fraction.get()); - if(!Mathf.equal(lastValue, computed)){ + if(lastValue > computed){ blink = 1f; lastValue = computed; } @@ -80,11 +80,11 @@ public class Bar extends Element{ Drawable top = Tex.barTop; float topWidth = width * value; - if(topWidth > Core.atlas.find("bar-top").getWidth()){ + if(topWidth > Core.atlas.find("bar-top").width){ top.draw(x, y, topWidth, height); }else{ if(ScissorStack.push(scissor.set(x, y, topWidth, height))){ - top.draw(x, y, Core.atlas.find("bar-top").getWidth(), height); + top.draw(x, y, Core.atlas.find("bar-top").width, height); ScissorStack.pop(); } } diff --git a/core/src/mindustry/ui/CoreItemsDisplay.java b/core/src/mindustry/ui/CoreItemsDisplay.java index f7f5a2bb47..7322f15e70 100644 --- a/core/src/mindustry/ui/CoreItemsDisplay.java +++ b/core/src/mindustry/ui/CoreItemsDisplay.java @@ -11,6 +11,7 @@ import static mindustry.Vars.*; public class CoreItemsDisplay extends Table{ private final ObjectSet usedItems = new ObjectSet<>(); + private CoreBuild core; public CoreItemsDisplay(){ rebuild(); @@ -26,23 +27,20 @@ public class CoreItemsDisplay extends Table{ margin(4); update(() -> { - CoreBuild core = Vars.player.team().core(); + core = Vars.player.team().core(); - for(Item item : content.items()){ - if(core != null && core.items.get(item) > 0 && usedItems.add(item)){ - rebuild(); - break; - } + if(content.items().contains(item -> core != null && core.items.get(item) > 0 && usedItems.add(item))){ + rebuild(); } }); int i = 0; - CoreBuild core = Vars.player.team().core(); for(Item item : content.items()){ if(usedItems.contains(item)){ image(item.icon(Cicon.small)).padRight(3); - label(() -> core == null ? "0" : UI.formatAmount(core.items.get(item))).padRight(3); + //TODO leaks garbage + label(() -> core == null ? "0" : UI.formatAmount(core.items.get(item))).padRight(3).left(); if(++i % 4 == 0){ row(); diff --git a/core/src/mindustry/ui/Fonts.java b/core/src/mindustry/ui/Fonts.java index 15a7389b8f..cdf35ab3c3 100644 --- a/core/src/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -72,7 +72,7 @@ public class Fonts{ public static void loadContentIcons(){ Seq fonts = Seq.with(Fonts.chat, Fonts.def, Fonts.outline); - Texture uitex = Core.atlas.find("logo").getTexture(); + Texture uitex = Core.atlas.find("logo").texture; int size = (int)(Fonts.def.getData().lineHeight/Fonts.def.getData().scaleY); try(Scanner scan = new Scanner(Core.files.internal("icons/icons.properties").read(512))){ @@ -84,7 +84,7 @@ public class Fonts{ int ch = Integer.parseInt(character); TextureRegion region = Core.atlas.find(texture); - if(region.getTexture() != uitex){ + if(region.texture != uitex){ continue; //throw new IllegalArgumentException("Font icon '" + texture + "' is not in the UI texture."); } @@ -98,10 +98,10 @@ public class Fonts{ glyph.srcY = 0; glyph.width = size; glyph.height = size; - glyph.u = region.getU(); - glyph.v = region.getV2(); - glyph.u2 = region.getU2(); - glyph.v2 = region.getV(); + glyph.u = region.u; + glyph.v = region.v2; + glyph.u2 = region.u2; + glyph.v2 = region.v; glyph.xoffset = 0; glyph.yoffset = -size; glyph.xadvance = size; @@ -160,21 +160,21 @@ public class Fonts{ //grab all textures from the ui page, remove all the regions assigned to it, then copy them over to Fonts.packer and replace the texture in this atlas. //grab old UI texture and regions... - Texture texture = atlas.find("logo").getTexture(); + Texture texture = atlas.find("logo").texture; Page page = UI.packer.getPages().first(); - Seq regions = atlas.getRegions().select(t -> t.getTexture() == texture); + Seq regions = atlas.getRegions().select(t -> t.texture == texture); for(AtlasRegion region : regions){ //get new pack rect page.setDirty(false); Rect rect = UI.packer.pack(region.name + (region.splits != null ? ".9" : ""), atlas.getPixmap(region)); //set new texture - region.setTexture(UI.packer.getPages().first().getTexture()); + region.texture = UI.packer.getPages().first().getTexture(); //set its new position region.set((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height); //add old texture - atlas.getTextures().add(region.getTexture()); + atlas.getTextures().add(region.texture); } //remove old texture, it will no longer be used @@ -191,7 +191,7 @@ public class Fonts{ if(g == null) throw new IllegalArgumentException("No glyph: " + glyph + " (" + (int)glyph + ")"); float size = Math.max(g.width, g.height); - TextureRegionDrawable draw = new TextureRegionDrawable(new TextureRegion(font.getRegion().getTexture(), g.u, g.v2, g.u2, g.v)){ + TextureRegionDrawable draw = new TextureRegionDrawable(new TextureRegion(font.getRegion().texture, g.u, g.v2, g.u2, g.v)){ @Override public void draw(float x, float y, float width, float height){ Draw.color(Tmp.c1.set(tint).mul(Draw.getColor()).toFloatBits()); diff --git a/core/src/mindustry/ui/ItemImage.java b/core/src/mindustry/ui/ItemImage.java index aed8997f5f..6cb705185d 100644 --- a/core/src/mindustry/ui/ItemImage.java +++ b/core/src/mindustry/ui/ItemImage.java @@ -10,8 +10,12 @@ 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 Image(region)); + add(new Table(o -> { + o.left(); + o.add(new Image(region)).size(32f); + })); add(t); } diff --git a/core/src/mindustry/ui/Styles.java b/core/src/mindustry/ui/Styles.java index 6d47121165..ea7babb459 100644 --- a/core/src/mindustry/ui/Styles.java +++ b/core/src/mindustry/ui/Styles.java @@ -54,9 +54,9 @@ public class Styles{ }}; waveb = new ButtonStyle(){{ - up = buttonEdge4; - over = buttonEdgeOver4; - disabled = buttonEdge4; + up = wavepane; + over = wavepane; //TODO wrong + disabled = wavepane; }}; defaultt = new TextButtonStyle(){{ @@ -183,6 +183,9 @@ public class Styles{ over = buttonRightOver; down = buttonRightDown; up = buttonRight; + disabled = buttonRightDisabled; + imageDisabledColor = Color.clear; + imageUpColor = Color.white; }}; emptyi = new ImageButtonStyle(){{ imageDownColor = Pal.accent; diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index fb2291218f..294e547510 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -3,19 +3,24 @@ package mindustry.ui.dialogs; import arc.*; import arc.func.*; import arc.graphics.*; +import arc.math.*; import arc.scene.style.*; import arc.scene.ui.*; +import arc.scene.ui.ImageButton.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import mindustry.content.*; +import mindustry.ctype.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.type.Weather.*; import mindustry.ui.*; import mindustry.world.*; +import static arc.util.Time.*; import static mindustry.Vars.*; public class CustomRulesDialog extends BaseDialog{ @@ -143,6 +148,7 @@ public class CustomRulesDialog extends BaseDialog{ main.button("@configure", () -> loadoutDialog.show(Blocks.coreShard.itemCapacity, rules.loadout, + i -> true, () -> rules.loadout.clear().add(new ItemStack(Items.copper, 100)), () -> {}, () -> {} )).left().width(300f); @@ -159,10 +165,12 @@ public class CustomRulesDialog extends BaseDialog{ title("@rules.title.enemy"); check("@rules.attack", b -> rules.attackMode = b, () -> rules.attackMode); + check("@rules.buildai", b -> rules.waveTeam.rules().ai = b, () -> rules.waveTeam.rules().ai); number("@rules.enemycorebuildradius", f -> rules.enemyCoreBuildRadius = f * tilesize, () -> Math.min(rules.enemyCoreBuildRadius / tilesize, 200)); title("@rules.title.environment"); - number("@rules.solarpowermultiplier", f -> rules.solarPowerMultiplier = f, () -> rules.solarPowerMultiplier); + 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); main.button(b -> { @@ -173,8 +181,9 @@ public class CustomRulesDialog extends BaseDialog{ }}).grow(); }).margin(4).size(50f).padRight(10); b.add("@rules.ambientlight"); - }, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f); - main.row(); + }, () -> ui.picker.show(rules.ambientLight, rules.ambientLight::set)).left().width(250f).row(); + + main.button("@rules.weather", this::weatherDialog).width(250f).left().row(); //TODO add weather patterns } @@ -211,4 +220,120 @@ public class CustomRulesDialog extends BaseDialog{ main.image().color(Pal.accent).height(3f).padRight(100f).padBottom(20); main.row(); } + + Cell field(Table table, float value, Floatc setter){ + return table.field(Strings.autoFixed(value, 2), v -> setter.get(Strings.parseFloat(v))) + .valid(Strings::canParsePositiveFloat) + .size(90f, 40f).pad(2f).addInputDialog(); + } + + void weatherDialog(){ + BaseDialog dialog = new BaseDialog("@rules.weather"); + Runnable[] rebuild = {null}; + + dialog.cont.pane(base -> { + + rebuild[0] = () -> { + base.clearChildren(); + int cols = Math.max(1, Core.graphics.getWidth() / 460); + int idx = 0; + + for(WeatherEntry entry : rules.weather){ + base.top(); + //main container + base.table(Tex.pane, c -> { + c.margin(0); + + //icons to perform actions + c.table(Tex.whiteui, t -> { + t.setColor(Pal.gray); + + t.top().left(); + t.add(entry.weather.localizedName).left().padLeft(6); + + t.add().growX(); + + ImageButtonStyle style = Styles.geni; + t.defaults().size(42f); + + t.button(Icon.cancel, style, () -> { + rules.weather.remove(entry); + rebuild[0].run(); + }); + }).growX(); + + c.row(); + + //all the options + c.table(f -> { + f.marginLeft(4); + f.left().top(); + + f.defaults().padRight(4).left(); + + f.add("@rules.weather.duration"); + field(f, entry.minDuration / toMinutes, v -> entry.minDuration = v * toMinutes); + f.add("@waves.to"); + field(f, entry.maxDuration / toMinutes, v -> entry.maxDuration = v * toMinutes); + f.add("@unit.minutes"); + + f.row(); + + f.add("@rules.weather.frequency"); + field(f, entry.minFrequency / toMinutes, v -> entry.minFrequency = v * toMinutes); + f.add("@waves.to"); + field(f, entry.maxFrequency / toMinutes, v -> entry.maxFrequency = v * toMinutes); + f.add("@unit.minutes"); + + //intensity can't currently be customized + + }).grow().left().pad(6).top(); + }).width(410f).pad(3).top().left().fillY(); + + if(++idx % cols == 0){ + base.row(); + } + } + }; + + rebuild[0].run(); + }).grow(); + + dialog.addCloseButton(); + + dialog.buttons.button("@add", Icon.add, () -> { + BaseDialog addd = new BaseDialog("@add"); + addd.cont.pane(t -> { + t.background(Tex.button); + int i = 0; + for(Weather weather : content.getBy(ContentType.weather)){ + + t.button(weather.localizedName, Styles.cleart, () -> { + rules.weather.add(new WeatherEntry(weather)); + rebuild[0].run(); + + addd.hide(); + }).size(140f, 50f); + if(++i % 2 == 0) t.row(); + } + }); + addd.addCloseButton(); + addd.show(); + }).width(170f); + + //reset cooldown to random number + dialog.hidden(() -> { + float sum = 0; + Seq sh = rules.weather.copy(); + sh.shuffle(); + + for(WeatherEntry w : sh){ + //add the previous cooldowns to the sum so weather events are staggered and don't happen all at once. + w.cooldown = sum + Mathf.random(w.minFrequency, w.maxFrequency); + sum += w.cooldown; + } + }); + + dialog.show(); + } } diff --git a/core/src/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/mindustry/ui/dialogs/DatabaseDialog.java index eebfe47898..8b4f378902 100644 --- a/core/src/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java @@ -1,12 +1,13 @@ package mindustry.ui.dialogs; import arc.*; -import arc.input.*; -import arc.struct.*; import arc.graphics.*; +import arc.input.*; +import arc.math.*; import arc.scene.event.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.ctype.*; @@ -14,7 +15,7 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; -import static mindustry.Vars.ui; +import static mindustry.Vars.*; public class DatabaseDialog extends BaseDialog{ @@ -49,14 +50,13 @@ public class DatabaseDialog extends BaseDialog{ table.table(list -> { list.left(); - int maxWidth = Core.graphics.isPortrait() ? 7 : 13; - + int cols = Mathf.clamp((Core.graphics.getWidth() - 30) / (32 + 10), 1, 18); int count = 0; for(int i = 0; i < array.size; i++){ UnlockableContent unlock = (UnlockableContent)array.get(i); - Image image = unlocked(unlock) ? new Image(unlock.icon(Cicon.medium)) : new Image(Icon.lockOpen, Pal.gray); + Image image = unlocked(unlock) ? new Image(unlock.icon(Cicon.medium)) : new Image(Icon.lock, Pal.gray); list.add(image).size(8*4).pad(3); ClickListener listener = new ClickListener(); image.addListener(listener); @@ -77,7 +77,7 @@ public class DatabaseDialog extends BaseDialog{ image.addListener(new Tooltip(t -> t.background(Tex.button).add(unlock.localizedName))); } - if((++count) % maxWidth == 0){ + if((++count) % cols == 0){ list.row(); } } diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 92776ab729..4d710fe27c 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -262,14 +262,10 @@ public class JoinDialog extends BaseDialog{ cont.clear(); cont.table(t -> { t.add("@name").padRight(10); - if(!steam){ - t.field(Core.settings.getString("name"), text -> { - player.name(text); - Core.settings.put("name", text); - }).grow().pad(8).addInputDialog(maxNameLength); - }else{ - t.add(player.name).update(l -> l.setColor(player.color())).grow().pad(8); - } + t.field(Core.settings.getString("name"), text -> { + player.name(text); + Core.settings.put("name", text); + }).grow().pad(8).addInputDialog(maxNameLength); ImageButton button = t.button(Tex.whiteui, Styles.clearFulli, 40, () -> { new PaletteDialog().show(color -> { @@ -431,7 +427,7 @@ public class JoinDialog extends BaseDialog{ } //get servers - Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonURL, result -> { + Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonV6URL, result -> { try{ Jval val = Jval.read(result.getResultAsString()); Core.app.post(() -> { diff --git a/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java b/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java index aacfb4a2dd..9634777ab9 100644 --- a/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java +++ b/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java @@ -5,6 +5,7 @@ import arc.func.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; +import mindustry.ctype.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.type.*; @@ -71,7 +72,7 @@ public class LaunchLoadoutDialog extends BaseDialog{ Runnable rebuildItems = () -> rebuild.get(items); buttons.button("@resources", Icon.terrain, () -> { - loadout.show(core.itemCapacity, stacks, stacks::clear, () -> {}, () -> { + loadout.show(core.itemCapacity, stacks, UnlockableContent::unlocked, stacks::clear, () -> {}, () -> { universe.updateLaunchResources(stacks); update.run(); rebuildItems.run(); diff --git a/core/src/mindustry/ui/dialogs/LoadDialog.java b/core/src/mindustry/ui/dialogs/LoadDialog.java index 2d3f653fab..6e2e56e2d8 100644 --- a/core/src/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/mindustry/ui/dialogs/LoadDialog.java @@ -104,7 +104,7 @@ public class LoadDialog extends BaseDialog{ button.left().add(new BorderImage(def, 4f)).update(im -> { TextureRegionDrawable draw = (TextureRegionDrawable)im.getDrawable(); - if(draw.getRegion().getTexture().isDisposed()){ + if(draw.getRegion().texture.isDisposed()){ draw.setRegion(def); } diff --git a/core/src/mindustry/ui/dialogs/LoadoutDialog.java b/core/src/mindustry/ui/dialogs/LoadoutDialog.java index e2543903ed..eb0182ee2a 100644 --- a/core/src/mindustry/ui/dialogs/LoadoutDialog.java +++ b/core/src/mindustry/ui/dialogs/LoadoutDialog.java @@ -1,9 +1,10 @@ package mindustry.ui.dialogs; import arc.*; -import arc.struct.*; +import arc.func.*; import arc.input.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import mindustry.gen.*; import mindustry.type.*; @@ -17,6 +18,7 @@ public class LoadoutDialog extends BaseDialog{ private Runnable updater; private Seq stacks = new Seq<>(); private Seq originalStacks = new Seq<>(); + private Boolf validator = i -> true; private Table items; private int capacity; @@ -51,13 +53,14 @@ public class LoadoutDialog extends BaseDialog{ }).size(210f, 64f); } - public void show(int capacity, Seq stacks, Runnable reseter, Runnable updater, Runnable hider){ + public void show(int capacity, Seq stacks, Boolf validator, Runnable reseter, Runnable updater, Runnable hider){ this.originalStacks = stacks; - reseed(); + this.validator = validator; this.resetter = reseter; this.updater = updater; this.capacity = capacity; this.hider = hider; + reseed(); show(); } @@ -106,7 +109,7 @@ public class LoadoutDialog extends BaseDialog{ private void reseed(){ this.stacks = originalStacks.map(ItemStack::copy); - this.stacks.addAll(content.items().select(i -> !stacks.contains(stack -> stack.item == i)).map(i -> new ItemStack(i, 0))); + this.stacks.addAll(content.items().select(i -> validator.get(i) && !stacks.contains(stack -> stack.item == i)).map(i -> new ItemStack(i, 0))); this.stacks.sort(Structs.comparingInt(s -> s.item.id)); } diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index 3c3d0381ba..4695091886 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -161,8 +161,28 @@ public class ModsDialog extends BaseDialog{ border(Pal.accent); }}).size(h - 8f).padTop(-8f).padLeft(-8f).padRight(8f); - title.add("" + mod.meta.displayName() + "\n[lightgray]v" + mod.meta.version + (mod.enabled() ? "" : "\n" + Core.bundle.get("mod.disabled") + "")) - .wrap().top().width(170f).growX().left(); + title.table(text -> { + boolean hideDisabled = !mod.isSupported() || mod.hasUnmetDependencies() || mod.hasContentErrors(); + + text.add("" + mod.meta.displayName() + "\n[lightgray]v" + mod.meta.version + (mod.enabled() || hideDisabled ? "" : "\n" + Core.bundle.get("mod.disabled") + "")) + .wrap().top().width(300f).growX().left(); + + text.row(); + + if(mod.isOutdated()){ + text.labelWrap("@mod.outdated").growX(); + text.row(); + }else if(!mod.isSupported()){ + text.labelWrap(Core.bundle.format("mod.requiresversion", mod.meta.minGameVersion)).growX(); + text.row(); + }else if(mod.hasUnmetDependencies()){ + text.labelWrap(Core.bundle.format("mod.missingdependencies", mod.missingDependencies.toString(", "))).growX(); + t.row(); + }else if(mod.hasContentErrors()){ + text.labelWrap("@mod.erroredcontent").growX(); + text.row(); + } + }).top().growX(); title.add().growX(); }).growX().growY().left(); @@ -193,17 +213,7 @@ public class ModsDialog extends BaseDialog{ } }).growX().right().padRight(-8f).padTop(-8f); - t.row(); - if(!mod.isSupported()){ - t.labelWrap(Core.bundle.format("mod.requiresversion", mod.meta.minGameVersion)).growX(); - t.row(); - }else if(mod.hasUnmetDependencies()){ - t.labelWrap(Core.bundle.format("mod.missingdependencies", mod.missingDependencies.toString(", "))).growX(); - t.row(); - }else if(mod.hasContentErrors()){ - t.labelWrap("@mod.erroredcontent").growX(); - t.row(); - } + }, Styles.clearPartialt, () -> showMod(mod)).size(w, h).growX().pad(4f); table.row(); } diff --git a/core/src/mindustry/ui/dialogs/PausedDialog.java b/core/src/mindustry/ui/dialogs/PausedDialog.java index ae91f18f10..3b0f56906c 100644 --- a/core/src/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/mindustry/ui/dialogs/PausedDialog.java @@ -44,16 +44,7 @@ public class PausedDialog extends BaseDialog{ float dw = 220f; cont.defaults().width(dw).height(55).pad(5f); - cont.button("@back", Icon.left, this::hide).colspan(2).width(dw * 2 + 20f); - - cont.row(); - //if(state.isCampaign()){ - // cont.button("@techtree", Icon.tree, ui.tech::show); - //}else{ - // cont.button("@database", Icon.book, ui.database::show); - //} - //TODO remove - cont.button("nothing", Icon.warning, () -> ui.showInfo("no")); + cont.button("@back", Icon.left, this::hide); cont.button("@settings", Icon.settings, ui.settings::show); if(!state.rules.tutorial){ @@ -93,6 +84,18 @@ public class PausedDialog extends BaseDialog{ cont.row(); cont.buttonRow("@load", Icon.download, load::show).disabled(b -> net.active()); + }else if(state.isCampaign()){ + cont.buttonRow("@launchcore", Icon.up, () -> { + hide(); + ui.planet.show(state.getSector(), player.team().core()); + }).disabled(b -> player.team().core() == null); + + cont.row(); + + cont.buttonRow("@planetmap", Icon.map, () -> { + hide(); + ui.planet.show(); + }); }else{ cont.row(); } diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index 7d03210041..3462891f6a 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -94,6 +94,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } public void show(Sector sector, CoreBuild launcher){ + if(launcher == null) return; + this.launcher = launcher; selected = null; hovered = null; @@ -127,10 +129,11 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ //draw all sector stuff 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.1f * sec.baseCoverage * selectAlpha), -0.002f); + planets.fill(sec, Tmp.c1.set(Team.crux.color).a(0.5f * sec.baseCoverage * selectAlpha), -0.002f); } Color color = @@ -290,7 +293,6 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ selectAlpha = Mathf.lerpDelta(selectAlpha, Mathf.num(planets.zoom < 1.9f), 0.1f); } - //TODO localize void updateSelected(){ Sector sector = selected; @@ -305,16 +307,21 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ stable.add("[accent]" + (sector.preset == null ? sector.id : sector.preset.localizedName)).row(); stable.image().color(Pal.accent).fillX().height(3f).pad(3f).row(); - stable.add(sector.save != null ? sector.save.getPlayTime() : "[lightgray]Unexplored").row(); + stable.add(sector.save != null ? sector.save.getPlayTime() : "@sectors.unexplored").row(); + if(sector.hasWaves() || sector.hasEnemyBase()){ + stable.add("[accent]Difficulty: " + (int)(sector.baseCoverage * 10)).row(); + } if(sector.hasBase() && sector.hasWaves()){ + //TODO localize when finalized + //these mechanics are likely to change and as such are not added to the bundle stable.add("[scarlet]Under attack!"); stable.row(); stable.add("[accent]" + Mathf.ceil(sectorDestructionTurns - (sector.getSecondsPassed() * 60) / turnDuration) + " turn(s)\nuntil destruction"); stable.row(); } - stable.add("Resources:").row(); + stable.add("@sectors.resources").row(); stable.table(t -> { t.left(); int idx = 0; @@ -327,7 +334,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ //production if(sector.hasBase() && sector.save.meta.hasProduction){ - stable.add("Production:").row(); + stable.add("@sectors.production").row(); stable.table(t -> { t.left(); @@ -335,7 +342,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ int total = (int)(stat.mean * 60); if(total > 1){ t.image(item.icon(Cicon.small)).padRight(3); - t.add(UI.formatAmount(total) + " /min").color(Color.lightGray); + t.add(UI.formatAmount(total) + " " + Core.bundle.get("unit.perminute")).color(Color.lightGray); t.row(); } }); @@ -344,7 +351,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ //stored resources if(sector.hasBase() && sector.save.meta.secinfo.coreItems.size > 0){ - stable.add("Stored:").row(); + stable.add("@sectors.stored").row(); stable.table(t -> { t.left(); @@ -367,7 +374,7 @@ 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() ? "Resume" : "Launch", Styles.transt, () -> { + stable.button(sector.hasBase() ? "@sectors.resume" : "@sectors.launch", Styles.transt, () -> { boolean shouldHide = true; diff --git a/core/src/mindustry/ui/dialogs/ResearchDialog.java b/core/src/mindustry/ui/dialogs/ResearchDialog.java index 3265a50104..d2bd13c101 100644 --- a/core/src/mindustry/ui/dialogs/ResearchDialog.java +++ b/core/src/mindustry/ui/dialogs/ResearchDialog.java @@ -134,7 +134,9 @@ public class ResearchDialog extends BaseDialog{ } }); - addListener(new ElementGestureListener(){ + touchable = Touchable.enabled; + + addCaptureListener(new ElementGestureListener(){ @Override public void zoom(InputEvent event, float initialDistance, float distance){ if(view.lastZoom < 0){ @@ -233,7 +235,7 @@ public class ResearchDialog extends BaseDialog{ } boolean selectable(TechNode node){ - return !node.objectives.contains(i -> !i.complete()); + return node.content.unlocked() || !node.objectives.contains(i -> !i.complete()); } void showToast(String info){ diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 10cd96366f..c4cfc02132 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -86,7 +86,7 @@ public class SettingsMenuDialog extends SettingsDialog{ dataDialog.addCloseButton(); dataDialog.cont.table(Tex.button, t -> { - t.defaults().size(270f, 60f).left(); + t.defaults().size(280f, 60f).left(); TextButtonStyle style = Styles.cleart; t.button("@settings.cleardata", Icon.trash, style, () -> ui.showConfirm("@confirm", "@settings.clearall.confirm", () -> { @@ -419,6 +419,9 @@ public class SettingsMenuDialog extends SettingsDialog{ zipped.walk(f -> f.copyTo(base.child(f.path()))); dest.delete(); + + //load data so it's saved on exit + settings.load(); } private void back(){ diff --git a/core/src/mindustry/ui/fragments/BlockConfigFragment.java b/core/src/mindustry/ui/fragments/BlockConfigFragment.java index 6719add761..853c10025e 100644 --- a/core/src/mindustry/ui/fragments/BlockConfigFragment.java +++ b/core/src/mindustry/ui/fragments/BlockConfigFragment.java @@ -61,7 +61,7 @@ public class BlockConfigFragment extends Fragment{ } table.setOrigin(Align.center); - if(configTile == null || configTile.block() == Blocks.air || !configTile.isValid()){ + if(configTile == null || configTile.block == Blocks.air || !configTile.isValid()){ hideConfig(); }else{ configTile.updateTableAlign(table); diff --git a/core/src/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/mindustry/ui/fragments/BlockInventoryFragment.java index 73ecb3ffe9..515a7ef05c 100644 --- a/core/src/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/mindustry/ui/fragments/BlockInventoryFragment.java @@ -44,10 +44,12 @@ public class BlockInventoryFragment extends Fragment{ @Remote(called = Loc.server, targets = Loc.both, forward = true) public static void requestItem(Player player, Building tile, Item item, int amount){ - if(player == null || tile == null || !tile.interactable(player.team())) return; - amount = Mathf.clamp(amount, 0, player.unit().itemCapacity()); + 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; @@ -77,7 +79,7 @@ public class BlockInventoryFragment extends Fragment{ return; } this.tile = t; - if(tile == null || !tile.block().isAccessible() || tile.items.total() == 0) + if(tile == null || !tile.block.isAccessible() || tile.items.total() == 0) return; rebuild(true); } @@ -106,7 +108,7 @@ public class BlockInventoryFragment extends Fragment{ table.touchable = Touchable.enabled; table.update(() -> { - if(state.isMenu() || tile == null || !tile.isValid() || !tile.block().isAccessible() || emptyTime >= holdShrink){ + if(state.isMenu() || tile == null || !tile.isValid() || !tile.block.isAccessible() || emptyTime >= holdShrink){ hide(); }else{ if(tile.items.total() == 0){ @@ -129,7 +131,7 @@ public class BlockInventoryFragment extends Fragment{ } updateTablePosition(); - if(tile.block().hasItems){ + if(tile.block.hasItems){ boolean dirty = false; if(shrinkHoldTimes.length != content.items().size) shrinkHoldTimes = new float[content.items().size]; @@ -155,7 +157,7 @@ public class BlockInventoryFragment extends Fragment{ table.margin(4f); table.defaults().size(8 * 5).pad(4f); - if(tile.block().hasItems){ + if(tile.block.hasItems){ for(int i = 0; i < content.items().size; i++){ Item item = content.item(i); @@ -163,7 +165,7 @@ public class BlockInventoryFragment extends Fragment{ container.add(i); - Boolp canPick = () -> player.unit().acceptsItem(item) && !state.isPaused(); + Boolp canPick = () -> player.unit().acceptsItem(item) && !state.isPaused() && player.within(tile, itemTransferRange); HandCursorListener l = new HandCursorListener(); l.setEnabled(canPick); @@ -231,7 +233,7 @@ public class BlockInventoryFragment extends Fragment{ } private void updateTablePosition(){ - Vec2 v = Core.input.mouseScreen(tile.x + tile.block().size * tilesize / 2f, tile.y + tile.block().size * tilesize / 2f); + Vec2 v = Core.input.mouseScreen(tile.x + tile.block.size * tilesize / 2f, tile.y + tile.block.size * tilesize / 2f); table.pack(); table.setPosition(v.x, v.y, Align.topLeft); } diff --git a/core/src/mindustry/ui/fragments/ChatFragment.java b/core/src/mindustry/ui/fragments/ChatFragment.java index cbc8bacf39..e07c5dc310 100644 --- a/core/src/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/mindustry/ui/fragments/ChatFragment.java @@ -62,7 +62,7 @@ public class ChatFragment extends Table{ update(() -> { - if(net.active() && input.keyTap(Binding.chat) && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null || ui.minimapfrag.shown())){ + if(net.active() && input.keyTap(Binding.chat) && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null || ui.minimapfrag.shown()) && !ui.scriptfrag.shown()){ toggle(); } diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index d1eae438a2..65038ee67f 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -1,7 +1,9 @@ package mindustry.ui.fragments; import arc.*; +import arc.func.*; import arc.graphics.*; +import arc.graphics.g2d.*; import arc.input.*; import arc.math.*; import arc.scene.*; @@ -29,10 +31,14 @@ import mindustry.ui.dialogs.*; import static mindustry.Vars.*; public class HudFragment extends Fragment{ - private static final float dsize = 47.2f; + 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<>(); + private ImageButton flip; private Table lastUnlockTable; private Table lastUnlockLayout; @@ -64,16 +70,25 @@ public class HudFragment extends Fragment{ coreItems.clear(); }); - Events.on(TurnEvent.class, e -> { - ui.announce("[accent][[ Turn " + universe.turn() + " ]"); - }); - //paused table parent.fill(t -> { t.top().visible(() -> state.isPaused() && !state.isOutOfTime()).touchable = Touchable.disabled; t.table(Styles.black5, top -> top.add("@paused").style(Styles.outlineLabel).pad(8f)).growX(); }); + //minimap + position + parent.fill(t -> { + t.visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial && shown); + //minimap + t.add(new Minimap()); + t.row(); + //position + t.label(() -> player.tileX() + "," + player.tileY()) + .visible(() -> Core.settings.getBool("position") && !state.rules.tutorial) + .touchable(Touchable.disabled); + t.top().right(); + }); + //TODO tear this all down //menu at top left parent.fill(cont -> { @@ -122,6 +137,8 @@ public class HudFragment extends Fragment{ }).update(i -> { if(net.active() && mobile){ i.getStyle().imageUp = Icon.chat; + }else if(state.isCampaign()){ + i.getStyle().imageUp = Icon.tree; }else{ i.getStyle().imageUp = Icon.book; } @@ -145,48 +162,54 @@ public class HudFragment extends Fragment{ cont.stack(wavesMain = new Table(), editorMain = new Table()).height(wavesMain.getPrefHeight()); - { - wavesMain.visible(() -> shown && !state.isEditor()); - wavesMain.top().left(); - Stack stack = new Stack(); - Button waves = new Button(Styles.waveb); - Table btable = new Table().margin(0); + wavesMain.visible(() -> shown && !state.isEditor()); + wavesMain.top().left(); - stack.add(waves); - stack.add(btable); + wavesMain.table(s -> { + //wave info button with text + s.add(makeStatusTable()).grow(); - addWaveTable(waves); - addPlayButton(btable); - wavesMain.add(stack).width(dsize * 5 + 4f); - wavesMain.row(); - wavesMain.table(Tex.button, t -> t.margin(10f).add(new Bar("boss.health", Pal.health, () -> state.boss() == null ? 0f : state.boss().healthf()).blink(Color.white)) - .grow()).fillX().visible(() -> state.rules.waves && state.boss() != null).height(60f).get(); - wavesMain.row(); - } + //table with button to skip wave + s.button(Icon.play, Styles.righti, 30f, () -> { + if(net.client() && player.admin){ + Call.adminRequest(player, AdminAction.wave); + }else 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); + }).width(dsize * 5 + 4f); - { - editorMain.table(Tex.buttonEdge4, t -> { - //t.margin(0f); - t.add("@editor.teams").growX().left(); - t.row(); - t.table(teams -> { - teams.left(); - int i = 0; - for(Team team : Team.baseTeams){ - ImageButton button = teams.button(Tex.whiteui, Styles.clearTogglePartiali, 40f, () -> Call.setPlayerTeamEditor(player, team)) - .size(50f).margin(6f).get(); - button.getImageCell().grow(); - button.getStyle().imageUpColor = team.color; - button.update(() -> button.setChecked(player.team() == team)); + wavesMain.row(); - if(++i % 3 == 0){ - teams.row(); - } + wavesMain.table(Tex.button, t -> t.margin(10f).add(new Bar("boss.health", Pal.health, () -> state.boss() == null ? 0f : state.boss().healthf()).blink(Color.white)) + .grow()).fillX().visible(() -> state.rules.waves && state.boss() != null).height(60f).get(); + + wavesMain.row(); + + editorMain.table(Tex.buttonEdge4, t -> { + //t.margin(0f); + t.add("@editor.teams").growX().left(); + t.row(); + t.table(teams -> { + teams.left(); + int i = 0; + for(Team team : Team.baseTeams){ + ImageButton button = teams.button(Tex.whiteui, Styles.clearTogglePartiali, 40f, () -> Call.setPlayerTeamEditor(player, team)) + .size(50f).margin(6f).get(); + button.getImageCell().grow(); + button.getStyle().imageUpColor = team.color; + button.update(() -> button.setChecked(player.team() == team)); + + if(++i % 3 == 0){ + teams.row(); } - }).left(); - }).width(dsize * 5 + 4f); - editorMain.visible(() -> shown && state.isEditor()); - } + } + }).left(); + }).width(dsize * 5 + 4f); + editorMain.visible(() -> shown && state.isEditor()); + //fps display cont.table(info -> { @@ -202,22 +225,10 @@ public class HudFragment extends Fragment{ }).top().left(); }); - parent.fill(t -> { - t.visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial && shown); - //minimap - t.add(new Minimap()); - t.row(); - //position - t.label(() -> player.tileX() + "," + player.tileY()) - .visible(() -> Core.settings.getBool("position") && !state.rules.tutorial) - .touchable(Touchable.disabled); - t.top().right(); - }); - //core items parent.fill(t -> { t.top().add(coreItems); - t.visible(() -> Core.settings.getBool("coreitems") && !mobile && !state.isPaused()); + t.visible(() -> Core.settings.getBool("coreitems") && !mobile && !state.isPaused() && shown); }); //spawner warning @@ -270,20 +281,30 @@ public class HudFragment extends Fragment{ parent.fill(t -> { t.top().visible(() -> state.isOutOfTime()); t.table(Styles.black5, top -> { - //TODO localize when done - top.add("Out of sector time.").style(Styles.outlineLabel).color(Pal.accent).update(l -> l.color.a = Mathf.absin(Time.globalTime(), 7f, 1f)).colspan(2); + //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); - top.button("Next Turn", () -> { + //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."); }); - top.button("Back to Planet", () -> { + //TODO localize + top.button("Switch Sectors", () -> { ui.paused.runExitSave(); - ui.planet.show(); - }); + + //switch to first attacked sector + control.playSector(attackedSectors.first()); + }).disabled(b -> attackedSectors.isEmpty()); }).margin(8).growX(); }); @@ -329,6 +350,7 @@ public class HudFragment extends Fragment{ }); //TODO DEBUG: rate table + if(false) parent.fill(t -> { t.bottom().left(); t.table(Styles.black6, c -> { @@ -596,7 +618,9 @@ public class HudFragment extends Fragment{ shown = !shown; } - private void addWaveTable(Button table){ + private Table makeStatusTable(){ + Button table = new Button(Styles.waveb); + StringBuilder ibuild = new StringBuilder(); IntFormat wavef = new IntFormat("wave"); @@ -623,6 +647,106 @@ public class HudFragment extends Fragment{ StringBuilder builder = new StringBuilder(); table.name = "waves"; + + table.marginTop(0).marginBottom(4).marginLeft(4); + + class SideBar extends Element{ + public final Floatp amount; + public final boolean flip; + public final Boolp flash; + + float last, blink, value; + + public SideBar(Floatp amount, Boolp flash, boolean flip){ + this.amount = amount; + this.flip = flip; + this.flash = flash; + + setColor(Pal.health); + } + + @Override + public void draw(){ + float next = amount.get(); + + if(next < last && flash.get()){ + blink = 1f; + } + + blink = Mathf.lerpDelta(blink, 0f, 0.2f); + value = Mathf.lerpDelta(value, next, 0.15f); + last = next; + + drawInner(Pal.darkishGray); + + Draw.beginStencil(); + + Fill.crect(x, y, width, height * value); + + Draw.beginStenciled(); + + drawInner(Tmp.c1.set(color).lerp(Color.white, blink)); + + Draw.endStencil(); + } + + void drawInner(Color color){ + if(flip){ + x += width; + width = -width; + } + + float stroke = width * 0.35f; + float bh = height/2f; + Draw.color(color); + + Fill.quad( + x, y, + x + stroke, y, + x + width, y + bh, + x + width - stroke, y + bh + ); + + Fill.quad( + x + width, y + bh, + x + width - stroke, y + bh, + x, y + height, + x + stroke, y + height + ); + + Draw.reset(); + + if(flip){ + width = -width; + x -= width; + } + } + } + + table.stack( + new Element(){ + @Override + public void draw(){ + Draw.color(Pal.darkerGray); + Fill.poly(x + width/2f, y + height/2f, 6, height / Mathf.sqrt3); + Draw.reset(); + Drawf.shadow(x + width/2f, y + height/2f, height * 1.13f); + } + }, + new Table(t -> { + float bw = 40f; + float pad = -20; + t.margin(0); + + t.add(new SideBar(() -> player.unit().healthf(), () -> true, true)).width(bw).growY().padRight(pad); + t.image(() -> player.icon()).scaling(Scaling.bounded).grow().maxWidth(54f); + t.add(new SideBar(() -> player.dead() ? 0f : player.displayAmmo() ? player.unit().ammof() : player.unit().healthf(), () -> !player.displayAmmo(), false)).width(bw).growY().padLeft(pad).update(b -> { + b.color.set(player.displayAmmo() ? Pal.ammo : Pal.health); + }); + + t.getChildren().get(1).toFront(); + })).size(120f, 80).padRight(4); + table.labelWrap(() -> { builder.setLength(0); builder.append(wavef.get(state.wave)); @@ -669,22 +793,12 @@ public class HudFragment extends Fragment{ showLaunchConfirm(); } }); + + return table; } private boolean canSkipWave(){ return state.rules.waves && ((net.server() || player.admin) || !net.active()) && state.enemies == 0 && !spawner.isSpawning() && !state.rules.tutorial; } - private void addPlayButton(Table table){ - table.right().button(Icon.play, Styles.righti, 30f, () -> { - if(net.client() && player.admin){ - Call.adminRequest(player, AdminAction.wave); - }else if(inLaunchWave()){ - ui.showConfirm("@confirm", "@launch.skip.confirm", () -> !canSkipWave(), () -> logic.skipWave()); - }else{ - logic.skipWave(); - } - }).growY().fillX().right().width(40f) - .visible(this::canSkipWave); - } } diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java index f66a6c7777..5ec2692d04 100644 --- a/core/src/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/mindustry/ui/fragments/MenuFragment.java @@ -78,8 +78,8 @@ public class MenuFragment extends Fragment{ parent.fill((x, y, w, h) -> { TextureRegion logo = Core.atlas.find("logo"); float logoscl = Scl.scl(1); - float logow = Math.min(logo.getWidth() * logoscl, Core.graphics.getWidth() - Scl.scl(20)); - float logoh = logow * (float)logo.getHeight() / logo.getWidth(); + float logow = Math.min(logo.width * logoscl, Core.graphics.getWidth() - Scl.scl(20)); + float logoh = logow * (float)logo.height / logo.width; float fx = (int)(Core.graphics.getWidth() / 2f); float fy = (int)(Core.graphics.getHeight() - 6 - logoh) + logoh / 2 - (Core.graphics.isPortrait() ? Scl.scl(30f) : 0f); diff --git a/core/src/mindustry/ui/fragments/MinimapFragment.java b/core/src/mindustry/ui/fragments/MinimapFragment.java index 68ac728af7..2b12fe3062 100644 --- a/core/src/mindustry/ui/fragments/MinimapFragment.java +++ b/core/src/mindustry/ui/fragments/MinimapFragment.java @@ -32,7 +32,7 @@ public class MinimapFragment extends Fragment{ if(renderer.minimap.getTexture() != null){ Draw.color(); - float ratio = (float)renderer.minimap.getTexture().getHeight() / renderer.minimap.getTexture().getWidth(); + float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().getWidth(); TextureRegion reg = Draw.wrap(renderer.minimap.getTexture()); Draw.rect(reg, w/2f + panx*zoom, h/2f + pany*zoom, size, size * ratio); renderer.minimap.drawEntities(w/2f + panx*zoom - size/2f, h/2f + pany*zoom - size/2f * ratio, size, size * ratio, zoom, true); @@ -113,7 +113,7 @@ public class MinimapFragment extends Fragment{ public void toggle(){ if(Core.settings.getBool("mapcenter")){ float size = baseSize * zoom * world.width(); - float ratio = (float)renderer.minimap.getTexture().getHeight() / renderer.minimap.getTexture().getWidth(); + float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().getWidth(); 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 572fa1e628..c705b34f6b 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -23,7 +23,7 @@ import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.*; -import mindustry.world.blocks.BuildBlock.*; +import mindustry.world.blocks.ConstructBlock.*; import static mindustry.Vars.*; @@ -31,7 +31,7 @@ public class PlacementFragment extends Fragment{ final int rowWidth = 4; public Category currentCategory = Category.distribution; - Seq returnArray = new Seq<>(); + Seq returnArray = new Seq<>(), returnArray2 = new Seq<>(); Seq returnCatArray = new Seq<>(); boolean[] categoryEmpty = new boolean[Category.all.length]; ObjectMap selectedBlocks = new ObjectMap<>(); @@ -95,7 +95,7 @@ public class PlacementFragment extends Fragment{ if(Core.input.keyDown(Binding.pick) && player.isBuilder()){ //mouse eyedropper select Building tile = world.buildWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); - Block tryRecipe = tile == null ? null : tile.block() instanceof BuildBlock ? ((BuildEntity)tile).cblock : tile.block; + Block tryRecipe = tile == null ? null : tile.block instanceof ConstructBlock ? ((ConstructBuild)tile).cblock : tile.block; Object tryConfig = tile == null ? null : tile.config(); for(BuildPlan req : player.builder().plans()){ @@ -422,7 +422,7 @@ public class PlacementFragment extends Fragment{ } Seq getUnlockedByCategory(Category cat){ - return returnArray.selectFrom(content.blocks(), block -> block.category == cat && block.isVisible() && unlocked(block)).sort((b1, b2) -> Boolean.compare(!b1.isPlaceable(), !b2.isPlaceable())); + return returnArray2.selectFrom(content.blocks(), block -> block.category == cat && block.isVisible() && unlocked(block)).sort((b1, b2) -> Boolean.compare(!b1.isPlaceable(), !b2.isPlaceable())); } Block getSelectedBlock(Category cat){ diff --git a/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java b/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java index 7e11818548..73861538e3 100644 --- a/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java +++ b/core/src/mindustry/ui/fragments/ScriptConsoleFragment.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,8 +9,8 @@ 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.input.*; import mindustry.ui.*; @@ -45,7 +44,7 @@ public class ScriptConsoleFragment extends Table{ font = Fonts.def; visible(() -> { - if(input.keyTap(Binding.console) && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null)){ + if(input.keyTap(Binding.console) && (scene.getKeyboardFocus() == chatfield || scene.getKeyboardFocus() == null) && !ui.chatfrag.shown()){ shown = !shown; if(shown && !open && enableConsole){ toggle(); @@ -96,7 +95,6 @@ public class ScriptConsoleFragment extends Table{ fieldlabel.setStyle(fieldlabel.getStyle()); chatfield = new TextField("", new TextField.TextFieldStyle(scene.getStyle(TextField.TextFieldStyle.class))); - chatfield.setMaxLength(Vars.maxTextLength); chatfield.getStyle().background = null; chatfield.getStyle().font = Fonts.chat; chatfield.getStyle().fontColor = Color.white; @@ -180,7 +178,6 @@ public class ScriptConsoleFragment extends Table{ open = !open; if(mobile){ TextInput input = new TextInput(); - input.maxLength = maxTextLength; input.accepted = text -> { chatfield.setText(text); sendMessage(); @@ -221,6 +218,10 @@ public class ScriptConsoleFragment extends Table{ return open; } + public boolean shown(){ + return shown; + } + public void addMessage(String message){ messages.insert(0, message); } diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index 9283a41623..01b700ddc9 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -56,6 +56,8 @@ public class Block extends UnlockableContent{ public final BlockBars bars = new BlockBars(); public final Consumers consumes = new Consumers(); + /** whether to display flow rate */ + public boolean displayFlow = true; /** whether this block is visible in the editor */ public boolean inEditor = true; /** the last configuration value applied to this block. */ @@ -193,8 +195,10 @@ public class Block extends UnlockableContent{ public float buildCostMultiplier = 1f; /** 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; - protected Prov entityType = null; //initialized later + public Prov buildType = null; //initialized later public ObjectMap, Cons2> configurations = new ObjectMap<>(); protected TextureRegion[] generatedIcons; @@ -215,7 +219,7 @@ public class Block extends UnlockableContent{ public Block(String name){ super(name); - initEntity(); + initBuilding(); } public void drawBase(Tile tile){ @@ -372,6 +376,13 @@ public class Block extends UnlockableContent{ return this; } + public Object nextConfig(){ + if(saveConfig && lastConfig != null){ + return lastConfig; + } + return null; + } + public void drawRequest(BuildPlan req, Eachable list, boolean valid){ Draw.reset(); Draw.mixcol(!valid ? Pal.breakInvalid : Color.white, (!valid ? 0.4f : 0.24f) + Mathf.absin(Time.globalTime(), 6f, 0.28f)); @@ -387,7 +398,7 @@ public class Block extends UnlockableContent{ TextureRegion reg = getRequestRegion(req, list); Draw.rect(reg, req.drawx(), req.drawy(), !rotate ? 0 : req.rotation * 90); - if(req.hasConfig){ + if(req.config != null){ drawRequestConfig(req, list); } } @@ -490,8 +501,8 @@ public class Block extends UnlockableContent{ return destructible || update; } - public final Building newEntity(){ - return entityType.get(); + public final Building newBuilding(){ + return buildType.get(); } public Rect bounds(int x, int y, Rect rect){ @@ -567,7 +578,7 @@ public class Block extends UnlockableContent{ Arrays.sort(requirements, Structs.comparingInt(i -> i.item.id)); } - protected void initEntity(){ + protected void initBuilding(){ //attempt to find the first declared class and use it as the entity type try{ Class current = getClass(); @@ -576,13 +587,13 @@ public class Block extends UnlockableContent{ current = current.getSuperclass(); } - while(entityType == null && Block.class.isAssignableFrom(current)){ + while(buildType == null && Block.class.isAssignableFrom(current)){ //first class that is subclass of Building Class type = Structs.find(current.getDeclaredClasses(), t -> Building.class.isAssignableFrom(t) && !t.isInterface()); if(type != null){ //these are inner classes, so they have an implicit parameter generated Constructor cons = (Constructor)type.getDeclaredConstructor(type.getDeclaringClass()); - entityType = () -> { + buildType = () -> { try{ return cons.newInstance(this); }catch(Exception e){ @@ -598,9 +609,9 @@ public class Block extends UnlockableContent{ }catch(Throwable ignored){ } - if(entityType == null){ + if(buildType == null){ //assign default value - entityType = Building::create; + buildType = Building::create; } } @@ -662,7 +673,7 @@ public class Block extends UnlockableContent{ public void load(){ region = Core.atlas.find(name); - if(cracks == null || (cracks[0][0].getTexture() != null && cracks[0][0].getTexture().isDisposed())){ + if(cracks == null || (cracks[0][0].texture != null && cracks[0][0].texture.isDisposed())){ cracks = new TextureRegion[maxCrackSize][crackRegions]; for(int size = 1; size <= maxCrackSize; size++){ for(int i = 0; i < crackRegions; i++){ diff --git a/core/src/mindustry/world/Build.java b/core/src/mindustry/world/Build.java index 23bf31c47a..39c4f8024b 100644 --- a/core/src/mindustry/world/Build.java +++ b/core/src/mindustry/world/Build.java @@ -10,7 +10,7 @@ import mindustry.entities.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.world.blocks.*; -import mindustry.world.blocks.BuildBlock.*; +import mindustry.world.blocks.ConstructBlock.*; import static mindustry.Vars.*; @@ -32,10 +32,10 @@ public class Build{ int rotation = tile.build != null ? tile.build.rotation : 0; Block previous = tile.block(); - Block sub = BuildBlock.get(previous.size); + Block sub = ConstructBlock.get(previous.size); tile.setBlock(sub, team, rotation); - tile.bc().setDeconstruct(previous); + tile.bc().setDeconstruct(previous); tile.build.health(tile.build.maxHealth() * prevPercent); Core.app.post(() -> Events.fire(new BlockBuildBeginEvent(tile, team, true))); @@ -54,12 +54,12 @@ public class Build{ if(tile == null) return; Block previous = tile.block(); - Block sub = BuildBlock.get(result.size); + Block sub = ConstructBlock.get(result.size); result.beforePlaceBegan(tile, previous); tile.setBlock(sub, team, rotation); - tile.bc().setConstruct(previous, result); + tile.bc().setConstruct(previous, result); result.placeBegan(tile, previous); @@ -91,7 +91,7 @@ public class Build{ } if(type.isMultiblock()){ - if((type.canReplace(tile.block()) || (tile.block instanceof BuildBlock && tile.bc().cblock == type)) && + 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 @@ -145,7 +145,7 @@ public class Build{ && (!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 BuildBlock && tile.bc().cblock == type)) + && (((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); } diff --git a/core/src/mindustry/world/Edges.java b/core/src/mindustry/world/Edges.java index 4b45ca3a32..097c016541 100644 --- a/core/src/mindustry/world/Edges.java +++ b/core/src/mindustry/world/Edges.java @@ -51,7 +51,7 @@ public class Edges{ } public static Tile getFacingEdge(Building tile, Building other){ - return getFacingEdge(tile.block(), tile.tileX(), tile.tileY(), other.tile()); + return getFacingEdge(tile.block, tile.tileX(), tile.tileY(), other.tile()); } public static Tile getFacingEdge(Tile tile, Tile other){ diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index a6a3b8d27d..f3b4526ad8 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -23,8 +23,6 @@ public class Tile implements Position, QuadTreeObject, Displayable{ /** Extra data for very specific blocks. */ public byte data; - /** Tile traversal cost. */ - public short cost = 1; /** Tile entity, usually null. */ public @Nullable Building build; public short x, y; @@ -47,7 +45,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ this.block = wall; //update entity and create it if needed - changeEntity(Team.derelict, wall::newEntity, 0); + changeEntity(Team.derelict, wall::newBuilding, 0); changed(); } @@ -150,7 +148,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } public Team team(){ - return build == null ? Team.derelict : build.team(); + return build == null ? Team.derelict : build.team; } public void setTeam(Team team){ @@ -176,12 +174,16 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } public void setBlock(@NonNull Block type, Team team, int rotation){ - setBlock(type, team, rotation, type::newEntity); + setBlock(type, team, rotation, type::newBuilding); } public void setBlock(@NonNull Block type, Team team, int rotation, Prov entityprov){ changing = true; + if(type.isStatic() || this.block.isStatic()){ + recache(); + } + this.block = type; preChanged(); changeEntity(team, entityprov, (byte)Mathf.mod(rotation, 4)); @@ -288,6 +290,11 @@ public class Tile implements Position, QuadTreeObject, Displayable{ Call.removeTile(this); } + /** set()-s this tile, except it's synced across the network */ + public void setNet(Block block){ + Call.setTile(this, block, Team.derelict, 0); + } + /** set()-s this tile, except it's synced across the network */ public void setNet(Block block, Team team, int rotation){ Call.setTile(this, block, team, rotation); @@ -319,7 +326,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ setOverlay(content.block(ore)); } - public void setOverlay(Block block){ + public void setOverlay(@NonNull Block block){ this.overlay = (Floor)block; recache(); @@ -442,44 +449,6 @@ public class Tile implements Position, QuadTreeObject, Displayable{ return block.solid && block.fillsTile && !block.synthetic() ? data : 0; } - public void updateOcclusion(){ - cost = 1; - boolean occluded = false; - - //check for occlusion - for(int i = 0; i < 8; i++){ - Point2 point = Geometry.d8[i]; - Tile tile = world.tile(x + point.x, y + point.y); - if(tile != null && tile.floor.isLiquid){ - cost += 4; - } - if(tile != null && tile.solid()){ - occluded = true; - break; - } - } - - if(occluded){ - cost += 2; - } - - if(block.synthetic() && solid()){ - cost += Mathf.clamp(block.health / 6f, 0, 1000); - } - - if(floor.isLiquid){ - cost += 10; - } - - if(floor.drownTime > 0){ - cost += 70; - } - - if(cost < 0){ - cost = Byte.MAX_VALUE; - } - } - protected void preChanged(){ if(build != null){ //only call removed() for the center block - this only gets called once. @@ -487,7 +456,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ build.removeFromProximity(); //remove this tile's dangling entities - if(build.block().isMultiblock()){ + if(build.block.isMultiblock()){ int cx = build.tileX(), cy = build.tileY(); int size = build.block.size; int offsetx = -(size - 1) / 2; @@ -502,8 +471,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ other.block = Blocks.air; //manually call changed event - other.updateOcclusion(); - world.notifyChanged(other); + other.fireChanged(); } } } @@ -541,7 +509,7 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } if(block.hasEntity()){ - build = entityprov.get().init(this, team, block.update, rotation); + build = entityprov.get().init(this, team, block.update && !state.isEditor(), rotation); } } @@ -553,16 +521,14 @@ public class Tile implements Position, QuadTreeObject, Displayable{ //since the entity won't update proximity for us, update proximity for all nearby tiles manually for(Point2 p : Geometry.d4){ Building tile = world.build(x + p.x, y + p.y); - if(tile != null && !tile.tile().changing){ + if(tile != null && !tile.tile.changing){ tile.onProximityUpdate(); } } } } - updateOcclusion(); - - world.notifyChanged(this); + fireChanged(); //recache when static block is added if(block.isStatic()){ @@ -570,6 +536,10 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } } + protected void fireChanged(){ + world.notifyChanged(this); + } + @Override public void display(Table table){ Block toDisplay = overlay.itemDrop != null ? overlay : floor; diff --git a/core/src/mindustry/world/Tiles.java b/core/src/mindustry/world/Tiles.java index 3fa0a0aef0..e525350c0c 100644 --- a/core/src/mindustry/world/Tiles.java +++ b/core/src/mindustry/world/Tiles.java @@ -72,7 +72,7 @@ public class Tiles implements Iterable{ return get(Point2.x(pos), Point2.y(pos)); } - public void each(Cons cons){ + public void eachTile(Cons cons){ for(Tile tile : array){ cons.get(tile); } diff --git a/core/src/mindustry/world/blocks/Autotiler.java b/core/src/mindustry/world/blocks/Autotiler.java index 5990dee006..b9cff3840e 100644 --- a/core/src/mindustry/world/blocks/Autotiler.java +++ b/core/src/mindustry/world/blocks/Autotiler.java @@ -31,14 +31,14 @@ public interface Autotiler{ default TextureRegion topHalf(TextureRegion input){ TextureRegion region = Tmp.tr1; region.set(input); - region.setWidth(region.getWidth() / 2); + region.setWidth(region.width / 2); return region; } default TextureRegion botHalf(TextureRegion input){ TextureRegion region = Tmp.tr1; region.set(input); - int width = region.getWidth(); + int width = region.width; region.setWidth(width / 2); region.setX(region.getX() + width); return region; @@ -104,7 +104,7 @@ public interface Autotiler{ for(int i = 0; i < 4; i++){ int realDir = Mathf.mod(rotation - i, 4); - if(blends(tile, rotation, directional, i, world) && (tile != null && tile.getNearbyEntity(realDir) != null && !tile.getNearbyEntity(realDir).block().squareSprite)){ + if(blends(tile, rotation, directional, i, world) && (tile != null && tile.getNearbyEntity(realDir) != null && !tile.getNearbyEntity(realDir).block.squareSprite)){ blendresult[4] |= (1 << i); } } @@ -147,7 +147,7 @@ public interface Autotiler{ default boolean blends(Tile tile, int rotation, int direction){ Building other = tile.getNearbyEntity(Mathf.mod(rotation - direction, 4)); - return other != null && other.team() == tile.team() && blends(tile, rotation, other.tileX(), other.tileY(), other.rotation, other.block()); + return other != null && other.team == tile.team() && blends(tile, rotation, other.tileX(), other.tileY(), other.rotation, other.block); } default boolean blendsArmored(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ diff --git a/core/src/mindustry/world/blocks/BuildBlock.java b/core/src/mindustry/world/blocks/ConstructBlock.java similarity index 87% rename from core/src/mindustry/world/blocks/BuildBlock.java rename to core/src/mindustry/world/blocks/ConstructBlock.java index e16f01aad2..95674dc86b 100644 --- a/core/src/mindustry/world/blocks/BuildBlock.java +++ b/core/src/mindustry/world/blocks/ConstructBlock.java @@ -23,51 +23,61 @@ import mindustry.world.modules.*; import static mindustry.Vars.*; -public class BuildBlock extends Block{ +/** A block in the process of construction. */ +public class ConstructBlock extends Block{ public static final int maxSize = 16; - private static final BuildBlock[] buildBlocks = new BuildBlock[maxSize]; + private static final ConstructBlock[] consBlocks = new ConstructBlock[maxSize]; private static long lastTime = 0; private static int pitchSeq = 0; private static long lastPlayed; - public BuildBlock(int size){ + public ConstructBlock(int size){ super("build" + size); this.size = size; update = true; health = 20; consumesTap = true; solidifes = true; - buildBlocks[size - 1] = this; + consBlocks[size - 1] = this; } /** Returns a BuildBlock by size. */ - public static BuildBlock get(int size){ - if(size > maxSize) throw new IllegalArgumentException("No. Don't place BuildBlocks of size greater than " + maxSize); - return buildBlocks[size - 1]; + public static ConstructBlock get(int size){ + if(size > maxSize) throw new IllegalArgumentException("No. Don't place ConstructBlock of size greater than " + maxSize); + return consBlocks[size - 1]; } @Remote(called = Loc.server) - public static void deconstructFinish(Tile tile, Block block, int builderID){ + public static void deconstructFinish(Tile tile, Block block, Unit builder){ Team team = tile.team(); Fx.breakBlock.at(tile.drawx(), tile.drawy(), block.size); - Events.fire(new BlockBuildEndEvent(tile, Groups.unit.getByID(builderID), team, true)); + Events.fire(new BlockBuildEndEvent(tile, builder, team, true, null)); tile.remove(); if(shouldPlay()) Sounds.breaks.at(tile, calcPitch(false)); } @Remote(called = Loc.server) - public static void constructFinish(Tile tile, Block block, int builderID, byte rotation, Team team, boolean skipConfig){ + public static void constructFinish(Tile tile, Block block, Unit builder, byte rotation, Team team, Object config){ if(tile == null) return; + float healthf = tile.build == null ? 1f : tile.build.healthf(); + tile.setBlock(block, team, rotation); - tile.build.health = block.health * healthf; - //last builder was this local client player, call placed() - if(!headless && builderID == player.unit().id()){ - if(!skipConfig){ - tile.build.playerPlaced(); + + if(tile.build != null){ + tile.build.health = block.health * healthf; + + if(config != null){ + tile.build.configured(builder, config); } } + + //last builder was this local client player, call placed() + if(tile.build != null && !headless && builder == player.unit()){ + tile.build.playerPlaced(config); + } + Fx.placeBlock.at(tile.drawx(), tile.drawy(), block.size); } @@ -95,11 +105,11 @@ public class BuildBlock extends Block{ } } - public static void constructed(Tile tile, Block block, int builderID, byte rotation, Team team, boolean skipConfig){ - Call.constructFinish(tile, block, builderID, rotation, team, skipConfig); + 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(); - Events.fire(new BlockBuildEndEvent(tile, Groups.unit.getByID(builderID), team, false)); + Events.fire(new BlockBuildEndEvent(tile, builder, team, false, config)); if(shouldPlay()) Sounds.place.at(tile, calcPitch(true)); } @@ -108,7 +118,7 @@ public class BuildBlock extends Block{ return true; } - public class BuildEntity extends Building{ + public class ConstructBuild extends Building{ /** * The recipe of the block that is being constructed. * If there is no recipe for this block, as is the case with rocks, 'previous' is used. @@ -122,7 +132,7 @@ public class BuildBlock extends Block{ * If a non-recipe block is being deconstructed, this is the block that is being deconstructed. */ public Block previous; - public int builderID = -1; + public Object lastConfig; private float[] accumulator; private float[] totalAccumulator; @@ -154,7 +164,7 @@ public class BuildBlock extends Block{ if(control.input.buildWasAutoPaused && !control.input.isBuilding && player.isBuilder()){ control.input.isBuilding = true; } - player.builder().addBuild(new BuildPlan(tile.x, tile.y, rotation, cblock), false); + player.builder().addBuild(new BuildPlan(tile.x, tile.y, rotation, cblock, lastConfig), false); } } @@ -190,12 +200,14 @@ public class BuildBlock extends Block{ }); } - public boolean construct(Unit builder, @Nullable Building core, float amount, boolean configured){ + public void construct(Unit builder, @Nullable Building core, float amount, Object config){ if(cblock == null){ kill(); - return false; + return; } + lastConfig = config; + if(cblock.requirements.length != accumulator.length || totalAccumulator.length != cblock.requirements.length){ setConstruct(previous, cblock); } @@ -211,16 +223,13 @@ public class BuildBlock extends Block{ maxProgress = core == null || team.rules().infiniteResources ? maxProgress : checkRequired(core.items, maxProgress, true); progress = Mathf.clamp(progress + maxProgress); - builderID = builder.id; if(progress >= 1f || state.rules.infiniteResources){ - constructed(tile, cblock, builderID, (byte)rotation, builder.team, configured); - return true; + constructed(tile, cblock, builder, (byte)rotation, builder.team, config); } - return false; } - public void deconstruct(Unitc builder, @Nullable Building core, float amount){ + public void deconstruct(Unit builder, @Nullable Building core, float amount){ float deconstructMultiplier = state.rules.deconstructRefundMultiplier; if(cblock != null){ @@ -253,10 +262,8 @@ public class BuildBlock extends Block{ progress = Mathf.clamp(progress - amount); - builderID = builder.id(); - if(progress <= 0 || state.rules.infiniteResources){ - Call.deconstructFinish(tile, this.cblock == null ? previous : this.cblock, builderID); + Call.deconstructFinish(tile, this.cblock == null ? previous : this.cblock, builder); } } diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index d36c83d0b5..7d38a302ba 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -142,7 +142,7 @@ public class LaunchPad extends Block{ Draw.z(Layer.weather - 1); TextureRegion region = Core.atlas.find("launchpod"); - float rw = region.getWidth() * Draw.scl * scale, rh = region.getHeight() * Draw.scl * scale; + float rw = region.width * Draw.scl * scale, rh = region.height * Draw.scl * scale; Draw.alpha(alpha); Draw.rect(region, cx, cy, rw, rh, rotation); diff --git a/core/src/mindustry/world/blocks/defense/Door.java b/core/src/mindustry/world/blocks/defense/Door.java index 7186152f36..c745f3a63f 100644 --- a/core/src/mindustry/world/blocks/defense/Door.java +++ b/core/src/mindustry/world/blocks/defense/Door.java @@ -1,5 +1,6 @@ package mindustry.world.blocks.defense; +import arc.audio.*; import arc.Graphics.*; import arc.Graphics.Cursor.*; import arc.graphics.g2d.*; @@ -23,6 +24,7 @@ public class Door extends Wall{ public final int timerToggle = timers++; public Effect openfx = Fx.dooropen; public Effect closefx = Fx.doorclose; + public Sound doorSound = Sounds.door; public @Load("@-open") TextureRegion openRegion; public Door(String name){ @@ -32,7 +34,7 @@ public class Door extends Wall{ consumesTap = true; config(Boolean.class, (DoorBuild base, Boolean open) -> { - Sounds.door.at(base); + doorSound.at(base); for(DoorBuild entity : base.chained){ //skip doors with things in them diff --git a/core/src/mindustry/world/blocks/defense/ForceProjector.java b/core/src/mindustry/world/blocks/defense/ForceProjector.java index d748a947b5..8d54dfad9f 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -31,7 +31,7 @@ public class ForceProjector extends Block{ public float basePowerDraw = 0.2f; public @Load("@-top") TextureRegion topRegion; - static ForceProjectorEntity paramEntity; + 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())){ trait.absorb(); @@ -48,8 +48,6 @@ public class ForceProjector extends Block{ hasPower = true; hasLiquids = true; hasItems = true; - //TODO this isn't good enough, shields are still clipped - expanded = true; consumes.add(new ConsumeLiquidFilter(liquid -> liquid.temperature <= 0.5f && liquid.flammability < 0.1f, 0.1f)).boost().update(false); } @@ -72,20 +70,32 @@ public class ForceProjector extends Block{ Draw.color(Pal.gray); Lines.stroke(3f); - Lines.poly(x * tilesize, y * tilesize, 6, radius); + Lines.poly(x * tilesize + offset, y * tilesize + offset, 6, radius); Draw.color(player.team().color); Lines.stroke(1f); - Lines.poly(x * tilesize, y * tilesize, 6, radius); + Lines.poly(x * tilesize + offset, y * tilesize + offset, 6, radius); Draw.color(); } - public class ForceProjectorEntity extends Building{ - boolean broken = true; - float buildup = 0f; - float radscl = 0f; - float hit; - float warmup; - float phaseHeat; + public class ForceBuild extends Building{ + public boolean broken = true; + public float buildup, radscl, hit, warmup, phaseHeat; + public ForceDraw drawer; + + @Override + public void created(){ + super.created(); + drawer = ForceDraw.create(); + drawer.build = this; + drawer.set(x, y); + drawer.add(); + } + + @Override + public void onRemoved(){ + super.onRemoved(); + drawer.remove(); + } @Override public void updateTile(){ @@ -123,7 +133,7 @@ public class ForceProjector extends Block{ if(buildup >= breakage && !broken){ broken = true; buildup = breakage; - Fx.shieldBreak.at(x, y, radius, team.color); + Fx.shieldBreak.at(x, y, realRadius(), team.color); } if(hit > 0f){ @@ -138,7 +148,7 @@ public class ForceProjector extends Block{ } } - float realRadius(){ + public float realRadius(){ return (radius + phaseHeat * phaseRadiusBoost) * radscl; } @@ -146,6 +156,10 @@ public class ForceProjector extends Block{ public void draw(){ super.draw(); + if(drawer != null){ + drawer.set(x, y); + } + if(buildup > 0f){ Draw.alpha(buildup / breakage * 0.75f); Draw.blend(Blending.additive); @@ -153,7 +167,9 @@ public class ForceProjector extends Block{ Draw.blend(); Draw.reset(); } + } + public void drawShield(){ if(!broken){ float radius = realRadius(); @@ -196,4 +212,21 @@ public class ForceProjector extends Block{ phaseHeat = read.f(); } } + + @EntityDef(value = {ForceDrawc.class}, serialize = false) + @Component(base = true) + abstract class ForceDrawComp implements Drawc{ + transient ForceBuild build; + + @Override + public void draw(){ + build.drawShield(); + } + + @Replace + @Override + public float clipSize(){ + return build.realRadius() * 3f; + } + } } diff --git a/core/src/mindustry/world/blocks/defense/MendProjector.java b/core/src/mindustry/world/blocks/defense/MendProjector.java index be8e814fc8..f9fc7b0ac8 100644 --- a/core/src/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/mindustry/world/blocks/defense/MendProjector.java @@ -55,7 +55,7 @@ public class MendProjector extends Block{ Drawf.dashCircle(x * tilesize + offset, y * tilesize + offset, range, Pal.accent); } - public class MendEntity extends Building{ + public class MendBuild extends Building{ float heat; float charge = Mathf.random(reload); float phaseHeat; @@ -77,7 +77,7 @@ public class MendProjector extends Block{ indexer.eachBlock(this, realRange, other -> other.damaged(), other -> { other.heal(other.maxHealth() * (healPercent + phaseHeat * phaseBoost) / 100f * efficiency()); - Fx.healBlockFull.at(other.x, other.y, other.block().size, Tmp.c1.set(baseColor).lerp(phaseColor, phaseHeat)); + Fx.healBlockFull.at(other.x, other.y, other.block.size, Tmp.c1.set(baseColor).lerp(phaseColor, phaseHeat)); }); } } diff --git a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java index 8af0b723c2..56010c7c0f 100644 --- a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java @@ -60,7 +60,7 @@ public class OverdriveProjector extends Block{ } } - public class OverdriveEntity extends Building{ + public class OverdriveBuild extends Building{ float heat; float charge = Mathf.random(reload); float phaseHeat; @@ -96,7 +96,7 @@ public class OverdriveProjector extends Block{ public void drawSelect(){ float realRange = range + phaseHeat * phaseRangeBoost; - indexer.eachBlock(this, realRange, other -> other.block().canOverdrive, other -> Drawf.selected(other, Tmp.c1.set(baseColor).a(Mathf.absin(4f, 1f)))); + indexer.eachBlock(this, realRange, other -> other.block.canOverdrive, other -> Drawf.selected(other, Tmp.c1.set(baseColor).a(Mathf.absin(4f, 1f)))); Drawf.dashCircle(x, y, realRange, baseColor); } diff --git a/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java b/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java index a3fffe06f3..75e24a8e87 100644 --- a/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java +++ b/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java @@ -60,7 +60,7 @@ public class PointDefenseTurret extends Block{ stats.add(BlockStat.reload, 60f / reloadTime, StatUnit.none); } - public class PointDefenseEntity extends Building{ + public class PointDefenseBuild extends Building{ public float rotation = 90, reload; public @Nullable Bullet target; @@ -72,8 +72,13 @@ public class PointDefenseTurret extends Block{ target = Groups.bullet.intersect(x - range, y - range, range*2, range*2).min(b -> b.team == team || !b.type().hittable ? Float.MAX_VALUE : b.dst2(this)); } + //pooled bullets + if(target != null && !target.isAdded()){ + target = null; + } + //look at target - if(target != null && target.within(this, range) && target.team != team && target.type().hittable){ + if(target != null && target.within(this, range) && target.team != team && target.type() != null && target.type().hittable){ float dest = angleTo(target); rotation = Angles.moveToward(rotation, dest, rotateSpeed * edelta()); reload -= edelta(); diff --git a/core/src/mindustry/world/blocks/defense/ShockMine.java b/core/src/mindustry/world/blocks/defense/ShockMine.java index 8421fb4257..00c805ac48 100644 --- a/core/src/mindustry/world/blocks/defense/ShockMine.java +++ b/core/src/mindustry/world/blocks/defense/ShockMine.java @@ -1,5 +1,6 @@ package mindustry.world.blocks.defense; +import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import mindustry.entities.*; @@ -15,6 +16,7 @@ public class ShockMine extends Block{ public float damage = 13; public int length = 10; public int tendrils = 6; + public Color lightningColor = Pal.lancerLaser; public ShockMine(String name){ super(name); @@ -25,7 +27,7 @@ public class ShockMine extends Block{ rebuildable = false; } - public class ShockMineEntity extends Building{ + public class ShockMineBuild extends Building{ @Override public void drawTeam(){ @@ -43,9 +45,9 @@ public class ShockMine extends Block{ @Override public void unitOn(Unit unit){ - if(unit.team() != team && timer(timerDamage, cooldown)){ + if(enabled && unit.team != team && timer(timerDamage, cooldown)){ for(int i = 0; i < tendrils; i++){ - Lightning.create(team, Pal.lancerLaser, damage, x, y, Mathf.random(360f), length); + Lightning.create(team, lightningColor, damage, x, y, Mathf.random(360f), length); } damage(tileDamage); } diff --git a/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java b/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java index 971de2d887..9e9035bb77 100644 --- a/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java +++ b/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java @@ -31,6 +31,7 @@ public class TractorBeamTurret extends Block{ public float scaledForce = 0f; public float damage = 0f; public boolean targetAir = true, targetGround = false; + public Color laserColor = Color.white; public TractorBeamTurret(String name){ super(name); @@ -60,7 +61,7 @@ public class TractorBeamTurret extends Block{ stats.add(BlockStat.damage, damage * 60f, StatUnit.perSecond); } - public class TractorBeamEntity extends Building{ + public class TractorBeamBuild extends Building{ public float rotation = 90; public @Nullable Unit target; public float lastX, lastY, strength; @@ -113,7 +114,7 @@ public class TractorBeamTurret extends Block{ float ang = angleTo(lastX, lastY); float len = 5f; - Draw.mixcol(Color.white, Mathf.absin(4f, 0.6f)); + Draw.mixcol(laserColor, Mathf.absin(4f, 0.6f)); Drawf.laser(team, laser, laserEnd, x + Angles.trnsx(ang, len), y + Angles.trnsy(ang, len), diff --git a/core/src/mindustry/world/blocks/defense/Wall.java b/core/src/mindustry/world/blocks/defense/Wall.java index 64f575a254..c496b7e227 100644 --- a/core/src/mindustry/world/blocks/defense/Wall.java +++ b/core/src/mindustry/world/blocks/defense/Wall.java @@ -19,9 +19,11 @@ public class Wall extends Block{ public float lightningChance = -0.001f; public float lightningDamage = 20f; public int lightningLength = 17; + public Color lightningColor = Pal.surge; public float chanceDeflect = 10f; - public boolean flashWhite; + public boolean flashHit; + public Color flashColor = Color.white; public boolean deflect; public Wall(String name){ @@ -68,10 +70,10 @@ public class Wall extends Block{ } //draw flashing white overlay if enabled - if(flashWhite){ + if(flashHit){ if(hit < 0.0001f) return; - Draw.color(Color.white); + Draw.color(flashColor); Draw.alpha(hit * 0.5f); Draw.blend(Blending.additive); Fill.rect(x, y, tilesize * size, tilesize * size); @@ -91,14 +93,17 @@ public class Wall extends Block{ //create lightning if necessary if(lightningChance > 0){ if(Mathf.chance(lightningChance)){ - Lightning.create(team(), Pal.surge, lightningDamage, x, y, bullet.rotation() + 180f, lightningLength); + Lightning.create(team, lightningColor, lightningDamage, x, y, bullet.rotation() + 180f, lightningLength); } } //deflect bullets if necessary if(deflect){ + //slow bullets are not deflected + if(bullet.vel().len() <= 0.2f) return true; + //bullet reflection chance depends on bullet damage - if(!Mathf.chance(chanceDeflect/bullet.damage())) return true; + if(!Mathf.chance(chanceDeflect / bullet.damage())) return true; //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/ItemTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java index acbc23ccf4..ea94a670b9 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -62,6 +62,7 @@ public class ItemTurret extends Turret{ } public class ItemTurretBuild extends TurretBuild{ + @Override public void onProximityAdded(){ super.onProximityAdded(); @@ -72,6 +73,13 @@ public class ItemTurret extends Turret{ } } + @Override + public void updateTile(){ + unit.ammo((float)unit.type().ammoCapacity * totalAmmo / maxAmmo); + + super.updateTile(); + } + @Override public void displayBars(Table bars){ super.displayBars(bars); @@ -138,13 +146,18 @@ public class ItemTurret extends Turret{ return ammoTypes.get(item) != null && totalAmmo + ammoTypes.get(item).ammoMultiplier <= maxAmmo; } + @Override + public byte version(){ + return 2; + } + @Override public void write(Writes write){ super.write(write); write.b(ammo.size); for(AmmoEntry entry : ammo){ ItemEntry i = (ItemEntry)entry; - write.b(i.item.id); + write.s(i.item.id); write.s(i.amount); } } @@ -152,12 +165,16 @@ public class ItemTurret extends Turret{ @Override public void read(Reads read, byte revision){ super.read(read, revision); - byte amount = read.b(); + int amount = read.ub(); for(int i = 0; i < amount; i++){ - Item item = Vars.content.item(read.b()); + Item item = Vars.content.item(revision < 2 ? read.ub() : read.s()); short a = read.s(); totalAmmo += a; - ammo.add(new ItemEntry(item, a)); + + //only add ammo if this is a valid ammo type + if(ammoTypes.containsKey(item)){ + ammo.add(new ItemEntry(item, a)); + } } } } diff --git a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java index 3c4bcdb676..59dbc3fbbe 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -65,7 +65,7 @@ public class LaserTurret extends PowerTurret{ bullet = null; } }else if(reload > 0){ - Liquid liquid = liquids().current(); + Liquid liquid = liquids.current(); float maxUsed = consumes.get(ConsumeType.liquid).amount; float used = (cheating() ? maxUsed * Time.delta : Math.min(liquids.get(liquid), maxUsed * Time.delta)) * liquid.heatCapacity * coolantMultiplier; diff --git a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 752528970b..c834dbb6bb 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -72,6 +72,13 @@ public class LiquidTurret extends Turret{ return target != null && hasAmmo(); } + @Override + public void updateTile(){ + unit.ammo(unit.type().ammoCapacity * liquids.currentAmount() / liquidCapacity); + + super.updateTile(); + } + @Override protected void findTarget(){ if(liquids.current().canExtinguish()){ @@ -108,7 +115,7 @@ public class LiquidTurret extends Turret{ public BulletType useAmmo(){ if(cheating()) return ammoTypes.get(liquids.current()); BulletType type = ammoTypes.get(liquids.current()); - liquids.remove(liquids.current(), type.ammoMultiplier); + liquids.remove(liquids.current(), 1f / type.ammoMultiplier); return type; } @@ -119,7 +126,7 @@ public class LiquidTurret extends Turret{ @Override public boolean hasAmmo(){ - return ammoTypes.get(liquids.current()) != null && liquids.total() >= ammoTypes.get(liquids.current()).ammoMultiplier; + return ammoTypes.get(liquids.current()) != null && liquids.total() >= 1f / ammoTypes.get(liquids.current()).ammoMultiplier; } @Override @@ -131,7 +138,7 @@ public class LiquidTurret extends Turret{ public boolean acceptLiquid(Building source, Liquid liquid, float amount){ return ammoTypes.get(liquid) != null && (liquids.current() == liquid || (ammoTypes.containsKey(liquids.current()) - && liquids.get(liquids.current()) <= ammoTypes.get(liquids.current()).ammoMultiplier + 0.001f)); + && liquids.get(liquids.current()) <= 1f / ammoTypes.get(liquids.current()).ammoMultiplier + 0.001f)); } } } diff --git a/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java b/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java index 03a973e2e2..c65d637859 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -28,6 +28,13 @@ public class PowerTurret extends Turret{ public class PowerTurretBuild extends TurretBuild{ + @Override + public void updateTile(){ + unit.ammo(power.status * unit.type().ammoCapacity); + + super.updateTile(); + } + @Override public BulletType useAmmo(){ //nothing used directly diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 6a2b5c9729..731c493198 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -436,7 +436,7 @@ public abstract class Turret extends Block{ public void read(Reads read, byte revision){ super.read(read, revision); - if(revision == 1){ + if(revision >= 1){ reload = read.f(); rotation = read.f(); } diff --git a/core/src/mindustry/world/blocks/distribution/ArmoredConveyor.java b/core/src/mindustry/world/blocks/distribution/ArmoredConveyor.java index 48a44bd416..cba1366147 100644 --- a/core/src/mindustry/world/blocks/distribution/ArmoredConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/ArmoredConveyor.java @@ -18,7 +18,7 @@ public class ArmoredConveyor extends Conveyor{ public class ArmoredConveyorBuild extends ConveyorBuild{ @Override public boolean acceptItem(Building source, Item item){ - return super.acceptItem(source, item) && (source.block() instanceof Conveyor || Edges.getFacingEdge(source.tile(), tile).relativeTo(tile) == rotation); + return super.acceptItem(source, item) && (source.block instanceof Conveyor || Edges.getFacingEdge(source.tile(), tile).relativeTo(tile) == rotation); } } } diff --git a/core/src/mindustry/world/blocks/distribution/BufferedItemBridge.java b/core/src/mindustry/world/blocks/distribution/BufferedItemBridge.java index c5bc795440..a0eddc20c1 100644 --- a/core/src/mindustry/world/blocks/distribution/BufferedItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/BufferedItemBridge.java @@ -29,7 +29,7 @@ public class BufferedItemBridge extends ExtendingItemBridge{ } Item item = buffer.poll(speed / timeScale); - if(timer(timerAccept, 4) && item != null && other.acceptItem(this, item)){ + if(timer(timerAccept, 4 / timeScale) && item != null && other.acceptItem(this, item)){ cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); other.handleItem(this, item); buffer.remove(); diff --git a/core/src/mindustry/world/blocks/distribution/Conveyor.java b/core/src/mindustry/world/blocks/distribution/Conveyor.java index e54c1962ae..19d769f85f 100644 --- a/core/src/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/mindustry/world/blocks/distribution/Conveyor.java @@ -63,7 +63,7 @@ public class Conveyor extends Block implements Autotiler{ if(bits == null) return; TextureRegion region = regions[bits[0]][0]; - Draw.rect(region, req.drawx(), req.drawy(), region.getWidth() * bits[1] * Draw.scl, region.getHeight() * bits[2] * Draw.scl, req.rotation * 90); + Draw.rect(region, req.drawx(), req.drawy(), region.width * bits[1] * Draw.scl, region.height * bits[2] * Draw.scl, req.rotation * 90); } @Override @@ -163,7 +163,7 @@ public class Conveyor extends Block implements Autotiler{ if(front() != null && front() != null){ next = front(); - nextc = next instanceof ConveyorBuild && next.team() == team ? (ConveyorBuild)next : null; + nextc = next instanceof ConveyorBuild && next.team == team ? (ConveyorBuild)next : null; aligned = nextc != null && rotation == next.rotation; } } @@ -178,7 +178,7 @@ public class Conveyor extends Block implements Autotiler{ float mspeed = speed * tilesize * 55f; float centerSpeed = 0.1f; float centerDstScl = 3f; - float tx = Geometry.d4x[rotation], ty = Geometry.d4y[rotation]; + float tx = Geometry.d4x(rotation), ty = Geometry.d4y(rotation); float centerx = 0f, centery = 0f; @@ -289,9 +289,9 @@ public class Conveyor extends Block implements Autotiler{ @Override public boolean acceptItem(Building source, Item item){ if(len >= capacity) return false; - Tile facing = Edges.getFacingEdge(source.tile(), tile); + Tile facing = Edges.getFacingEdge(source.tile, tile); int direction = Math.abs(facing.relativeTo(tile.x, tile.y) - rotation); - return (((direction == 0) && minitem >= itemSpace) || ((direction % 2 == 1) && minitem > 0.7f)) && !(source.block().rotate && (source.rotation + 2) % 4 == rotation); + return (((direction == 0) && minitem >= itemSpace) || ((direction % 2 == 1) && minitem > 0.7f)) && !(source.block.rotate && (source.rotation + 2) % 4 == rotation); } @Override @@ -299,7 +299,7 @@ public class Conveyor extends Block implements Autotiler{ if(len >= capacity) return; int r = rotation; - Tile facing = Edges.getFacingEdge(source.tile(), tile); + Tile facing = Edges.getFacingEdge(source.tile, tile); int ang = ((facing.relativeTo(tile.x, tile.y) - r)); float x = (ang == -1 || ang == 3) ? 1 : (ang == 1 || ang == -3) ? -1 : 0; diff --git a/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java b/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java index c4829e3f90..18bc444eec 100644 --- a/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ExtendingItemBridge.java @@ -28,8 +28,8 @@ public class ExtendingItemBridge extends ItemBridge{ int i = tile.absoluteRelativeTo(other.x, other.y); - float ex = other.worldx() - x - Geometry.d4[i].x * tilesize / 2f, - ey = other.worldy() - y - Geometry.d4[i].y * tilesize / 2f; + float ex = other.worldx() - x - Geometry.d4(i).x * tilesize / 2f, + ey = other.worldy() - y - Geometry.d4(i).y * tilesize / 2f; float uptime = state.isEditor() ? 1f : this.uptime; @@ -42,15 +42,15 @@ public class ExtendingItemBridge extends ItemBridge{ Lines.stroke(8f); Lines.line(bridgeRegion, - x + Geometry.d4[i].x * tilesize / 2f, - y + Geometry.d4[i].y * tilesize / 2f, + x + Geometry.d4(i).x * tilesize / 2f, + y + Geometry.d4(i).y * tilesize / 2f, x + ex, - y + ey, false, 0f); + y + ey, false); Draw.rect(endRegion, x, y, i * 90 + 90); Draw.rect(endRegion, - x + ex + Geometry.d4[i].x * tilesize / 2f, - y + ey + Geometry.d4[i].y * tilesize / 2f, i * 90 + 270); + x + ex + Geometry.d4(i).x * tilesize / 2f, + y + ey + Geometry.d4(i).y * tilesize / 2f, i * 90 + 270); int dist = Math.max(Math.abs(other.x - tile.x), Math.abs(other.y - tile.y)); @@ -61,8 +61,8 @@ public class ExtendingItemBridge extends ItemBridge{ for(int a = 0; a < arrows; a++){ Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity); Draw.rect(arrowRegion, - x + Geometry.d4[i].x * (tilesize / 2f + a * 6f + 2) * uptime, - y + Geometry.d4[i].y * (tilesize / 2f + a * 6f + 2) * uptime, + x + Geometry.d4(i).x * (tilesize / 2f + a * 6f + 2) * uptime, + y + Geometry.d4(i).y * (tilesize / 2f + a * 6f + 2) * uptime, i * 90f); } Draw.reset(); diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index 559ab16f6f..7fa0f21987 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -41,7 +41,7 @@ public class ItemBridge extends Block{ hasItems = true; unloadable = false; group = BlockGroup.transportation; - canOverdrive = false; + noUpdateDisabled = true; //point2 config is relative config(Point2.class, (ItemBridgeBuild tile, Point2 i) -> tile.link = Point2.pack(i.x + tile.tileX(), i.y + tile.tileY())); @@ -61,11 +61,17 @@ public class ItemBridge extends Block{ if(otherReq == null) return; Lines.stroke(8f); - Lines.line(bridgeRegion, - req.drawx(), - req.drawy(), - otherReq.drawx(), - otherReq.drawy(), false, -tilesize / 2f); + + Tmp.v1.set(otherReq.drawx(), otherReq.drawy()).sub(req.drawx(), req.drawy()).setLength(tilesize/2f); + + Lines.line( + bridgeRegion, + req.drawx() + Tmp.v1.x, + req.drawy() + Tmp.v1.y, + otherReq.drawx() - Tmp.v1.x, + otherReq.drawy() - Tmp.v1.y, false + ); + Draw.rect(arrowRegion, (req.drawx() + otherReq.drawx()) / 2f, (req.drawy() + otherReq.drawy()) / 2f, Angles.angle(req.drawx(), req.drawy(), otherReq.drawx(), otherReq.drawy())); } @@ -93,7 +99,7 @@ public class ItemBridge extends Block{ float h = (link.y == y ? tilesize : Math.abs(link.y - y) * tilesize - tilesize); Lines.rect((x + link.x) / 2f * tilesize - w / 2f, (y + link.y) / 2f * tilesize - h / 2f, w, h); - Draw.rect("bridge-arrow", link.x * tilesize + Geometry.d4[rot].x * tilesize, link.y * tilesize + Geometry.d4[rot].y * tilesize, link.absoluteRelativeTo(x, y) * 90); + Draw.rect("bridge-arrow", link.x * tilesize + Geometry.d4(rot).x * tilesize, link.y * tilesize + Geometry.d4(rot).y * tilesize, link.absoluteRelativeTo(x, y) * 90); } Draw.reset(); } @@ -133,8 +139,10 @@ public class ItemBridge extends Block{ public float cycleSpeed = 1f; @Override - public void playerPlaced(){ - super.playerPlaced(); + public void playerPlaced(Object config){ + super.playerPlaced(config); + + if(config != null) return; Tile link = findLink(tile.x, tile.y); if(linkValid(tile, link)){ @@ -214,7 +222,7 @@ public class ItemBridge extends Block{ return true; } - if(linkValid(tile, other.tile())){ + if(linkValid(tile, other.tile)){ if(link == other.pos()){ configure(-1); }else{ @@ -265,7 +273,7 @@ public class ItemBridge extends Block{ Item item = items.take(); if(item != null && other.acceptItem(this, item)){ other.handleItem(this, item); - cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); + cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); //TODO this is kinda broken, because lerping only happens on a timer }else{ cycleSpeed = Mathf.lerpDelta(cycleSpeed, 1f, 0.01f); if(item != null) items.add(item, 1); @@ -294,11 +302,14 @@ public class ItemBridge extends Block{ Draw.rect(endRegion, other.drawx(), other.drawy(), i * 90 + 270); Lines.stroke(8f); + + Tmp.v1.set(x, y).sub(other.worldx(), other.worldy()).setLength(-tilesize/2f); + Lines.line(bridgeRegion, - x, - y, - other.worldx(), - other.worldy(), false, -tilesize / 2f); + x + Tmp.v1.x, + y + Tmp.v1.y, + other.worldx() - Tmp.v1.x, + other.worldy() - Tmp.v1.y, false); int dist = Math.max(Math.abs(other.x - tile.x), Math.abs(other.y - tile.y)); @@ -310,8 +321,8 @@ public class ItemBridge extends Block{ for(int a = 0; a < arrows; a++){ Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity); Draw.rect(arrowRegion, - x + Geometry.d4[i].x * (tilesize / 2f + a * 4f + time % 4f), - y + Geometry.d4[i].y * (tilesize / 2f + a * 4f + time % 4f), i * 90f); + x + Geometry.d4(i).x * (tilesize / 2f + a * 4f + time % 4f), + y + Geometry.d4(i).y * (tilesize / 2f + a * 4f + time % 4f), i * 90f); } Draw.reset(); } @@ -341,7 +352,7 @@ public class ItemBridge extends Block{ @Override public boolean acceptLiquid(Building source, Liquid liquid, float amount){ - if(team != source.team() || !hasLiquids) return false; + if(team != source.team || !hasLiquids) return false; Tile other = world.tile(link); @@ -358,7 +369,7 @@ public class ItemBridge extends Block{ } protected boolean linked(Building source){ - return source instanceof ItemBridgeBuild && linkValid(source.tile(), tile) && ((ItemBridgeBuild)source).link == pos(); + return source instanceof ItemBridgeBuild && linkValid(source.tile, tile) && ((ItemBridgeBuild)source).link == pos(); } @Override @@ -369,7 +380,7 @@ public class ItemBridge extends Block{ protected boolean checkDump(Building to){ Tile other = world.tile(link); if(!linkValid(tile, other)){ - Tile edge = Edges.getFacingEdge(to.tile(), tile); + Tile edge = Edges.getFacingEdge(to.tile, tile); int i = relativeTo(edge.x, edge.y); IntSetIterator it = incoming.iterator(); diff --git a/core/src/mindustry/world/blocks/distribution/Junction.java b/core/src/mindustry/world/blocks/distribution/Junction.java index 324cfaf11d..26801e86c2 100644 --- a/core/src/mindustry/world/blocks/distribution/Junction.java +++ b/core/src/mindustry/world/blocks/distribution/Junction.java @@ -19,6 +19,7 @@ public class Junction extends Block{ solid = true; group = BlockGroup.transportation; unloadable = false; + noUpdateDisabled = true; } @Override @@ -49,7 +50,7 @@ public class Junction extends Block{ Building dest = nearby(i); //skip blocks that don't want the item, keep waiting until they do - if(dest == null || !dest.acceptItem(this, item) || dest.team() != team){ + if(dest == null || !dest.acceptItem(this, item) || dest.team != team){ continue; } @@ -73,7 +74,7 @@ public class Junction extends Block{ if(relative == -1 || !buffer.accepts(relative)) return false; Building to = nearby(relative); - return to != null && to.team() == team; + return to != null && to.team == team; } @Override diff --git a/core/src/mindustry/world/blocks/distribution/MassDriver.java b/core/src/mindustry/world/blocks/distribution/MassDriver.java index 303c7811e0..7880c72db6 100644 --- a/core/src/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/mindustry/world/blocks/distribution/MassDriver.java @@ -1,5 +1,6 @@ package mindustry.world.blocks.distribution; +import arc.audio.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; @@ -30,6 +31,7 @@ public class MassDriver extends Block{ public Effect shootEffect = Fx.shootBig2; public Effect smokeEffect = Fx.shootBigSmoke2; public Effect receiveEffect = Fx.mineBig; + public Sound shootSound = Sounds.shootBig; public float shake = 3f; public @Load("@-base") TextureRegion baseRegion; @@ -41,6 +43,8 @@ public class MassDriver extends Block{ hasItems = true; hasPower = true; outlineIcon = true; + sync = true; + //point2 is relative config(Point2.class, (MassDriverBuild tile, Point2 point) -> tile.link = Point2.pack(point.x + tile.tileX(), point.y + tile.tileY())); config(Integer.class, (MassDriverBuild tile, Integer point) -> tile.link = point); @@ -58,7 +62,7 @@ public class MassDriver extends Block{ //check if a mass driver is selected while placing this driver if(!control.input.frag.config.isShown()) return; Building selected = control.input.frag.config.getSelectedTile(); - if(selected == null || !(selected.block() instanceof MassDriver) || !(selected.within(x * tilesize, y * tilesize, range))) return; + if(selected == null || !(selected.block instanceof MassDriver) || !(selected.within(x * tilesize, y * tilesize, range))) return; //if so, draw a dotted line towards it while it is in range float sin = Mathf.absin(Time.time(), 6f, 1f); @@ -151,7 +155,7 @@ public class MassDriver extends Block{ if( items.total() >= minDistribute && //must shoot minimum amount of items - link.block().itemCapacity - link.items.total() >= minDistribute //must have minimum amount of space + link.block.itemCapacity - link.items.total() >= minDistribute //must have minimum amount of space ){ MassDriverBuild other = (MassDriverBuild)link; other.waitingShooters.add(tile); @@ -221,7 +225,7 @@ public class MassDriver extends Block{ if(link == other.pos()){ configure(-1); return false; - }else if(other.block() instanceof MassDriver && other.dst(tile) <= range && other.team() == team){ + }else if(other.block instanceof MassDriver && other.dst(tile) <= range && other.team == team){ configure(other.pos()); return false; } @@ -252,7 +256,7 @@ public class MassDriver extends Block{ float angle = tile.angleTo(target); - Bullets.driverBolt.create(this, team(), + Bullets.driverBolt.create(this, team, x + Angles.trnsx(angle, translation), y + Angles.trnsy(angle, translation), angle, -1f, bulletSpeed, bulletLifetime, data); @@ -263,6 +267,8 @@ public class MassDriver extends Block{ y + Angles.trnsy(angle, translation), angle); Effect.shake(shake, shake, this); + + shootSound.at(tile, Mathf.random(0.9f, 1.1f)); } public void handlePayload(Bullet bullet, DriverBulletData data){ @@ -318,7 +324,7 @@ public class MassDriver extends Block{ super.read(read, revision); link = read.i(); rotation = read.f(); - state = DriverState.values()[read.b()]; + state = DriverState.all[read.b()]; } } @@ -326,6 +332,8 @@ public class MassDriver extends Block{ idle, //nothing is shooting at this mass driver and it does not have any target accepting, //currently getting shot at, unload items shooting, - unloading + unloading; + + public static final DriverState[] all = values(); } } diff --git a/core/src/mindustry/world/blocks/distribution/OverflowGate.java b/core/src/mindustry/world/blocks/distribution/OverflowGate.java index bbd11bd8c3..981080a95d 100644 --- a/core/src/mindustry/world/blocks/distribution/OverflowGate.java +++ b/core/src/mindustry/world/blocks/distribution/OverflowGate.java @@ -76,7 +76,7 @@ public class OverflowGate extends Block{ @Override public boolean acceptItem(Building source, Item item){ - return team == source.team() && lastItem == null && items.total() == 0; + return team == source.team && lastItem == null && items.total() == 0; } @Override @@ -91,16 +91,17 @@ public class OverflowGate extends Block{ int from = relativeToEdge(src); if(from == -1) return null; Building to = nearby((from + 2) % 4); - boolean canForward = to != null && to.acceptItem(this, item) && to.team() == team && !(to.block() instanceof OverflowGate); + boolean canForward = to != null && to.acceptItem(this, item) && to.team == team && !(to.block instanceof OverflowGate); + boolean inv = invert == enabled; - if(!canForward || invert){ + if(!canForward || inv){ Building a = nearby(Mathf.mod(from - 1, 4)); Building b = nearby(Mathf.mod(from + 1, 4)); - boolean ac = a != null && a.acceptItem(this, item) && !(a.block() instanceof OverflowGate) && a.team == team; - boolean bc = b != null && b.acceptItem(this, item) && !(b.block() instanceof OverflowGate) && b.team == team; + boolean ac = a != null && a.acceptItem(this, item) && !(a.block instanceof OverflowGate) && a.team == team; + boolean bc = b != null && b.acceptItem(this, item) && !(b.block instanceof OverflowGate) && b.team == team; if(!ac && !bc){ - return invert && canForward ? to : null; + return inv && canForward ? to : null; } if(ac && !bc){ diff --git a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java index 6c790b322d..6d1e765fa6 100644 --- a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java @@ -17,7 +17,7 @@ import mindustry.world.blocks.production.*; import static mindustry.Vars.*; public class PayloadConveyor extends Block{ - public float moveTime = 70f; + public float moveTime = 50f; public @Load("@-top") TextureRegion topRegion; public @Load("@-edge") TextureRegion edgeRegion; public Interp interp = Interp.pow5; @@ -29,6 +29,8 @@ public class PayloadConveyor extends Block{ rotate = true; update = true; outputsPayload = true; + noUpdateDisabled = true; + sync = true; } @Override @@ -42,8 +44,8 @@ public class PayloadConveyor extends Block{ for(int i = 0; i < 4; i++){ Building other = world.build(x + Geometry.d4x[i] * size, y + Geometry.d4y[i] * size); - if(other != null && other.block().outputsPayload && other.block().size == size){ - Drawf.selected(other.tileX(), other.tileY(), other.block(), Pal.accent); + if(other != null && other.block.outputsPayload && other.block.size == size){ + Drawf.selected(other.tileX(), other.tileY(), other.block, Pal.accent); } } } @@ -70,13 +72,13 @@ public class PayloadConveyor extends Block{ //next block must be aligned and of the same size if(accept != null && ( //same size - (accept.block().size == size && tileX() + Geometry.d4(rotation).x * size == accept.tileX() && tileY() + Geometry.d4(rotation).y * size == accept.tileY()) || + (accept.block.size == size && tileX() + Geometry.d4(rotation).x * size == accept.tileX() && tileY() + Geometry.d4(rotation).y * size == accept.tileY()) || //differing sizes - (accept.block().size > size && + (accept.block.size > size && (rotation % 2 == 0 ? //check orientation - Math.abs(accept.y - y) <= (accept.block().size * tilesize - size * tilesize)/2f : //check Y alignment - Math.abs(accept.x - x) <= (accept.block().size * tilesize - size * tilesize)/2f //check X alignment + Math.abs(accept.y - y) <= (accept.block.size * tilesize - size * tilesize)/2f : //check Y alignment + Math.abs(accept.x - x) <= (accept.block.size * tilesize - size * tilesize)/2f //check X alignment )))){ next = accept; }else{ @@ -85,7 +87,7 @@ public class PayloadConveyor extends Block{ int ntrns = 1 + size/2; Tile next = tile.getNearby(Geometry.d4(rotation).x * ntrns, Geometry.d4(rotation).y * ntrns); - blocked = (next != null && next.solid()) || (this.next != null && (this.next.rotation + 2)%4 == rotation); + blocked = (next != null && next.solid() && !next.block().outputsPayload) || (this.next != null && (this.next.rotation + 2)%4 == rotation); } @Override @@ -95,7 +97,9 @@ public class PayloadConveyor extends Block{ @Override public void updateTile(){ - progress = Time.time() % moveTime; + if(!enabled) return; + + progress = time() % moveTime; updatePayload(); @@ -104,6 +108,7 @@ public class PayloadConveyor extends Block{ if(curStep > step){ boolean valid = step != -1; step = curStep; + boolean had = item != null; if(valid && stepAccepted != curStep && item != null){ if(next != null){ @@ -125,9 +130,17 @@ public class PayloadConveyor extends Block{ } } } + + if(had && item != null){ + moveFailed(); + } } } + public void moveFailed(){ + + } + public void moved(){ } @@ -151,20 +164,20 @@ public class PayloadConveyor extends Block{ float s = tilesize * size; //next - Tmp.v1.set((s-clipped.getWidth()*Draw.scl) + clipped.getWidth()/2f*Draw.scl - s/2f, s-clipped.getHeight()*Draw.scl + clipped.getHeight()/2f*Draw.scl - s/2f).rotate(rot); + Tmp.v1.set((s- clipped.width *Draw.scl) + clipped.width /2f*Draw.scl - s/2f, s- clipped.height *Draw.scl + clipped.height /2f*Draw.scl - s/2f).rotate(rot); Draw.rect(clipped, x + Tmp.v1.x, y + Tmp.v1.y, rot); clipped = clipRegion(tile.getHitbox(Tmp.r1), tile.getHitbox(Tmp.r2).move(trprev, 0), topRegion); //prev - Tmp.v1.set(- s/2f + clipped.getWidth()/2f*Draw.scl, - s/2f + clipped.getHeight()/2f*Draw.scl).rotate(rot); + Tmp.v1.set(- s/2f + clipped.width /2f*Draw.scl, - s/2f + clipped.height /2f*Draw.scl).rotate(rot); Draw.rect(clipped, x + Tmp.v1.x, y + Tmp.v1.y, rot); for(int i = 0; i < 4; i++){ if(blends(i) && i != rotation){ Draw.alpha(1f - Interp.pow5In.apply(fract())); //prev from back - Tmp.v1.set(- s/2f + clipped.getWidth()/2f*Draw.scl, - s/2f + clipped.getHeight()/2f*Draw.scl).rotate(i * 90 + 180); + Tmp.v1.set(- s/2f + clipped.width /2f*Draw.scl, - s/2f + clipped.height /2f*Draw.scl).rotate(i * 90 + 180); Draw.rect(clipped, x + Tmp.v1.x, y + Tmp.v1.y, i * 90 + 180); } } @@ -184,17 +197,24 @@ public class PayloadConveyor extends Block{ } } + public float time(){ + return Time.time(); + } + @Override public boolean acceptPayload(Building source, Payload payload){ + if(source == this){ + return this.item == null && payload.fits(); + } //accepting payloads from units isn't supported - return this.item == null && progress <= 5f && source != this && payload.fits(); + return this.item == null && progress <= 5f && payload.fits(); } @Override public void handlePayload(Building source, Payload payload){ this.item = payload; this.stepAccepted = curStep(); - this.itemRotation = source.angleTo(this); + this.itemRotation = source == this ? rotdeg() : source.angleTo(this); this.animation = 0; updatePayload(); @@ -213,7 +233,7 @@ public class PayloadConveyor extends Block{ public void read(Reads read, byte revision){ super.read(read, revision); - progress = read.f(); + read.f(); //why is progress written? itemRotation = read.f(); item = Payload.read(read); } @@ -254,12 +274,12 @@ public class PayloadConveyor extends Block{ boolean overlaps = Intersector.intersectRectangles(bounds, sprite, over); TextureRegion out = Tmp.tr1; - out.set(region.getTexture()); + out.set(region.texture); if(overlaps){ - float w = region.getU2() - region.getU(); - float h = region.getV2() - region.getV(); - float x = region.getU(), y = region.getV(); + float w = region.u2 - region.u; + float h = region.v2 - region.v; + float x = region.u, y = region.v; float newX = (over.x - sprite.x) / sprite.width * w + x; float newY = (over.y - sprite.y) / sprite.height * h + y; float newW = (over.width / sprite.width) * w, newH = (over.height / sprite.height) * h; @@ -273,7 +293,7 @@ public class PayloadConveyor extends Block{ } public int curStep(){ - return (int)((Time.time()) / moveTime); + return (int)((time()) / moveTime); } public float fract(){ diff --git a/core/src/mindustry/world/blocks/distribution/PayloadRouter.java b/core/src/mindustry/world/blocks/distribution/PayloadRouter.java index d9bff19be2..3f277c82d3 100644 --- a/core/src/mindustry/world/blocks/distribution/PayloadRouter.java +++ b/core/src/mindustry/world/blocks/distribution/PayloadRouter.java @@ -5,7 +5,9 @@ import arc.math.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.entities.units.*; +import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.world.blocks.payloads.*; public class PayloadRouter extends PayloadConveyor{ public @Load("@-over") TextureRegion overRegion; @@ -33,13 +35,27 @@ public class PayloadRouter extends PayloadConveyor{ smoothRot = rotdeg(); } + public void pickNext(){ + if(item != null){ + int rotations = 0; + do{ + rotation = (rotation + 1) % 4; + onProximityUpdate(); + //this condition intentionally uses "accept from itself" conditions, because payload conveyors only accept during the start + //"accept from self" conditions are for dropped payloads and are less restrictive + }while((blocked || next == null || !next.acceptPayload(next, item)) && ++rotations < 4); + } + } + @Override - public void moved(){ - int rotations = 0; - do{ - rotation = (rotation + 1) % 4; - onProximityUpdate(); - }while((blocked || next == null) && ++rotations < 4); + public void handlePayload(Building source, Payload payload){ + super.handlePayload(source, payload); + pickNext(); + } + + @Override + public void moveFailed(){ + pickNext(); } @Override diff --git a/core/src/mindustry/world/blocks/distribution/Router.java b/core/src/mindustry/world/blocks/distribution/Router.java index cc184ac3a9..cb0ae9807d 100644 --- a/core/src/mindustry/world/blocks/distribution/Router.java +++ b/core/src/mindustry/world/blocks/distribution/Router.java @@ -35,7 +35,7 @@ public class Router extends Block{ time += 1f / speed * delta(); Building target = getTileTarget(lastItem, lastInput, false); - if(target != null && (time >= 1f || !(target.block() instanceof Router))){ + if(target != null && (time >= 1f || !(target.block instanceof Router || target.block.instantTransfer))){ getTileTarget(lastItem, lastInput, true); target.handleItem(this, lastItem); items.remove(lastItem, 1); @@ -51,7 +51,7 @@ public class Router extends Block{ @Override public boolean acceptItem(Building source, Item item){ - return team == source.team() && lastItem == null && items.total() == 0; + return team == source.team && lastItem == null && items.total() == 0; } @Override @@ -76,7 +76,7 @@ public class Router extends Block{ for(int i = 0; i < proximity.size; i++){ Building other = proximity.get((i + counter) % proximity.size); if(set) rotation = ((byte)((rotation + 1) % proximity.size)); - if(other.tile() == from && from.block() == Blocks.overflowGate) continue; + if(other.tile == from && from.block() == Blocks.overflowGate) continue; if(other.acceptItem(this, item)){ return other; } diff --git a/core/src/mindustry/world/blocks/distribution/Sorter.java b/core/src/mindustry/world/blocks/distribution/Sorter.java index 81d9cd3a01..6deed76005 100644 --- a/core/src/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/mindustry/world/blocks/distribution/Sorter.java @@ -51,7 +51,7 @@ public class Sorter extends Block{ public @Nullable Item sortItem; @Override - public void configured(Player player, Object value){ + public void configured(Unit player, Object value){ super.configured(player, value); if(!headless){ @@ -76,7 +76,7 @@ public class Sorter extends Block{ public boolean acceptItem(Building source, Item item){ Building to = getTileTarget(item, source, false); - return to != null && to.acceptItem(this, item) && to.team() == team; + return to != null && to.acceptItem(this, item) && to.team == team; } @Override @@ -88,7 +88,7 @@ public class Sorter extends Block{ public boolean isSame(Building other){ // comment code below to allow sorter/gate chaining - return other != null && other.block().instantTransfer; + return other != null && other.block.instantTransfer; } public Building getTileTarget(Item item, Building source, boolean flip){ @@ -105,9 +105,9 @@ public class Sorter extends Block{ }else{ Building a = nearby(Mathf.mod(dir - 1, 4)); Building b = nearby(Mathf.mod(dir + 1, 4)); - boolean ac = a != null && !(a.block().instantTransfer && source.block().instantTransfer) && + boolean ac = a != null && !(a.block.instantTransfer && source.block.instantTransfer) && a.acceptItem(this, item); - boolean bc = b != null && !(b.block().instantTransfer && source.block().instantTransfer) && + boolean bc = b != null && !(b.block.instantTransfer && source.block.instantTransfer) && b.acceptItem(this, item); if(ac && !bc){ diff --git a/core/src/mindustry/world/blocks/distribution/StackConveyor.java b/core/src/mindustry/world/blocks/distribution/StackConveyor.java index 712d62d4c5..983ebaf954 100644 --- a/core/src/mindustry/world/blocks/distribution/StackConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/StackConveyor.java @@ -6,6 +6,7 @@ import arc.util.*; import arc.util.io.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -27,6 +28,8 @@ public class StackConveyor extends Block implements Autotiler{ public float speed = 0f; public boolean splitOut = true; public float recharge = 2f; + public Effect loadEffect = Fx.plasticburn; + public Effect unloadEffect = Fx.plasticburn; public StackConveyor(String name){ super(name); @@ -112,20 +115,22 @@ public class StackConveyor extends Block implements Autotiler{ Draw.z(Layer.blockOver); - Building from = world.build(link); + Tile from = world.tile(link); if(link == -1 || from == null) return; + int fromRot = from.build == null ? rotation : from.build.rotation; + //offset - Tmp.v1.set(from); - Tmp.v2.set(tile); + Tmp.v1.set(from.worldx(), from.worldy()); + Tmp.v2.set(x, y); Tmp.v1.interpolate(Tmp.v2, 1f - cooldown, Interp.linear); //rotation - float a = (from.rotation%4) * 90; + float a = (fromRot%4) * 90; float b = (rotation%4) * 90; - if((from.rotation%4) == 3 && (rotation%4) == 0) a = -1 * 90; - if((from.rotation%4) == 0 && (rotation%4) == 3) a = 4 * 90; + if((fromRot%4) == 3 && (rotation%4) == 0) a = -1 * 90; + if((fromRot%4) == 0 && (rotation%4) == 3) a = 4 * 90; //stack Draw.rect(stackRegion, Tmp.v1.x, Tmp.v1.y, Mathf.lerp(a, b, Interp.smooth.apply(1f - Mathf.clamp(cooldown * 2, 0f, 1f)))); @@ -221,11 +226,11 @@ public class StackConveyor extends Block implements Autotiler{ protected void poofIn(){ link = tile.pos(); - Fx.plasticburn.at(this); + loadEffect.at(this); } protected void poofOut(){ - Fx.plasticburn.at(this); + unloadEffect.at(this); link = -1; } diff --git a/core/src/mindustry/world/blocks/environment/Rock.java b/core/src/mindustry/world/blocks/environment/Boulder.java similarity index 94% rename from core/src/mindustry/world/blocks/environment/Rock.java rename to core/src/mindustry/world/blocks/environment/Boulder.java index 1c3abc1a15..4c90d8204f 100644 --- a/core/src/mindustry/world/blocks/environment/Rock.java +++ b/core/src/mindustry/world/blocks/environment/Boulder.java @@ -7,10 +7,10 @@ import arc.math.Mathf; import mindustry.world.Block; import mindustry.world.Tile; -public class Rock extends Block{ +public class Boulder extends Block{ protected int variants; - public Rock(String name){ + public Boulder(String name){ super(name); breakable = true; alwaysReplace = true; diff --git a/core/src/mindustry/world/blocks/environment/Cliff.java b/core/src/mindustry/world/blocks/environment/Cliff.java index 408fb2ee5a..d4347a7c97 100644 --- a/core/src/mindustry/world/blocks/environment/Cliff.java +++ b/core/src/mindustry/world/blocks/environment/Cliff.java @@ -6,6 +6,7 @@ import mindustry.graphics.*; import mindustry.world.*; public class Cliff extends Block{ + public float size = 11f; public Cliff(String name){ super(name); @@ -18,11 +19,12 @@ public class Cliff extends Block{ @Override public void drawBase(Tile tile){ + int r = tile.data; for(int i = 0; i < 8; i++){ if((r & (1 << i)) != 0){ Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.3f + (i >= 4 ? -0.4f : 0.3f))); - Draw.rect(region, tile.worldx(), tile.worldy(), 11f, 11f, i * 45f); + Draw.rect(region, tile.worldx(), tile.worldy(), size, size, i * 45f); } } diff --git a/core/src/mindustry/world/blocks/environment/Floor.java b/core/src/mindustry/world/blocks/environment/Floor.java index 89a5918469..6640613779 100644 --- a/core/src/mindustry/world/blocks/environment/Floor.java +++ b/core/src/mindustry/world/blocks/environment/Floor.java @@ -103,16 +103,15 @@ public class Floor extends Block{ super.init(); if(wall == Blocks.air){ - wall = content.block(name + "Rocks"); - if(wall == null) wall = content.block(name + "rocks"); - if(wall == null) wall = content.block(name.replace("darksand", "dune") + "rocks"); + wall = content.block(name + "-wall"); + if(wall == null) wall = content.block(name.replace("darksand", "dune") + "-wall"); } //keep default value if not found... if(wall == null) wall = Blocks.air; if(decoration == Blocks.air){ - decoration = content.blocks().min(b -> b instanceof Rock && b.breakable ? mapColor.diff(b.mapColor) : Float.POSITIVE_INFINITY); + decoration = content.blocks().min(b -> b instanceof Boulder && b.breakable ? mapColor.diff(b.mapColor) : Float.POSITIVE_INFINITY); } } diff --git a/core/src/mindustry/world/blocks/environment/StaticTree.java b/core/src/mindustry/world/blocks/environment/StaticTree.java index 3550895b96..5e923f6f5f 100644 --- a/core/src/mindustry/world/blocks/environment/StaticTree.java +++ b/core/src/mindustry/world/blocks/environment/StaticTree.java @@ -16,7 +16,7 @@ public class StaticTree extends StaticWall{ public void drawBase(Tile tile){ TextureRegion r = Tmp.tr1; r.set(region); - int crop = (region.getWidth() - tilesize*4) / 2; + int crop = (region.width - tilesize*4) / 2; float ox = 0; float oy = 0; @@ -24,7 +24,7 @@ public class StaticTree extends StaticWall{ if(tile.getNearby(i) != null && tile.getNearby(i).block() instanceof StaticWall){ if(i == 0){ - r.setWidth(r.getWidth() - crop); + r.setWidth(r.width - crop); ox -= crop /2f; }else if(i == 1){ r.setY(r.getY() + crop); @@ -33,7 +33,7 @@ public class StaticTree extends StaticWall{ r.setX(r.getX() + crop); ox += crop /2f; }else{ - r.setHeight(r.getHeight() - crop); + r.setHeight(r.height - crop); oy += crop /2f; } } diff --git a/core/src/mindustry/world/blocks/environment/StaticWall.java b/core/src/mindustry/world/blocks/environment/StaticWall.java index 4142db8700..2b9e41a41e 100644 --- a/core/src/mindustry/world/blocks/environment/StaticWall.java +++ b/core/src/mindustry/world/blocks/environment/StaticWall.java @@ -10,7 +10,7 @@ import mindustry.world.*; import static mindustry.Vars.world; -public class StaticWall extends Rock{ +public class StaticWall extends Boulder{ public @Load("@-large") TextureRegion large; public TextureRegion[][] split; diff --git a/core/src/mindustry/world/blocks/environment/TreeBlock.java b/core/src/mindustry/world/blocks/environment/TreeBlock.java index bf7382cbaa..b6170b8b85 100644 --- a/core/src/mindustry/world/blocks/environment/TreeBlock.java +++ b/core/src/mindustry/world/blocks/environment/TreeBlock.java @@ -24,7 +24,7 @@ public class TreeBlock extends Block{ float x = tile.worldx(), y = tile.worldy(); float rot = Mathf.randomSeed(tile.pos(), 0, 4) * 90 + Mathf.sin(Time.time() + x, 50f, 0.5f) + Mathf.sin(Time.time() - y, 65f, 0.9f) + Mathf.sin(Time.time() + y - x, 85f, 0.9f); - float w = region.getWidth() * Draw.scl, h = region.getHeight() * Draw.scl; + float w = region.width * Draw.scl, h = region.height * Draw.scl; float scl = 30f, mag = 0.2f; if(shadow.found()){ diff --git a/core/src/mindustry/world/blocks/experimental/BlockLoader.java b/core/src/mindustry/world/blocks/experimental/BlockLoader.java index 0eb5ac903e..0afbeafb78 100644 --- a/core/src/mindustry/world/blocks/experimental/BlockLoader.java +++ b/core/src/mindustry/world/blocks/experimental/BlockLoader.java @@ -56,7 +56,7 @@ public class BlockLoader extends PayloadAcceptor{ 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)/* || + ((((BlockPayload)payload).entity.block.hasItems && ((BlockPayload)payload).block().unloadable && ((BlockPayload)payload).block().itemCapacity >= 10)/* || ((BlockPayload)payload).entity.block().hasLiquids && ((BlockPayload)payload).block().liquidCapacity >= 10f)*/); } @@ -127,7 +127,7 @@ 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.entity.items.total() / (float)payload.entity.block.itemCapacity; } public boolean shouldExport(){ diff --git a/core/src/mindustry/world/blocks/experimental/BlockUnloader.java b/core/src/mindustry/world/blocks/experimental/BlockUnloader.java index be39284cc7..072d64ecea 100644 --- a/core/src/mindustry/world/blocks/experimental/BlockUnloader.java +++ b/core/src/mindustry/world/blocks/experimental/BlockUnloader.java @@ -56,7 +56,7 @@ 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.entity.items.total() / (float)payload.entity.block.itemCapacity; } @Override diff --git a/core/src/mindustry/world/blocks/legacy/LegacyCommandCenter.java b/core/src/mindustry/world/blocks/legacy/LegacyCommandCenter.java deleted file mode 100644 index 2dac9ec300..0000000000 --- a/core/src/mindustry/world/blocks/legacy/LegacyCommandCenter.java +++ /dev/null @@ -1,20 +0,0 @@ -package mindustry.world.blocks.legacy; - -import arc.util.io.*; -import mindustry.gen.*; - -public class LegacyCommandCenter extends LegacyBlock{ - - public LegacyCommandCenter(String name){ - super(name); - update = true; - } - - public class LegacyCommandCenterBuild extends Building{ - @Override - public void read(Reads read, byte revision){ - super.read(read, revision); - read.b(); - } - } -} diff --git a/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java b/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java index 2335cb157d..6327857637 100644 --- a/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java +++ b/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java @@ -26,14 +26,14 @@ public class ArmoredConduit extends Conduit{ // draw the cap when a conduit would normally leak Building next = front(); - if(next != null && next.team() == team && next.block().hasLiquids) return; + if(next != null && next.team == team && next.block.hasLiquids) return; Draw.rect(capRegion, x, y, rotdeg()); } @Override public boolean acceptLiquid(Building source, Liquid liquid, float amount){ - return super.acceptLiquid(source, liquid, amount) && (source.block() instanceof Conduit) || + return super.acceptLiquid(source, liquid, amount) && (source.block instanceof Conduit) || Edges.getFacingEdge(source.tile(), 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 60552d6f3c..0db85e80c0 100644 --- a/core/src/mindustry/world/blocks/liquid/Conduit.java +++ b/core/src/mindustry/world/blocks/liquid/Conduit.java @@ -35,6 +35,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ solid = false; floating = true; conveyorPlacement = true; + noUpdateDisabled = true; } @Override @@ -64,7 +65,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ @Override public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ - return otherblock.hasLiquids && otherblock.outputsLiquid && lookingAtEither(tile, rotation, otherx, othery, otherrot, otherblock); + return otherblock.hasLiquids && (otherblock.outputsLiquid || (lookingAt(tile, rotation, otherx, othery, otherblock))) && lookingAtEither(tile, rotation, otherx, othery, otherrot, otherblock); } @Override diff --git a/core/src/mindustry/world/blocks/liquid/LiquidBridge.java b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java index 8c52310022..c658cde66c 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidBridge.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidBridge.java @@ -15,6 +15,7 @@ public class LiquidBridge extends ItemBridge{ hasItems = false; hasLiquids = true; outputsLiquid = true; + canOverdrive = false; group = BlockGroup.liquids; } diff --git a/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java b/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java index 6d925d7087..76e4929b45 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidExtendingBridge.java @@ -6,7 +6,7 @@ import mindustry.type.*; import mindustry.world.blocks.distribution.*; import mindustry.world.meta.*; -import static mindustry.Vars.world; +import static mindustry.Vars.*; public class LiquidExtendingBridge extends ExtendingItemBridge{ @@ -42,7 +42,7 @@ public class LiquidExtendingBridge extends ExtendingItemBridge{ if(moveLiquid(other, liquids.current()) > 0.1f){ cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); }else{ - cycleSpeed = Mathf.lerpDelta(cycleSpeed, 1f, 0.01f); + cycleSpeed = Mathf.lerpDelta(cycleSpeed, 0f, 0.01f); } } } diff --git a/core/src/mindustry/world/blocks/liquid/LiquidJunction.java b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java index 4d0942afab..2845281d96 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidJunction.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java @@ -36,10 +36,12 @@ public class LiquidJunction extends LiquidBlock{ @Override public Building getLiquidDestination(Building source, Liquid liquid){ + if(!enabled) return this; + 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, 0f) && !(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 42ce949915..60fab24df1 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidRouter.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidRouter.java @@ -7,9 +7,11 @@ public class LiquidRouter extends LiquidBlock{ public LiquidRouter(String name){ super(name); + + noUpdateDisabled = true; } - public class LiquidRouterEntity extends LiquidBuild{ + public class LiquidRouterBuild extends LiquidBuild{ @Override public void updateTile(){ if(liquids.total() > 0.01f){ diff --git a/core/src/mindustry/world/blocks/logic/LogicBlock.java b/core/src/mindustry/world/blocks/logic/LogicBlock.java index b077f69884..24dcaa4b7e 100644 --- a/core/src/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -16,7 +16,8 @@ import mindustry.logic.LAssembler.*; import mindustry.logic.LExecutor.*; import mindustry.ui.*; import mindustry.world.*; -import mindustry.world.blocks.BuildBlock.*; +import mindustry.world.blocks.ConstructBlock.*; +import mindustry.world.meta.*; import java.io.*; import java.util.zip.*; @@ -24,8 +25,6 @@ import java.util.zip.*; import static mindustry.Vars.*; public class LogicBlock extends Block{ - public static final int maxInstructions = 2000; - public int maxInstructionScale = 5; public int instructionsPerTick = 1; public float range = 8 * 10; @@ -69,7 +68,7 @@ public class LogicBlock extends Block{ if(name.contains("-")){ String[] split = name.split("-"); //filter out 'large' at the end of block names - if(split.length >= 2 && split[split.length - 1].equals("large")){ + if(split.length >= 2 && (split[split.length - 1].equals("large") || Strings.canParseFloat(split[split.length - 1]))){ name = split[split.length - 2]; }else{ name = split[split.length - 1]; @@ -113,6 +112,14 @@ public class LogicBlock extends Block{ } } + @Override + public void setStats(){ + super.setStats(); + + stats.add(BlockStat.linkRange, range / 8, StatUnit.blocks); + stats.add(BlockStat.instructions, instructionsPerTick * 60, StatUnit.perSecond); + } + @Override public void drawPlace(int x, int y, int rotation, boolean valid){ Drawf.circles(x*tilesize + offset, y*tilesize + offset, range); @@ -198,7 +205,6 @@ public class LogicBlock extends Block{ stream.readInt(); } }else{ - for(int i = 0; i < total; i++){ String name = stream.readUTF(); short x = stream.readShort(), y = stream.readShort(); @@ -262,7 +268,7 @@ public class LogicBlock extends Block{ try{ //create assembler to store extra variables - LAssembler asm = LAssembler.assemble(str, maxInstructions); + LAssembler asm = LAssembler.assemble(str, LExecutor.maxInstructions); //store connections for(LogicLink link : links){ @@ -281,6 +287,7 @@ public class LogicBlock extends Block{ } asm.putConst("@links", executor.links.length); + asm.putConst("@ipt", instructionsPerTick); //store any older variables for(Var var : executor.vars){ @@ -298,13 +305,15 @@ public class LogicBlock extends Block{ } asm.putConst("@this", this); + asm.putConst("@thisx", x); + asm.putConst("@thisy", y); executor.load(asm); }catch(Exception e){ e.printStackTrace(); //handle malformed code and replace it with nothing - executor.load("", maxInstructions); + executor.load("", LExecutor.maxInstructions); } } } @@ -320,7 +329,9 @@ public class LogicBlock extends Block{ //check for previously invalid links to add after configuration boolean changed = false; - for(LogicLink l : links){ + for(int i = 0; i < links.size; i++){ + LogicLink l = links.get(i); + if(!l.active) continue; boolean valid = validLink(world.build(l.x, l.y)); @@ -328,10 +339,18 @@ public class LogicBlock extends Block{ changed = true; l.valid = valid; if(valid){ + Building lbuild = world.build(l.x, l.y); + //this prevents conflicts l.name = ""; //finds a new matching name after toggling - l.name = findLinkName(world.build(l.x, l.y).block); + l.name = findLinkName(lbuild.block); + + //remove redundant links + links.removeAll(o -> world.build(o.x, o.y) == lbuild && o != l); + + //break to prevent concurrent modification + break; } } } @@ -340,15 +359,17 @@ public class LogicBlock extends Block{ updateCode(); } - accumulator += edelta() * instructionsPerTick; + if(enabled){ + accumulator += edelta() * instructionsPerTick * (consValid() ? 1 : 0); - if(accumulator > maxInstructionScale * instructionsPerTick) accumulator = maxInstructionScale * instructionsPerTick; + if(accumulator > maxInstructionScale * instructionsPerTick) accumulator = maxInstructionScale * instructionsPerTick; - for(int i = 0; i < (int)accumulator; i++){ - if(executor.initialized()){ - executor.runOnce(); + for(int i = 0; i < (int)accumulator; i++){ + if(executor.initialized()){ + executor.runOnce(); + } + accumulator --; } - accumulator --; } } @@ -391,7 +412,7 @@ public class LogicBlock extends Block{ } public boolean validLink(Building other){ - return other != null && other.isValid() && other.team == team && other.within(this, range + other.block.size*tilesize/2f) && !(other instanceof BuildEntity); + return other != null && other.isValid() && other.team == team && other.within(this, range + other.block.size*tilesize/2f) && !(other instanceof ConstructBuild); } diff --git a/core/src/mindustry/world/blocks/logic/LogicDisplay.java b/core/src/mindustry/world/blocks/logic/LogicDisplay.java index ee3d53707a..9a6592ea36 100644 --- a/core/src/mindustry/world/blocks/logic/LogicDisplay.java +++ b/core/src/mindustry/world/blocks/logic/LogicDisplay.java @@ -10,6 +10,7 @@ import mindustry.annotations.Annotations.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.world.*; +import mindustry.world.meta.*; public class LogicDisplay extends Block{ public static final byte @@ -33,11 +34,18 @@ public class LogicDisplay extends Block{ solid = true; } + @Override + public void setStats(){ + super.setStats(); + + stats.add(BlockStat.displaySize, "@x@", displaySize, displaySize); + } + public class LogicDisplayBuild extends Building{ public FrameBuffer buffer; public float color = Color.whiteFloatBits; public float stroke = 1f; - public LongQueue commands = new LongQueue(); + public LongQueue commands = new LongQueue(256); @Override public void draw(){ @@ -59,7 +67,6 @@ public class LogicDisplay extends Block{ buffer.begin(); Draw.color(color); Lines.stroke(stroke); - Lines.precise(true); while(!commands.isEmpty()){ long c = commands.removeFirst(); @@ -80,8 +87,6 @@ public class LogicDisplay extends Block{ } } - Lines.precise(false); - buffer.end(); Draw.proj(Tmp.m1); Draw.reset(); diff --git a/core/src/mindustry/world/blocks/logic/MessageBlock.java b/core/src/mindustry/world/blocks/logic/MessageBlock.java index 0e92b2eb0d..26722774c6 100644 --- a/core/src/mindustry/world/blocks/logic/MessageBlock.java +++ b/core/src/mindustry/world/blocks/logic/MessageBlock.java @@ -11,7 +11,6 @@ import arc.util.*; import arc.util.io.*; import arc.util.pooling.*; import mindustry.gen.*; -import mindustry.net.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; import mindustry.world.*; @@ -30,8 +29,8 @@ public class MessageBlock extends Block{ destructible = true; config(String.class, (MessageBuild tile, String text) -> { - if(net.server() && text.length() > maxTextLength){ - throw new ValidateException(player, "Player has gone above text limit."); + if(text.length() > maxTextLength){ + return; //no. } tile.message.ensureCapacity(text.length()); diff --git a/core/src/mindustry/world/blocks/payloads/BlockPayload.java b/core/src/mindustry/world/blocks/payloads/BlockPayload.java index b82fa9dfbc..3fc87dbe6b 100644 --- a/core/src/mindustry/world/blocks/payloads/BlockPayload.java +++ b/core/src/mindustry/world/blocks/payloads/BlockPayload.java @@ -14,7 +14,7 @@ public class BlockPayload implements Payload{ public Building entity; public BlockPayload(Block block, Team team){ - this.entity = block.newEntity().create(block, team); + this.entity = block.newBuilding().create(block, team); } public BlockPayload(Building entity){ @@ -22,7 +22,7 @@ public class BlockPayload implements Payload{ } public Block block(){ - return entity.block(); + return entity.block; } public void place(Tile tile){ @@ -30,24 +30,19 @@ public class BlockPayload implements Payload{ } public void place(Tile tile, int rotation){ - tile.setBlock(entity.block(), entity.team(), rotation, () -> entity); + tile.setBlock(entity.block, entity.team, rotation, () -> entity); entity.dropped(); } @Override - public boolean canBeTaken(Payloadc picker){ - return entity.block.size <= 2; - } - - @Override - public boolean fits(){ - return entity.block().size < 3; + public float size(){ + return entity.block.size * tilesize; } @Override public void write(Writes write){ write.b(payloadBlock); - write.s(entity.block().id); + write.s(entity.block.id); write.b(entity.version()); entity.writeAll(write); } @@ -59,7 +54,7 @@ public class BlockPayload implements Payload{ @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); + 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/Payload.java b/core/src/mindustry/world/blocks/payloads/Payload.java index 3a136474b3..d7d800bba6 100644 --- a/core/src/mindustry/world/blocks/payloads/Payload.java +++ b/core/src/mindustry/world/blocks/payloads/Payload.java @@ -6,7 +6,7 @@ import mindustry.game.*; import mindustry.gen.*; import mindustry.world.*; -import static mindustry.Vars.content; +import static mindustry.Vars.*; public interface Payload{ int payloadUnit = 0, payloadBlock = 1; @@ -17,6 +17,9 @@ public interface Payload{ /** draws this payload at a position. */ void draw(); + /** @return hitbox size of the payload. */ + float size(); + /** @return whether this payload was dumped. */ default boolean dump(){ return false; @@ -24,12 +27,7 @@ public interface Payload{ /** @return whether this payload fits on a standard 3x3 conveyor. */ default boolean fits(){ - return true; - } - - /** @return whether the unit can pick up this payload. */ - default boolean canBeTaken(Payloadc picker){ - return true; + return size() / tilesize <= 2.4f; } /** writes the payload for saving. */ diff --git a/core/src/mindustry/world/blocks/payloads/UnitPayload.java b/core/src/mindustry/world/blocks/payloads/UnitPayload.java index ee912480de..4c835cacce 100644 --- a/core/src/mindustry/world/blocks/payloads/UnitPayload.java +++ b/core/src/mindustry/world/blocks/payloads/UnitPayload.java @@ -15,16 +15,6 @@ public class UnitPayload implements Payload{ this.unit = unit; } - @Override - public boolean fits(){ - return unit.hitSize <= 16f; - } - - @Override - public boolean canBeTaken(Payloadc picker){ - return unit.hitSize < picker.hitSize(); - } - @Override public void write(Writes write){ write.b(payloadUnit); @@ -38,6 +28,11 @@ public class UnitPayload implements Payload{ unit.rotation(rotation); } + @Override + public float size(){ + return unit.hitSize; + } + @Override public boolean dump(){ //no client dumping diff --git a/core/src/mindustry/world/blocks/power/NuclearReactor.java b/core/src/mindustry/world/blocks/power/NuclearReactor.java index 18dfd0afca..ac449d90db 100644 --- a/core/src/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/mindustry/world/blocks/power/NuclearReactor.java @@ -70,7 +70,7 @@ public class NuclearReactor extends PowerGenerator{ @Override public void updateTile(){ ConsumeLiquid cliquid = consumes.get(ConsumeType.liquid); - Item item = consumes.get(ConsumeType.item).items[0].item; + Item item = consumes.getItem().items[0].item; int fuel = items.get(item); float fullness = (float)fuel / itemCapacity; diff --git a/core/src/mindustry/world/blocks/power/PowerDiode.java b/core/src/mindustry/world/blocks/power/PowerDiode.java index f4a5f21a89..e93dde18e9 100644 --- a/core/src/mindustry/world/blocks/power/PowerDiode.java +++ b/core/src/mindustry/world/blocks/power/PowerDiode.java @@ -21,6 +21,7 @@ public class PowerDiode extends Block{ solid = true; insulated = true; group = BlockGroup.power; + noUpdateDisabled = true; } @Override @@ -39,7 +40,7 @@ public class PowerDiode extends Block{ // battery % of the graph on either side, defaults to zero public float bar(Building tile){ - return (tile != null && tile.block().hasPower) ? tile.power.graph.getLastPowerStored() / tile.power.graph.getTotalBatteryCapacity() : 0f; + return (tile != null && tile.block.hasPower) ? tile.power.graph.getLastPowerStored() / tile.power.graph.getTotalBatteryCapacity() : 0f; } public class PowerDiodeBuild extends Building{ @@ -53,7 +54,7 @@ public class PowerDiode extends Block{ public void updateTile(){ super.updateTile(); - if(front() == null || back() == null || !back().block().hasPower || !front().block().hasPower || back().team() != front().team()) return; + if(front() == null || back() == null || !back().block.hasPower || !front().block.hasPower || back().team != front().team) return; PowerGraph backGraph = back().power.graph; PowerGraph frontGraph = front().power.graph; diff --git a/core/src/mindustry/world/blocks/power/PowerGraph.java b/core/src/mindustry/world/blocks/power/PowerGraph.java index dd197f313b..2d5a4d2918 100644 --- a/core/src/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/mindustry/world/blocks/power/PowerGraph.java @@ -20,6 +20,7 @@ public class PowerGraph{ private final WindowedMean powerBalance = new WindowedMean(60); private float lastPowerProduced, lastPowerNeeded, lastUsageFraction, lastPowerStored; + private float lastScaledPowerIn, lastScaledPowerOut, lastCapacity; private long lastFrameUpdated = -1; private final int graphID; @@ -33,6 +34,18 @@ public class PowerGraph{ return graphID; } + public float getLastScaledPowerIn(){ + return lastScaledPowerIn; + } + + public float getLastScaledPowerOut(){ + return lastScaledPowerOut; + } + + public float getLastCapacity(){ + return lastCapacity; + } + public float getPowerBalance(){ return powerBalance.mean(); } @@ -74,7 +87,7 @@ public class PowerGraph{ public float getPowerNeeded(){ float powerNeeded = 0f; for(Building consumer : consumers){ - Consumers consumes = consumer.block().consumes; + Consumers consumes = consumer.block.consumes; if(consumes.hasPower()){ ConsumePower consumePower = consumes.getPower(); if(otherConsumersAreValid(consumer, consumePower)){ @@ -88,7 +101,7 @@ public class PowerGraph{ public float getBatteryStored(){ float totalAccumulator = 0f; for(Building battery : batteries){ - Consumers consumes = battery.block().consumes; + Consumers consumes = battery.block.consumes; if(consumes.hasPower()){ totalAccumulator += battery.power.status * consumes.getPower().capacity; } @@ -99,8 +112,8 @@ public class PowerGraph{ public float getBatteryCapacity(){ float totalCapacity = 0f; for(Building battery : batteries){ - if(battery.block().consumes.hasPower()){ - ConsumePower power = battery.block().consumes.getPower(); + if(battery.block.consumes.hasPower()){ + ConsumePower power = battery.block.consumes.getPower(); totalCapacity += (1f - battery.power.status) * power.capacity; } } @@ -110,8 +123,8 @@ public class PowerGraph{ public float getTotalBatteryCapacity(){ float totalCapacity = 0f; for(Building battery : batteries){ - if(battery.block().consumes.hasPower()){ - totalCapacity += battery.block().consumes.getPower().capacity; + if(battery.block.consumes.hasPower()){ + totalCapacity += battery.block.consumes.getPower().capacity; } } return totalCapacity; @@ -124,7 +137,7 @@ public class PowerGraph{ float used = Math.min(stored, needed); float consumedPowerPercentage = Math.min(1.0f, needed / stored); for(Building battery : batteries){ - Consumers consumes = battery.block().consumes; + Consumers consumes = battery.block.consumes; if(consumes.hasPower()){ battery.power.status *= (1f-consumedPowerPercentage); } @@ -139,7 +152,7 @@ public class PowerGraph{ if(Mathf.equal(capacity, 0f)) return 0f; for(Building battery : batteries){ - Consumers consumes = battery.block().consumes; + Consumers consumes = battery.block.consumes; if(consumes.hasPower()){ ConsumePower consumePower = consumes.getPower(); if(consumePower.capacity > 0f){ @@ -154,7 +167,7 @@ public class PowerGraph{ //distribute even if not needed. this is because some might be requiring power but not using it; it updates consumers float coverage = Mathf.zero(needed) && Mathf.zero(produced) ? 0f : Mathf.zero(needed) ? 1f : Math.min(1, produced / needed); for(Building consumer : consumers){ - Consumers consumes = consumer.block().consumes; + Consumers consumes = consumer.block.consumes; if(consumes.hasPower()){ ConsumePower consumePower = consumes.getPower(); if(consumePower.buffered){ @@ -200,6 +213,11 @@ public class PowerGraph{ lastPowerNeeded = powerNeeded; lastPowerProduced = powerProduced; + + lastScaledPowerIn = powerProduced / Time.delta; + lastScaledPowerOut = powerNeeded / Time.delta; + lastCapacity = getTotalBatteryCapacity(); + lastPowerStored = getBatteryStored(); powerBalance.add((lastPowerProduced - lastPowerNeeded) / Time.delta); @@ -237,14 +255,14 @@ public class PowerGraph{ tile.power.graph = this; all.add(tile); - if(tile.block().outputsPower && tile.block().consumesPower && !tile.block().consumes.getPower().buffered){ + if(tile.block.outputsPower && tile.block.consumesPower && !tile.block.consumes.getPower().buffered){ producers.add(tile); consumers.add(tile); - }else if(tile.block().outputsPower && tile.block().consumesPower){ + }else if(tile.block.outputsPower && tile.block.consumesPower){ batteries.add(tile); - }else if(tile.block().outputsPower){ + }else if(tile.block.outputsPower){ producers.add(tile); - }else if(tile.block().consumesPower){ + }else if(tile.block.consumesPower){ consumers.add(tile); } } @@ -311,7 +329,7 @@ public class PowerGraph{ } private boolean otherConsumersAreValid(Building tile, Consume consumePower){ - for(Consume cons : tile.block().consumes.all()){ + for(Consume cons : tile.block.consumes.all()){ if(cons != consumePower && !cons.isOptional() && !cons.valid(tile)){ return false; } diff --git a/core/src/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java index aa59d0cab1..f4d6799b88 100644 --- a/core/src/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -33,6 +33,8 @@ public class PowerNode extends PowerBlock{ public @Load("laser-end") TextureRegion laserEnd; public float laserRange = 6; public int maxNodes = 3; + public Color laserColor1 = Color.white; + public Color laserColor2 = Pal.powerLight; public PowerNode(String name){ super(name); @@ -68,7 +70,7 @@ public class PowerNode extends PowerBlock{ power.links.add(other.pos()); } - if(other.team() == entity.team()){ + if(other.team == entity.team){ if(!other.power.links.contains(entity.pos())){ other.power.links.add(entity.pos()); @@ -109,9 +111,9 @@ public class PowerNode extends PowerBlock{ bars.add("batteries", entity -> new Bar(() -> Core.bundle.format("bar.powerstored", - (UI.formatAmount((int)entity.power.graph.getLastPowerStored())), UI.formatAmount((int)entity.power.graph.getTotalBatteryCapacity())), + (UI.formatAmount((int)entity.power.graph.getLastPowerStored())), UI.formatAmount((int)entity.power.graph.getLastCapacity())), () -> Pal.powerBar, - () -> Mathf.clamp(entity.power.graph.getLastPowerStored() / entity.power.graph.getTotalBatteryCapacity()))); + () -> Mathf.clamp(entity.power.graph.getLastPowerStored() / entity.power.graph.getLastCapacity()))); } @Override @@ -133,35 +135,29 @@ public class PowerNode extends PowerBlock{ Drawf.circles(x * tilesize + offset, y * tilesize + offset, laserRange * tilesize); getPotentialLinks(tile, other -> { - Drawf.square(other.x, other.y, other.block().size * tilesize / 2f + 2f, Pal.place); + Drawf.square(other.x, other.y, other.block.size * tilesize / 2f + 2f, Pal.place); insulators(tile.x, tile.y, other.tileX(), other.tileY(), cause -> { - Drawf.square(cause.x, cause.y, cause.block().size * tilesize / 2f + 2f, Pal.plastanium); + Drawf.square(cause.x, cause.y, cause.block.size * tilesize / 2f + 2f, Pal.plastanium); }); }); Draw.reset(); } - protected void drawLaser(Team team, float x1, float y1, float x2, float y2, float satisfaction, int size1, int size2){ - float opacity = Core.settings.getInt("lasersopacity") / 100f; - if(Mathf.zero(opacity)) return; - - float angle1 = Angles.angle(x1, y1, x2, y2); - t1.trns(angle1, size1 * tilesize / 2f - 1.5f); - t2.trns(angle1 + 180f, size2 * tilesize / 2f - 1.5f); - - x1 += t1.x; - y1 += t1.y; - x2 += t2.x; - y2 += t2.y; - + protected void setupColor(float satisfaction){ float fract = 1f - satisfaction; - Draw.color(Color.white, Pal.powerLight, fract * 0.86f + Mathf.absin(3f, 0.1f)); - Draw.alpha(opacity); - Drawf.laser(team, laser, laserEnd, x1, y1, x2, y2, 0.25f); - Draw.color(); + Draw.color(laserColor1, laserColor2, fract * 0.86f + Mathf.absin(3f, 0.1f)); + Draw.alpha(renderer.laserOpacity); + } + + protected void drawLaser(Team team, float x1, float y1, float x2, float y2, int size1, int size2){ + float angle1 = Angles.angle(x1, y1, x2, y2); + float vx = Mathf.cosDeg(angle1), vy = Mathf.sinDeg(angle1); + float len1 = size1 * tilesize / 2f - 1.5f, len2 = size2 * tilesize / 2f - 1.5f; + + Drawf.laser(team, laser, laserEnd, x1 + vx*len1, y1 + vy*len1, x2 - vx*len2, y2 - vy*len2, 0.25f); } protected boolean overlaps(float srcx, float srcy, Tile other, float range){ @@ -183,9 +179,9 @@ public class PowerNode extends PowerBlock{ protected void getPotentialLinks(Tile tile, Cons others){ Boolf valid = other -> other != null && other.tile() != tile && other.power != null && - ((!other.block().outputsPower && other.block().consumesPower) || (other.block().outputsPower && !other.block().consumesPower) || other.block() instanceof PowerNode) && - overlaps(tile.x * tilesize + offset, tile.y * tilesize + offset, other.tile(), laserRange * tilesize) && other.team() == player.team() - && !other.proximity().contains(e -> e.tile() == tile) && !graphs.contains(other.power.graph); + ((!other.block.outputsPower && other.block.consumesPower) || (other.block.outputsPower && !other.block.consumesPower) || other.block instanceof PowerNode) && + overlaps(tile.x * tilesize + offset, tile.y * tilesize + offset, other.tile(), laserRange * tilesize) && other.team == player.team() + && !other.proximity.contains(e -> e.tile == tile) && !graphs.contains(other.power.graph); tempTileEnts.clear(); graphs.clear(); @@ -201,7 +197,7 @@ public class PowerNode extends PowerBlock{ }); tempTileEnts.sort((a, b) -> { - int type = -Boolean.compare(a.block() instanceof PowerNode, b.block() instanceof PowerNode); + int type = -Boolean.compare(a.block instanceof PowerNode, b.block instanceof PowerNode); if(type != 0) return type; return Float.compare(a.dst2(tile), b.dst2(tile)); }); @@ -215,6 +211,7 @@ public class PowerNode extends PowerBlock{ @Override public void drawRequestConfigTop(BuildPlan req, Eachable list){ if(req.config instanceof Point2[]){ + setupColor(1f); for(Point2 point : (Point2[])req.config){ otherReq = null; list.each(other -> { @@ -225,8 +222,9 @@ public class PowerNode extends PowerBlock{ if(otherReq == null || otherReq.block == null) return; - drawLaser(player.team(), req.drawx(), req.drawy(), otherReq.drawx(), otherReq.drawy(), 1f, size, otherReq.block.size); + drawLaser(player.team(), req.drawx(), req.drawy(), otherReq.drawx(), otherReq.drawy(), size, otherReq.block.size); } + Draw.color(); } } @@ -235,11 +233,11 @@ public class PowerNode extends PowerBlock{ } public boolean linkValid(Building tile, Building link, boolean checkMaxNodes){ - if(tile == link || link == null || !link.block().hasPower || tile.team() != link.team()) return false; + if(tile == link || link == null || !link.block.hasPower || tile.team != link.team) return false; - if(overlaps(tile, link, laserRange * tilesize) || (link.block() instanceof PowerNode && overlaps(link, tile, ((PowerNode)link.block()).laserRange * tilesize))){ - if(checkMaxNodes && link.block() instanceof PowerNode){ - return link.power.links.size < ((PowerNode)link.block()).maxNodes || link.power.links.contains(tile.pos()); + if(overlaps(tile, link, laserRange * tilesize) || (link.block instanceof PowerNode && overlaps(link, tile, ((PowerNode)link.block).laserRange * tilesize))){ + if(checkMaxNodes && link.block instanceof PowerNode){ + return link.power.links.size < ((PowerNode)link.block).maxNodes || link.power.links.contains(tile.pos()); } return true; } @@ -264,7 +262,7 @@ public class PowerNode extends PowerBlock{ world.raycastEach(x, y, x2, y2, (wx, wy) -> { Building tile = world.build(wx, wy); - if(tile != null && tile.block().insulated){ + if(tile != null && tile.block.insulated){ iterator.get(tile); } @@ -278,8 +276,8 @@ public class PowerNode extends PowerBlock{ public void placed(){ if(net.client()) return; - Boolf valid = other -> other != null && other != this && ((!other.block().outputsPower && other.block().consumesPower) || - (other.block().outputsPower && !other.block().consumesPower) || other.block() instanceof PowerNode) && linkValid(this, other) + Boolf valid = other -> other != null && other != this && ((!other.block.outputsPower && other.block.consumesPower) || + (other.block.outputsPower && !other.block.consumesPower) || other.block instanceof PowerNode) && linkValid(this, other) && !other.proximity().contains(this) && other.power.graph != power.graph; tempTileEnts.clear(); @@ -293,7 +291,7 @@ public class PowerNode extends PowerBlock{ }); tempTileEnts.sort((a, b) -> { - int type = -Boolean.compare(a.block() instanceof PowerNode, b.block() instanceof PowerNode); + int type = -Boolean.compare(a.block instanceof PowerNode, b.block instanceof PowerNode); if(type != 0) return type; return Float.compare(a.dst2(tile), b.dst2(tile)); }); @@ -371,7 +369,7 @@ public class PowerNode extends PowerBlock{ boolean linked = linked(link); if(linked){ - Drawf.square(link.x, link.y, link.block().size * tilesize / 2f + 1f, Pal.place); + Drawf.square(link.x, link.y, link.block.size * tilesize / 2f + 1f, Pal.place); } } } @@ -384,18 +382,19 @@ public class PowerNode extends PowerBlock{ public void draw(){ super.draw(); - if(Core.settings.getInt("lasersopacity") == 0) return; + if(Mathf.zero(renderer.laserOpacity)) return; Draw.z(Layer.power); + setupColor(power.graph.getSatisfaction()); for(int i = 0; i < power.links.size; i++){ Building link = world.build(power.links.get(i)); if(!linkValid(this, link)) continue; - if(link.block() instanceof PowerNode && !(link.pos() < tile.pos())) continue; + if(link.block instanceof PowerNode && !(link.pos() < tile.pos())) continue; - drawLaserTo(link); + drawLaser(team, x, y, link.x, link.y, size, link.block.size); } Draw.reset(); @@ -405,10 +404,6 @@ public class PowerNode extends PowerBlock{ return power.links.contains(other.pos()); } - protected void drawLaserTo(Building target){ - drawLaser(team, x, y, target.x, target.y, power.graph.getSatisfaction(), size, target.block().size); - } - @Override public Point2[] config(){ Point2[] out = new Point2[power.links.size]; diff --git a/core/src/mindustry/world/blocks/power/SolarGenerator.java b/core/src/mindustry/world/blocks/power/SolarGenerator.java index 8965978f9c..d5f37329ae 100644 --- a/core/src/mindustry/world/blocks/power/SolarGenerator.java +++ b/core/src/mindustry/world/blocks/power/SolarGenerator.java @@ -24,12 +24,12 @@ public class SolarGenerator extends PowerGenerator{ public class SolarGeneratorBuild extends GeneratorBuild{ @Override public void updateTile(){ - productionEfficiency = + productionEfficiency = enabled ? Mathf.maxZero(Attribute.light.env() + - (state.rules.solarPowerMultiplier < 0 ? - (state.rules.lighting ? 1f - state.rules.ambientLight.a : 1f) : - state.rules.solarPowerMultiplier - )); + (state.rules.lighting ? + 1f - state.rules.ambientLight.a : + 1f + )) : 0f; } } } diff --git a/core/src/mindustry/world/blocks/production/AttributeSmelter.java b/core/src/mindustry/world/blocks/production/AttributeSmelter.java index 405f830d2d..987b14e63b 100644 --- a/core/src/mindustry/world/blocks/production/AttributeSmelter.java +++ b/core/src/mindustry/world/blocks/production/AttributeSmelter.java @@ -49,10 +49,10 @@ public class AttributeSmelter extends GenericSmelter{ } @Override - public void placed(){ - super.placed(); + public void onProximityUpdate(){ + super.onProximityUpdate(); attrsum = sumAttribute(attribute, tile.x, tile.y); } } -} \ No newline at end of file +} diff --git a/core/src/mindustry/world/blocks/production/PayloadAcceptor.java b/core/src/mindustry/world/blocks/production/PayloadAcceptor.java index e11d604c7a..e7456f0287 100644 --- a/core/src/mindustry/world/blocks/production/PayloadAcceptor.java +++ b/core/src/mindustry/world/blocks/production/PayloadAcceptor.java @@ -24,25 +24,26 @@ public class PayloadAcceptor extends Block{ super(name); update = true; + sync = true; } public static boolean blends(Building tile, int direction){ - int size = tile.block().size; + int size = tile.block.size; Building accept = tile.nearby(Geometry.d4(direction).x * size, Geometry.d4(direction).y * size); return accept != null && - accept.block().outputsPayload && + accept.block.outputsPayload && //if size is the same, block must either be facing this one, or not be rotating - ((accept.block().size == size && + ((accept.block.size == size && ((accept.tileX() + Geometry.d4(accept.rotation).x * size == tile.tileX() && accept.tileY() + Geometry.d4(accept.rotation).y * size == tile.tileY()) - || !accept.block().rotate || (accept.block().rotate && !accept.block().outputFacing))) || + || !accept.block.rotate || (accept.block.rotate && !accept.block.outputFacing))) || //if the other block is smaller, check alignment - (accept.block().size < size && + (accept.block.size < size && (accept.rotation % 2 == 0 ? //check orientation; make sure it's aligned properly with this block. - Math.abs(accept.y - tile.y) <= (size * tilesize - accept.block().size * tilesize)/2f : //check Y alignment - Math.abs(accept.x - tile.x) <= (size * tilesize - accept.block().size * tilesize)/2f //check X alignment - )) && (!accept.block().rotate || accept.front() == tile || !accept.block().outputFacing) //make sure it's facing this block + Math.abs(accept.y - tile.y) <= (size * tilesize - accept.block.size * tilesize)/2f : //check Y alignment + Math.abs(accept.x - tile.x) <= (size * tilesize - accept.block.size * tilesize)/2f //check X alignment + )) && (!accept.block.rotate || accept.front() == tile || !accept.block.outputFacing) //make sure it's facing this block ); } @@ -111,7 +112,7 @@ public class PayloadAcceptor extends Block{ payVector.clamp(-size * tilesize / 2f, -size * tilesize / 2f, size * tilesize / 2f, size * tilesize / 2f); Building front = front(); - if(front != null && front.block().outputsPayload){ + if(front != null && front.block.outputsPayload){ if(movePayload(payload)){ payload = null; } diff --git a/core/src/mindustry/world/blocks/sandbox/ItemSource.java b/core/src/mindustry/world/blocks/sandbox/ItemSource.java index 4a52e6b8ae..fb28247758 100644 --- a/core/src/mindustry/world/blocks/sandbox/ItemSource.java +++ b/core/src/mindustry/world/blocks/sandbox/ItemSource.java @@ -23,6 +23,7 @@ public class ItemSource extends Block{ group = BlockGroup.transportation; configurable = true; saveConfig = true; + noUpdateDisabled = true; config(Item.class, (ItemSourceBuild tile, Item item) -> tile.outputItem = item); configClear((ItemSourceBuild tile) -> tile.outputItem = null); @@ -51,11 +52,13 @@ public class ItemSource extends Block{ public void draw(){ super.draw(); - if(outputItem == null) return; - - Draw.color(outputItem.color); - Draw.rect("center", x, y); - Draw.color(); + if(outputItem == null){ + Draw.rect("cross", x, y); + }else{ + Draw.color(outputItem.color); + Draw.rect("center", x, y); + Draw.color(); + } } @Override diff --git a/core/src/mindustry/world/blocks/sandbox/ItemVoid.java b/core/src/mindustry/world/blocks/sandbox/ItemVoid.java index ca52e40591..6ba1c9c5a6 100644 --- a/core/src/mindustry/world/blocks/sandbox/ItemVoid.java +++ b/core/src/mindustry/world/blocks/sandbox/ItemVoid.java @@ -17,7 +17,7 @@ public class ItemVoid extends Block{ @Override public boolean acceptItem(Building source, Item item){ - return true; + return enabled; } } } diff --git a/core/src/mindustry/world/blocks/sandbox/LiquidSource.java b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java index 3f01313833..f2e57156f6 100644 --- a/core/src/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java @@ -24,6 +24,8 @@ public class LiquidSource extends Block{ configurable = true; outputsLiquid = true; saveConfig = true; + noUpdateDisabled = true; + displayFlow = false; config(Liquid.class, (LiquidSourceBuild tile, Liquid l) -> tile.source = l); configClear((LiquidSourceBuild tile) -> tile.source = null); @@ -58,7 +60,9 @@ public class LiquidSource extends Block{ public void draw(){ super.draw(); - if(source != null){ + if(source == null){ + Draw.rect("cross", x, y); + }else{ Draw.color(source.color); Draw.rect("center", x, y); Draw.color(); @@ -86,16 +90,21 @@ public class LiquidSource extends Block{ return source; } + @Override + public byte version(){ + return 1; + } + @Override public void write(Writes write){ super.write(write); - write.b(source == null ? -1 : source.id); + write.s(source == null ? -1 : source.id); } @Override public void read(Reads read, byte revision){ super.read(read, revision); - byte id = read.b(); + int id = revision == 1 ? read.s() : read.b(); source = id == -1 ? null : content.liquid(id); } } diff --git a/core/src/mindustry/world/blocks/sandbox/LiquidVoid.java b/core/src/mindustry/world/blocks/sandbox/LiquidVoid.java index 0b701b75cb..0f49ffd3a7 100644 --- a/core/src/mindustry/world/blocks/sandbox/LiquidVoid.java +++ b/core/src/mindustry/world/blocks/sandbox/LiquidVoid.java @@ -22,7 +22,7 @@ public class LiquidVoid extends Block{ public class LiquidVoidBuild extends Building{ @Override public boolean acceptLiquid(Building source, Liquid liquid, float amount){ - return true; + return enabled; } @Override diff --git a/core/src/mindustry/world/blocks/sandbox/PowerSource.java b/core/src/mindustry/world/blocks/sandbox/PowerSource.java index 32002747fb..fbc24f5ea7 100644 --- a/core/src/mindustry/world/blocks/sandbox/PowerSource.java +++ b/core/src/mindustry/world/blocks/sandbox/PowerSource.java @@ -14,7 +14,7 @@ public class PowerSource extends PowerNode{ public class PowerSourceBuild extends PowerNodeBuild{ @Override public float getPowerProduction(){ - return 10000f; + return enabled ? 10000f : 0f; } } diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index 2879f6e77b..44004ded7e 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -143,7 +143,7 @@ public class CoreBlock extends StorageBlock{ if(!canPlaceOn(world.tile(x, y), player.team())){ - drawPlaceText(Core.bundle.get((player.team().core() != null && player.team().core().items.has(requirements) && !state.rules.infiniteResources) ? + drawPlaceText(Core.bundle.get((player.team().core() != null && player.team().core().items.has(requirements)) || state.rules.infiniteResources ? "bar.corereq" : "bar.noresources" ), x, y, valid); @@ -180,6 +180,12 @@ public class CoreBlock extends StorageBlock{ } } + @Override + public boolean canPickup(){ + //cores can never be picked up + return false; + } + @Override public void drawLight(){ Drawf.light(team, x, y, 30f * size, Pal.accent, 0.5f + Mathf.absin(20f, 0.1f)); @@ -204,7 +210,7 @@ public class CoreBlock extends StorageBlock{ } state.teams.registerCore(this); - storageCapacity = itemCapacity + proximity().sum(e -> isContainer(e) && owns(e) ? e.block().itemCapacity : 0); + storageCapacity = itemCapacity + proximity().sum(e -> isContainer(e) && owns(e) ? e.block.itemCapacity : 0); proximity.each(e -> isContainer(e) && owns(e), t -> { t.items = items; ((StorageBuild)t).linkedCore = this; @@ -212,7 +218,7 @@ public class CoreBlock extends StorageBlock{ for(Building other : state.teams.cores(team)){ if(other.tile() == tile) continue; - storageCapacity += other.block().itemCapacity + other.proximity().sum(e -> isContainer(e) && owns(other, e) ? e.block().itemCapacity : 0); + storageCapacity += other.block.itemCapacity + other.proximity().sum(e -> isContainer(e) && owns(other, e) ? e.block.itemCapacity : 0); } if(!world.isGenerating()){ @@ -232,7 +238,7 @@ public class CoreBlock extends StorageBlock{ Cons outline = t -> { for(int i = 0; i < 4; i++){ Point2 p = Geometry.d8edge[i]; - float offset = -Math.max(t.block().size - 1, 0) / 2f * tilesize; + float offset = -Math.max(t.block.size - 1, 0) / 2f * tilesize; Draw.rect("block-select", t.x + offset * p.x, t.y + offset * p.y, i * 90); } }; diff --git a/core/src/mindustry/world/blocks/storage/Unloader.java b/core/src/mindustry/world/blocks/storage/Unloader.java index cb1c40b860..86ce15956e 100644 --- a/core/src/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/mindustry/world/blocks/storage/Unloader.java @@ -51,7 +51,7 @@ public class Unloader extends Block{ public void updateTile(){ if(timer(timerUnload, speed / timeScale())){ for(Building other : proximity){ - if(other.interactable(team) && other.block().unloadable && other.block().hasItems + if(other.interactable(team) && other.block.unloadable && other.block.hasItems && ((sortItem == null && other.items.total() > 0) || (sortItem != null && other.items.has(sortItem)))){ //make sure the item can't be dumped back into this block dumpingTo = other; @@ -99,7 +99,7 @@ public class Unloader extends Block{ @Override public boolean canDump(Building to, Item item){ - return !(to.block() instanceof StorageBlock) && to != dumpingTo; + return !(to.block instanceof StorageBlock) && to != dumpingTo; } @Override @@ -107,16 +107,21 @@ public class Unloader extends Block{ return sortItem; } + @Override + public byte version(){ + return 1; + } + @Override public void write(Writes write){ super.write(write); - write.b(sortItem == null ? -1 : sortItem.id); + write.s(sortItem == null ? -1 : sortItem.id); } @Override public void read(Reads read, byte revision){ super.read(read, revision); - byte id = read.b(); + int id = revision == 1 ? read.s() : read.b(); sortItem = id == -1 ? null : content.items().get(id); } } diff --git a/core/src/mindustry/world/blocks/units/CommandCenter.java b/core/src/mindustry/world/blocks/units/CommandCenter.java new file mode 100644 index 0000000000..071bcaf273 --- /dev/null +++ b/core/src/mindustry/world/blocks/units/CommandCenter.java @@ -0,0 +1,98 @@ +package mindustry.world.blocks.units; + +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.scene.style.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import arc.struct.*; +import arc.util.*; +import arc.util.io.*; +import mindustry.*; +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 Effect effect = Fx.commandSend; + + public CommandCenter(String name){ + super(name); + + flags = EnumSet.of(BlockFlag.rally); + destructible = true; + solid = true; + configurable = true; + + config(UnitCommand.class, (CommandBuild build, UnitCommand command) -> { + build.team.data().command = command; + effect.at(build); + }); + } + + @Override + public void load(){ + super.load(); + + if(Vars.ui != null){ + for(UnitCommand cmd : UnitCommand.all){ + commandRegions[cmd.ordinal()] = Vars.ui.getIcon("command" + Strings.capitalize(cmd.name()), "cancel"); + } + } + } + + public class CommandBuild extends Building{ + + @Override + public Object config(){ + return team.data().command; + } + + @Override + public void draw(){ + super.draw(); + + float size = 6f; + + Draw.color(bottomColor); + Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), tile.drawx(), tile.drawy() - 1, size, size); + Draw.color(topColor); + Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), tile.drawx(), tile.drawy(), size, size); + Draw.color(); + } + + @Override + public void buildConfiguration(Table table){ + ButtonGroup group = new ButtonGroup<>(); + Table buttons = new Table(); + + for(UnitCommand cmd : UnitCommand.all){ + buttons.button(commandRegions[cmd.ordinal()], Styles.clearToggleTransi, () -> { + if(team.data().command != cmd) configure(cmd); + }).size(44).group(group).update(b -> b.setChecked(team.data().command == cmd)); + } + table.add(buttons); + table.row(); + table.label(() -> team.data().command.localized()).style(Styles.outlineLabel).center().growX().get().setAlignment(Align.center); + } + + @Override + public void write(Writes write){ + super.write(write); + write.b(team.data().command.ordinal()); + } + + @Override + public void read(Reads read, byte version){ + super.read(read, version); + team.data().command = UnitCommand.all[read.b()]; + } + } +} \ No newline at end of file diff --git a/core/src/mindustry/world/blocks/units/RepairPoint.java b/core/src/mindustry/world/blocks/units/RepairPoint.java index d0670783c8..609452cc2b 100644 --- a/core/src/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/mindustry/world/blocks/units/RepairPoint.java @@ -73,7 +73,7 @@ public class RepairPoint extends Block{ Draw.rect(region, x, y, rotation - 90); if(target != null && Angles.angleDist(angleTo(target), rotation) < 30f){ - Draw.z(Layer.power); + Draw.z(Layer.flyingUnit + 1); //above all units float ang = angleTo(target); float len = 5f; diff --git a/core/src/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index 4cddee5135..67f7b50a88 100644 --- a/core/src/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -223,7 +223,7 @@ public class UnitFactory extends UnitBlock{ if(currentPlan != -1 && !Units.canCreate(team, plans[currentPlan].unit)){ return false; } - return enabled; + return enabled && payload == null; } @Override diff --git a/core/src/mindustry/world/consumers/ConsumeItemDynamic.java b/core/src/mindustry/world/consumers/ConsumeItemDynamic.java index 277146f156..5f3a13609a 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemDynamic.java +++ b/core/src/mindustry/world/consumers/ConsumeItemDynamic.java @@ -1,7 +1,6 @@ package mindustry.world.consumers; import arc.func.*; -import arc.math.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.ArcAnnotate.*; @@ -48,7 +47,7 @@ public class ConsumeItemDynamic extends Consume{ for(ItemStack stack : items.get(tile)){ table.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount), - () -> tile.items != null && tile.items.has(stack.item, stack.amount))).size(8 * 4).padRight(6 * Mathf.digits(stack.amount)); + () -> tile.items != null && tile.items.has(stack.item, stack.amount))).padRight(8); } } diff --git a/core/src/mindustry/world/consumers/ConsumeItems.java b/core/src/mindustry/world/consumers/ConsumeItems.java index 53eb92ebae..0fd0cdf26c 100644 --- a/core/src/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/mindustry/world/consumers/ConsumeItems.java @@ -1,8 +1,7 @@ package mindustry.world.consumers; -import arc.math.*; -import arc.struct.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.ArcAnnotate.*; import mindustry.gen.*; import mindustry.type.*; @@ -38,7 +37,7 @@ public class ConsumeItems extends Consume{ public void build(Building tile, Table table){ for(ItemStack stack : items){ table.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount), - () -> tile.items != null && tile.items.has(stack.item, stack.amount))).size(8 * 4).padRight(Mathf.digits(stack.amount) * 6); + () -> tile.items != null && tile.items.has(stack.item, stack.amount))).padRight(8); } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidBase.java b/core/src/mindustry/world/consumers/ConsumeLiquidBase.java index 323a2897ac..f2cae7676e 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.delta(), entity.block.liquidCapacity); } } diff --git a/core/src/mindustry/world/consumers/Consumers.java b/core/src/mindustry/world/consumers/Consumers.java index 99fff57632..8683c6d158 100644 --- a/core/src/mindustry/world/consumers/Consumers.java +++ b/core/src/mindustry/world/consumers/Consumers.java @@ -34,6 +34,10 @@ public class Consumers{ return get(ConsumeType.power); } + public ConsumeItems getItem(){ + return get(ConsumeType.item); + } + public boolean hasPower(){ return has(ConsumeType.power); } diff --git a/core/src/mindustry/world/meta/BlockFlag.java b/core/src/mindustry/world/meta/BlockFlag.java index 2308448e45..ddf9fa9ba7 100644 --- a/core/src/mindustry/world/meta/BlockFlag.java +++ b/core/src/mindustry/world/meta/BlockFlag.java @@ -10,7 +10,7 @@ public enum BlockFlag{ turret, /** Repair point. */ repair, - /** Rally point. TODO remove*/ + /** Rally point. */ rally, /** Any block that boosts unit capacity. */ unitModifier; diff --git a/core/src/mindustry/world/meta/BlockStat.java b/core/src/mindustry/world/meta/BlockStat.java index 2a432208a8..54aed12de2 100644 --- a/core/src/mindustry/world/meta/BlockStat.java +++ b/core/src/mindustry/world/meta/BlockStat.java @@ -8,6 +8,7 @@ import java.util.Locale; public enum BlockStat{ health(StatCategory.general), size(StatCategory.general), + displaySize(StatCategory.general), buildTime(StatCategory.general), buildCost(StatCategory.general), @@ -32,6 +33,8 @@ public enum BlockStat{ drillTier(StatCategory.crafting), drillSpeed(StatCategory.crafting), maxUnits(StatCategory.crafting), + linkRange(StatCategory.crafting), + instructions(StatCategory.crafting), speedIncrease(StatCategory.shooting), repairTime(StatCategory.shooting), diff --git a/core/src/mindustry/world/meta/StatUnit.java b/core/src/mindustry/world/meta/StatUnit.java index 5136280e8a..721ac7c582 100644 --- a/core/src/mindustry/world/meta/StatUnit.java +++ b/core/src/mindustry/world/meta/StatUnit.java @@ -16,7 +16,9 @@ public enum StatUnit{ powerUnits, degrees, seconds, + minutes, perSecond, + perMinute, timesSpeed(false), percent(false), none, diff --git a/core/src/mindustry/world/modules/BlockModule.java b/core/src/mindustry/world/modules/BlockModule.java index 974f43656f..fc61966a46 100644 --- a/core/src/mindustry/world/modules/BlockModule.java +++ b/core/src/mindustry/world/modules/BlockModule.java @@ -5,5 +5,12 @@ import arc.util.io.*; /** A class that represents compartmentalized tile entity state. */ public abstract class BlockModule{ public abstract void write(Writes write); - public abstract void read(Reads read); + + public void read(Reads read, boolean legacy){ + read(read); + } + + public void read(Reads read){ + read(read, false); + } } diff --git a/core/src/mindustry/world/modules/ConsumeModule.java b/core/src/mindustry/world/modules/ConsumeModule.java index 027e5595a9..431fa3fd1f 100644 --- a/core/src/mindustry/world/modules/ConsumeModule.java +++ b/core/src/mindustry/world/modules/ConsumeModule.java @@ -37,7 +37,7 @@ public class ConsumeModule extends BlockModule{ optionalValid = true; boolean docons = entity.shouldConsume() && entity.productionValid(); - for(Consume cons : entity.block().consumes.all()){ + for(Consume cons : entity.block.consumes.all()){ if(cons.isOptional()) continue; if(docons && cons.isUpdate() && prevValid && cons.valid(entity)){ @@ -47,7 +47,7 @@ public class ConsumeModule extends BlockModule{ valid &= cons.valid(entity); } - for(Consume cons : entity.block().consumes.optionals()){ + for(Consume cons : entity.block.consumes.optionals()){ if(docons && cons.isUpdate() && prevValid && cons.valid(entity)){ cons.update(entity); } @@ -57,7 +57,7 @@ public class ConsumeModule extends BlockModule{ } public void trigger(){ - for(Consume cons : entity.block().consumes.all()){ + for(Consume cons : entity.block.consumes.all()){ cons.trigger(entity); } } diff --git a/core/src/mindustry/world/modules/ItemModule.java b/core/src/mindustry/world/modules/ItemModule.java index b0bd7e1cde..52fdd63dfd 100644 --- a/core/src/mindustry/world/modules/ItemModule.java +++ b/core/src/mindustry/world/modules/ItemModule.java @@ -276,30 +276,30 @@ public class ItemModule extends BlockModule{ @Override public void write(Writes write){ - byte amount = 0; + int amount = 0; for(int item : items){ if(item > 0) amount++; } - write.b(amount); //amount of items + write.s(amount); //amount of items for(int i = 0; i < items.length; i++){ if(items[i] > 0){ - write.b(i); //item ID + write.s(i); //item ID write.i(items[i]); //item amount } } } @Override - public void read(Reads read){ + public void read(Reads read, boolean legacy){ //just in case, reset items Arrays.fill(items, 0); - byte count = read.b(); + int count = legacy ? read.ub() : read.s(); total = 0; for(int j = 0; j < count; j++){ - int itemid = read.b(); + int itemid = legacy ? read.ub() : read.s(); int itemamount = read.i(); items[content.item(itemid).id] = itemamount; total += itemamount; diff --git a/core/src/mindustry/world/modules/LiquidModule.java b/core/src/mindustry/world/modules/LiquidModule.java index 2d8a34d165..95dfc2f621 100644 --- a/core/src/mindustry/world/modules/LiquidModule.java +++ b/core/src/mindustry/world/modules/LiquidModule.java @@ -20,6 +20,7 @@ public class LiquidModule extends BlockModule{ private Liquid current = content.liquid(0); private float smoothLiquid; + private boolean hadFlow; private @Nullable WindowedMean flow; private float lastAdded, currentFlowRate; @@ -29,6 +30,8 @@ public class LiquidModule extends BlockModule{ if(flowTimer.get(1, pollScl)){ if(flow == null) flow = new WindowedMean(windowSize); + if(lastAdded > 0.0001f) hadFlow = true; + flow.add(lastAdded); lastAdded = 0; if(currentFlowRate < 0 || flowTimer.get(updateInterval)){ @@ -38,6 +41,7 @@ public class LiquidModule extends BlockModule{ }else{ currentFlowRate = -1f; flow = null; + hadFlow = false; } } @@ -46,6 +50,10 @@ public class LiquidModule extends BlockModule{ return currentFlowRate * 60; } + public boolean hadFlow(){ + return hadFlow; + } + public float smoothAmount(){ return smoothLiquid; } @@ -114,29 +122,29 @@ public class LiquidModule extends BlockModule{ @Override public void write(Writes write){ - byte amount = 0; + int amount = 0; for(float liquid : liquids){ if(liquid > 0) amount++; } - write.b(amount); //amount of liquids + write.s(amount); //amount of liquids for(int i = 0; i < liquids.length; i++){ if(liquids[i] > 0){ - write.b(i); //liquid ID - write.f(liquids[i]); //item amount + write.s(i); //liquid ID + write.f(liquids[i]); //liquid amount } } } @Override - public void read(Reads read){ + public void read(Reads read, boolean legacy){ Arrays.fill(liquids, 0); total = 0f; - byte count = read.b(); + int count = legacy ? read.ub() : read.s(); for(int j = 0; j < count; j++){ - int liquidid = read.b(); + int liquidid = legacy ? read.ub() : read.s(); float amount = read.f(); liquids[liquidid] = amount; if(amount > 0){ diff --git a/desktop/build.gradle b/desktop/build.gradle index 3955380145..c29ee65eff 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -11,7 +11,7 @@ project.ext.assetsDir = new File("../core/assets") def enableTemplates = true def JDK_DIR = "$System.env.JDK_DIR" -def ICON_DIR = new File("core/assets/icons/icon.icns") +def ICON_DIR = new File("$rootDir/core/assets/icons/icon.icns") def spriteHashFile = new File(project.rootDir, "build/spritehash") def hashDirectory = { @@ -127,13 +127,13 @@ PackrConfig.Platform.values().each{ platform -> verbose = true bundleIdentifier = getPackage() + ".mac" iconResource = ICON_DIR - outDir = file("build/packr/output") + outDir = file("$rootDir/desktop/build/packr/output") mainClass = project.ext.mainClassName - classpath = ["desktop/build/packr/desktop.jar"] - removePlatformLibs = ["desktop/build/packr/desktop.jar"] + classpath = ["$rootDir/desktop/build/packr/desktop.jar".toString()] + removePlatformLibs = ["$rootDir/desktop/build/packr/desktop.jar".toString()] vmArgs = [] - minimizeJre = "desktop/packr_minimize.json" + minimizeJre = "$rootDir/desktop/packr_minimize.json".toString() jdk = JDK_DIR + "jdk-${platform.toString().toLowerCase()}.zip" if(platform == PackrConfig.Platform.MacOS){ diff --git a/desktop/src/mindustry/desktop/DesktopLauncher.java b/desktop/src/mindustry/desktop/DesktopLauncher.java index a2f6db7d56..bd9ec3e81b 100644 --- a/desktop/src/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/mindustry/desktop/DesktopLauncher.java @@ -170,11 +170,11 @@ public class DesktopLauncher extends ClientLauncher{ String finalMessage = Strings.getFinalMesage(e); String total = Strings.getCauses(e).toString(); - if(total.contains("Couldn't create window") || total.contains("OpenGL 2.0 or higher") || total.toLowerCase().contains("pixel format") || total.contains("GLEW")){ + if(total.contains("Couldn't create window") || total.contains("OpenGL 2.0 or higher") || total.toLowerCase().contains("pixel format") || total.contains("GLEW")|| total.contains("unsupported combination of formats")){ dialog.get(() -> message( total.contains("Couldn't create window") ? "A graphics initialization error has occured! Try to update your graphics drivers:\n" + finalMessage : - "Your graphics card does not support OpenGL 2.0 with the framebuffer_object extension!\n" + + "Your graphics card does not support the right OpenGL features.\n" + "Try to update your graphics drivers. If this doesn't work, your computer may not support Mindustry.\n\n" + "Full message: " + finalMessage)); badGPU = true; diff --git a/desktop/src/mindustry/desktop/steam/SStats.java b/desktop/src/mindustry/desktop/steam/SStats.java index 2ee13bea4e..ce24a22635 100644 --- a/desktop/src/mindustry/desktop/steam/SStats.java +++ b/desktop/src/mindustry/desktop/steam/SStats.java @@ -65,7 +65,7 @@ public class SStats implements SteamUserStatsCallback{ } for(Building entity : player.team().cores()){ - if(!content.items().contains(i -> entity.items.get(i) < entity.block().itemCapacity)){ + if(!content.items().contains(i -> entity.items.get(i) < entity.block.itemCapacity)){ fillCoreAllCampaign.complete(); break; } @@ -109,7 +109,7 @@ public class SStats implements SteamUserStatsCallback{ if(campaign() && e.unit != null && e.unit.isLocal() && !e.breaking){ SStat.blocksBuilt.add(); - if(e.tile.block() == Blocks.router && e.tile.build.proximity().contains(t -> t.block() == Blocks.router)){ + if(e.tile.block() == Blocks.router && e.tile.build.proximity().contains(t -> t.block == Blocks.router)){ chainRouters.complete(); } diff --git a/fastlane/metadata/android/en-US/changelogs/29659.txt b/fastlane/metadata/android/en-US/changelogs/29659.txt new file mode 100644 index 0000000000..77646b10bd --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29659.txt @@ -0,0 +1,10 @@ +This is the first alpha release of 6.0, a massive campaign and content update. +While this build has been tested in multiplayer, it still may have numerous issues. As usual, report problems on Github. + +There are too many changes to list here, but the important bits include: + +- A new unit production system, with incremental upgrades +- Direct unit and turret control +- Renamed and re-sprited units +- New blocks and units +- Naval and insect-like units diff --git a/fastlane/metadata/android/hi-IN/full_description.txt b/fastlane/metadata/android/hi-IN/full_description.txt new file mode 100644 index 0000000000..5f41ca22c8 --- /dev/null +++ b/fastlane/metadata/android/hi-IN/full_description.txt @@ -0,0 +1,15 @@ +बारूद को अपने बुर्ज में खिलाने के लिए कन्वेयर बेल्ट की विस्तृत आपूर्ति श्रृंखला बनाएं, निर्माण के लिए उपयोग करने के लिए सामग्री का उत्पादन करें, और दुश्मनों की लहरों से अपनी संरचनाओं का बचाव करें। क्रॉस-प्लेटफ़ॉर्म मल्टीप्लेयर सह-ऑप गेम्स में अपने दोस्तों के साथ खेलें, या टीम-आधारित PvP मैचों में उन्हें चुनौती दें। + +इसमें शामिल है: + +- 24 निर्मित नक्शे +- एक अभियान, एक टेक ट्री और अनलॉक करने योग्य क्षेत्रों के साथ पूरा +- 4 शक्तिशाली लहर मालिकों को हराने के लिए +- ऊर्जा, तरल और आइटम परिवहन प्रणाली +- 19 विभिन्न प्रकार के ड्रोन, मेच और जहाज +- मास्टर करने के लिए 120+ प्रौद्योगिकी ब्लॉक +- 75+ विभिन्न पर्यावरण ब्लॉक +- स्थानीय नेटवर्क या समर्पित सर्वरस के माध्यम से क्रॉस-प्लेटफॉर्म मल्टीप्लेयर +- कस्टम खेल के नियम: ब्लॉक की लागत, दुश्मन के आँकड़े, शुरू आइटम, लहर समय और अधिक बदलें +- एक शक्तिशाली संपादक, यादृच्छिक रूप से अयस्कों, इलाकों, सजावट को बनाने और मानचित्रों के लिए समरूपता को लागू करने के लिए उपकरण के साथ +- अनुकूलन योग्य मानचित्र तरंग लेआउट \ No newline at end of file diff --git a/fastlane/metadata/android/hi-IN/short_description.txt b/fastlane/metadata/android/hi-IN/short_description.txt new file mode 100644 index 0000000000..5a7eaf7783 --- /dev/null +++ b/fastlane/metadata/android/hi-IN/short_description.txt @@ -0,0 +1 @@ +एक कारखाने आधारित सैंडबॉक्स टॉवर रक्षा खेल। \ No newline at end of file diff --git a/fastlane/metadata/android/hi-IN/summary.txt b/fastlane/metadata/android/hi-IN/summary.txt new file mode 100644 index 0000000000..5a7eaf7783 --- /dev/null +++ b/fastlane/metadata/android/hi-IN/summary.txt @@ -0,0 +1 @@ +एक कारखाने आधारित सैंडबॉक्स टॉवर रक्षा खेल। \ No newline at end of file diff --git a/fastlane/metadata/android/hi-IN/title.txt b/fastlane/metadata/android/hi-IN/title.txt new file mode 100644 index 0000000000..36df84b3d7 --- /dev/null +++ b/fastlane/metadata/android/hi-IN/title.txt @@ -0,0 +1 @@ +मिन्दुस्त्र्यि (Mindustry) \ No newline at end of file diff --git a/fastlane/metadata/steam/korean/achievements.vdf b/fastlane/metadata/steam/korean/achievements.vdf index 4d274ee96b..14aba2fd5e 100644 --- a/fastlane/metadata/steam/korean/achievements.vdf +++ b/fastlane/metadata/steam/korean/achievements.vdf @@ -14,11 +14,11 @@ "NEW_ACHIEVEMENT_20_5_NAME" "무한의 배달부" "NEW_ACHIEVEMENT_20_5_DESC" "자원을 총 1,000,000개 출격시키세요." "NEW_ACHIEVEMENT_20_6_NAME" "정복자" - "NEW_ACHIEVEMENT_20_6_DESC" "캠페인의 미션:적 코어 파괴인 지역에서 10번 승리하세요." + "NEW_ACHIEVEMENT_20_6_DESC" "적 코어 파괴인 지역에서 10번 승리하세요." "NEW_ACHIEVEMENT_20_7_NAME" "챔피언" "NEW_ACHIEVEMENT_20_7_DESC" "멀티플레이어 PvP 매치에서 10번 승리하세요." "NEW_ACHIEVEMENT_20_8_NAME" "진격!" - "NEW_ACHIEVEMENT_20_8_DESC" "캠페인의 미션:적 코어 파괴인 지역에서 5단계 이상일 때 적의 코어를 파괴하세요." + "NEW_ACHIEVEMENT_20_8_DESC" "적 코어 파괴인 지역에서 5단계 이하일 때 적의 코어를 파괴하세요." "NEW_ACHIEVEMENT_20_9_NAME" "하늘에서 코어의 비가 쏟아진다!" "NEW_ACHIEVEMENT_20_9_DESC" "캠페인 지역에 30번 도전하세요." "NEW_ACHIEVEMENT_20_10_NAME" "끈질긴" @@ -36,9 +36,9 @@ "NEW_ACHIEVEMENT_20_17_NAME" "한 중대한 실수" "NEW_ACHIEVEMENT_20_17_DESC" "분배기를 연구하세요." "NEW_ACHIEVEMENT_20_18_NAME" "창조" - "NEW_ACHIEVEMENT_20_18_DESC" "블럭 10,000를 설치하세요." + "NEW_ACHIEVEMENT_20_18_DESC" "블록 10,000를 설치하세요." "NEW_ACHIEVEMENT_20_19_NAME" "잿더미" - "NEW_ACHIEVEMENT_20_19_DESC" "적 블럭을 1,000개 파괴하세요." + "NEW_ACHIEVEMENT_20_19_DESC" "적 블록을 1,000개 파괴하세요." "NEW_ACHIEVEMENT_20_20_NAME" "폭발은 예술이다!" "NEW_ACHIEVEMENT_20_20_DESC" "토륨 원자로를 폭발시키세요." "NEW_ACHIEVEMENT_20_21_NAME" "맵퍼" @@ -88,11 +88,11 @@ "NEW_ACHIEVEMENT_21_14_NAME" "출격!" "NEW_ACHIEVEMENT_21_14_DESC" "발사대를 사용하세요." "NEW_ACHIEVEMENT_21_15_NAME" "성급한" - "NEW_ACHIEVEMENT_21_15_DESC" "2단계 이상을 스킵하고, 당신의 코어를 적에게 파괴당하세요." + "NEW_ACHIEVEMENT_21_15_DESC" "2번 이상의 출격 기회를 스킵하고, 당신의 코어를 적에게 파괴당하세요." "NEW_ACHIEVEMENT_21_16_NAME" "2단" "NEW_ACHIEVEMENT_21_16_DESC" "분배기를 2개 붙여서 건설하세요." "NEW_ACHIEVEMENT_21_17_NAME" "고독한 수호자" - "NEW_ACHIEVEMENT_21_17_DESC" "캠페인 지역에서 10단계 이상을 아무 블럭도 설치하지 않고 생존하세요." + "NEW_ACHIEVEMENT_21_17_DESC" "캠페인 지역에서 10단계 이상을 아무 블록도 설치하지 않고 생존하세요." "NEW_ACHIEVEMENT_21_18_NAME" "인화성" "NEW_ACHIEVEMENT_21_18_DESC" "포탑에 파이라타이트를 사용하세요." "NEW_ACHIEVEMENT_21_19_NAME" "효율성" diff --git a/fastlane/metadata/steam/korean/description.txt b/fastlane/metadata/steam/korean/description.txt index 129c98613b..f08e59b4e7 100644 --- a/fastlane/metadata/steam/korean/description.txt +++ b/fastlane/metadata/steam/korean/description.txt @@ -17,11 +17,11 @@ [list] [*] 재도전 가능한 12개의 지역을 무작위 시작 위치에서 도전해보세요. [*] 자원들을 출격시켜서 모으세요. -[*] 고급 연료의 사용을 위해 새로운 블럭을 연구하세요. +[*] 고급 연료의 사용을 위해 새로운 블록을 연구하세요. [*] 캠페인 지역에서 일정 조건을 달성시 각 지역의 시작자원을 편집할 수 있습니다. [*] 다양한 지역 임무가 준비되어 있습니다. [*] 친구를 초대해 지역을 같이 클리어할 수 있습니다. -[*] 120개가 넘는 블럭들을 연구해보세요. +[*] 120개가 넘는 블록들을 연구해보세요. [*] 19가지 종류의 드론, 유닛, 기체들이 준비되어 있습니다. [*] 50개가 넘는 도전과제들을 달성해보세요. [/list] @@ -31,7 +31,7 @@ [*] [b]생존[/b]: 포탑을 건설하고, 적의 공격을 방어하는 기본적인 타워디펜스 모드입니다. 더욱 길게 생존하여 연구하기 위한 자원을 모으고 출격하는 것도 가능합니다. 공중 보스의 기습 공격에 대비하세요. [*] [b]공격[/b]: 공장을 건설하여 적의 코어를 파괴하기 위한 유닛들을 생산하고, 동시에 적의 유닛을 방어하기 위한 방어건물도 건설하세요. 당신의 목표를 돕기 위한 다양한 유닛들을 생산하세요. [*] [b]PvP[/b]: 당신을 빼고 총 4개의 팀과의 경쟁이 가능합니다. 다른 팀의 코어를 부숴 승리를 거머쥐세요. 유닛을 생성하고, 당신의 기체를 활용해 적의 기지를 공격하세요. -[*] [b]샌드박스[/b]: 무한한 자원을 사용하여 자유롭게 건설이 가능합니다. 무한 자원, 전기, 액체와 같은 샌드박스 모드 전용의 블럭들이 준비되어 있으며, 적들은 당신이 요구하기 전까지 출현하지 않습니다. 궁금한 것들을 마음껏 실험해보세요. +[*] [b]샌드박스[/b]: 무한한 자원을 사용하여 자유롭게 건설이 가능합니다. 무한 자원, 전기, 액체와 같은 샌드박스 모드 전용의 블록들이 준비되어 있으며, 적들은 당신이 요구하기 전까지 출현하지 않습니다. 궁금한 것들을 마음껏 실험해보세요. [/list] [h2]사용자 정의 게임 & 크로스플랫폼 멀티플레이어[/h2] @@ -40,7 +40,7 @@ [*] 캠페인에 더하여 12개의 추가적인 맵들이 준비되어 있습니다. [*] 생존, PvP, 샌드박스 등을 플레이해보세요! [*] 유저들이 운영하는 공개되어있는 공용서버에 접속하거나, 당신만의 비공개서버를 만들고 친구들을 초대해보세요. -[*] 자유로운 게임 규칙: 블럭의 재료 요구량 변경, 적의 능력 수치변경, 시작자원 변경, 단계 대기시간 변경 등 많은 것을 직접 설정할 수 있습니다. +[*] 자유로운 게임 규칙: 블록의 재료 요구량 변경, 적의 능력 수치변경, 시작자원 변경, 단계 대기시간 변경 등 많은 것을 직접 설정할 수 있습니다. [*] 게임모드 혼합!: PvP와 PvE를 합쳐 새로운 컨텐츠를 만들어보세요. [/list] @@ -56,5 +56,5 @@ [*] 소환되는 적들도 에디터 내의 맵 규칙에서 편집이 가능합니다! [*] 맵을 제작한 뒤에는 맵을 추출하여 파일로 공유하거나 워크샵에도 올릴 수 있습니다. [*] 맵의 규칙을 내 마음대로 바꿔보세요. -[*] 75개가 넘는 지형 타일, 블럭이 준비되어있습니다. +[*] 75개가 넘는 지형 타일, 블록이 준비되어있습니다. [/list] diff --git a/fastlane/metadata/steam/russian/achievements.vdf b/fastlane/metadata/steam/russian/achievements.vdf index 1289b5db58..628e39b9a5 100644 --- a/fastlane/metadata/steam/russian/achievements.vdf +++ b/fastlane/metadata/steam/russian/achievements.vdf @@ -68,7 +68,7 @@ "NEW_ACHIEVEMENT_21_4_NAME" "Стая" "NEW_ACHIEVEMENT_21_4_DESC" "Имейте одновременно 10 активных дронов «Фантом»." "NEW_ACHIEVEMENT_21_5_NAME" "Взрывная армия" - "NEW_ACHIEVEMENT_21_5_DESC" "Имейте одновременно 50 активных гусеничных ботов «Камикадзе»." + "NEW_ACHIEVEMENT_21_5_DESC" "Имейте одновременно 50 активных ботов «Ползун»." "NEW_ACHIEVEMENT_21_6_NAME" "Легионы" "NEW_ACHIEVEMENT_21_6_DESC" "Постройте в целом 1000 единиц." "NEW_ACHIEVEMENT_21_7_NAME" "Super" diff --git a/gradle.properties b/gradle.properties index 30169cb6ce..f4752f1ab3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=0fafa5b7159c2a6c11f03ebd378a47736101b46e +archash=51747eb9d90decdb53b6f4fd5d7043b9f9a219a7 diff --git a/server/src/mindustry/server/ServerControl.java b/server/src/mindustry/server/ServerControl.java index 463ef9ad20..b123d7e694 100644 --- a/server/src/mindustry/server/ServerControl.java +++ b/server/src/mindustry/server/ServerControl.java @@ -48,7 +48,7 @@ public class ServerControl implements ApplicationListener{ private Fi currentLogFile; private boolean inExtraRound; private Task lastTask; - private Gamemode lastMode = Gamemode.survival; + private Gamemode lastMode; private @Nullable Map nextMapOverride; private Interval autosaveCount = new Interval(); @@ -64,6 +64,15 @@ public class ServerControl implements ApplicationListener{ "globalrules", "{reactorExplosions: false}" ); + //update log level + Config.debug.set(Config.debug.bool()); + + try{ + lastMode = Gamemode.valueOf(Core.settings.getString("lastServerMode", "survival")); + }catch(Exception e){ //handle enum parse exception + lastMode = Gamemode.survival; + } + Log.setLogger((level, text) -> { String result = "[" + dateTime.format(LocalDateTime.now()) + "] " + format(tags[level.ordinal()] + " " + text + "&fr"); System.out.println(result); @@ -159,6 +168,9 @@ public class ServerControl implements ApplicationListener{ + (map.tags.containsKey("author") && !map.tags.get("author").trim().isEmpty() ? " by[accent] " + map.author() + "[white]" : "") + "." + "\nNew game begins in " + roundExtraTime + " seconds."); + state.gameOver = true; + Call.updateGameOver(event.winner); + info("Selected next map to be @.", map.name()); play(true, () -> world.loadMap(map, map.applyRules(lastMode))); @@ -298,6 +310,7 @@ public class ServerControl implements ApplicationListener{ logic.reset(); lastMode = preset; + Core.settings.put("lastServerMode", lastMode.name()); try{ world.loadMap(result, result.applyRules(lastMode)); state.rules = result.applyRules(preset); @@ -478,7 +491,7 @@ public class ServerControl implements ApplicationListener{ } for(Item item : content.items()){ - state.teams.cores(team).first().items.set(item, state.teams.cores(team).first().block().itemCapacity); + state.teams.cores(team).first().items.set(item, state.teams.cores(team).first().block.itemCapacity); } info("Core filled."); @@ -736,7 +749,7 @@ public class ServerControl implements ApplicationListener{ boolean add = arg[0].equals("add"); PlayerInfo target; - Player playert = Groups.player.find(p -> p.name().equalsIgnoreCase(arg[1])); + Player playert = Groups.player.find(p -> p.name.equalsIgnoreCase(arg[1])); if(playert != null){ target = playert.getInfo(); }else{ @@ -750,7 +763,7 @@ public class ServerControl implements ApplicationListener{ }else{ netServer.admins.unAdminPlayer(target.id); } - if(playert != null) playert.admin(add); + if(playert != null) playert.admin = add; info("Changed admin status of player: &ly@", target.lastName); }else{ err("Nobody with that name or ID could be found. If adding an admin by name, make sure they're online; otherwise, use their UUID."); @@ -954,7 +967,9 @@ public class ServerControl implements ApplicationListener{ for(Player p : players){ if(p.con == null) continue; + boolean wasAdmin = p.admin; p.reset(); + p.admin = wasAdmin; if(state.rules.pvp){ p.team(netServer.assignTeam(p, new SeqIterable<>(players))); } diff --git a/servers.json b/servers.json index 1c6b468d28..07226a273f 100644 --- a/servers.json +++ b/servers.json @@ -1,7 +1,4 @@ [ - { - "address": "mindustry.us.to" - }, { "address": "mindustry.indielm.com:1101" }, @@ -44,6 +41,9 @@ { "address": "aamindustry.play.ai" }, + { + "address": "aamindustry.play.ai:6568" + }, { "address": "mindustry.atannergaming.com" }, diff --git a/servers_be.json b/servers_be.json index 88a7504a78..047dfba7e0 100644 --- a/servers_be.json +++ b/servers_be.json @@ -1,11 +1,17 @@ [ { - "address": "mindustry.us.to:6568" + "address": "mindustry.us.to" }, { "address": "nydustry.nydus.app:6060" }, { "address": "mindustry.pl:6000" + }, + { + "address": "routerchain.ddns.net" + }, + { + "address": "mindustry.pl:6666" } ] diff --git a/servers_v6.json b/servers_v6.json new file mode 100644 index 0000000000..fe51488c70 --- /dev/null +++ b/servers_v6.json @@ -0,0 +1 @@ +[] diff --git a/settings.gradle b/settings.gradle index 6883be3f0d..b0aa7f6e3e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -20,7 +20,7 @@ if(System.getenv("JITPACK") == "true") hasSdk = false if(hasSdk){ include 'android' }else{ - println("No local.properties found. Not loading Android module.") + println("No Android SDK found. Skipping Android module.") } if(!hasProperty("release")){ diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index d4192ca9c6..d689dbd5df 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -377,7 +377,7 @@ public class ApplicationTests{ world.tile(length + 1, 0).setBlock(new Block("___"){{ hasItems = true; destructible = true; - entityType = () -> new Building(){ + buildType = () -> new Building(){ @Override public void handleItem(Building source, Item item){ itemsa[0] ++; @@ -574,7 +574,7 @@ public class ApplicationTests{ }catch(Throwable t){ fail("Failed to update block '" + tile.block() + "'.", t); } - assertEquals(tile.block(), tile.build.block()); + assertEquals(tile.block(), tile.build.block); assertEquals(tile.block().health, tile.build.health()); } } diff --git a/tests/src/test/java/power/ItemLiquidGeneratorTests.java b/tests/src/test/java/power/ItemLiquidGeneratorTests.java index 64959780d1..08f636c566 100644 --- a/tests/src/test/java/power/ItemLiquidGeneratorTests.java +++ b/tests/src/test/java/power/ItemLiquidGeneratorTests.java @@ -39,7 +39,7 @@ public class ItemLiquidGeneratorTests extends PowerTestFixture{ powerProduction = 0.1f; itemDuration = fakeItemDuration; maxLiquidGenerate = maximumLiquidUsage; - entityType = ItemLiquidGeneratorBuild::new; + buildType = ItemLiquidGeneratorBuild::new; } @Override diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index 1c888070bf..994130a596 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -43,21 +43,21 @@ public class PowerTestFixture{ protected static PowerGenerator createFakeProducerBlock(float producedPower){ return new PowerGenerator("fakegen"){{ - entityType = () -> new GeneratorBuild(); + buildType = () -> new GeneratorBuild(); powerProduction = producedPower; }}; } protected static Battery createFakeBattery(float capacity){ return new Battery("fakebattery"){{ - entityType = () -> new BatteryBuild(); + buildType = () -> new BatteryBuild(); consumes.powerBuffered(capacity); }}; } protected static Block createFakeDirectConsumer(float powerPerTick){ return new PowerBlock("fakedirectconsumer"){{ - entityType = Building::create; + buildType = Building::create; consumes.power(powerPerTick); }}; } @@ -86,7 +86,7 @@ public class PowerTestFixture{ Reflect.set(Tile.class, tile, "floor", Blocks.sand); // Simulate the "changed" method. Calling it through reflections would require half the game to be initialized. - tile.build = block.newEntity().init(tile, Team.sharded, false, 0); + tile.build = block.newBuilding().init(tile, Team.sharded, false, 0); if(block.hasPower){ tile.build.power.graph = new PowerGraph(){ //assume there's always something consuming power diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index 391f24c57f..8c6a9f6c9d 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -126,7 +126,7 @@ public class Generators{ Image colors = new Image(content.blocks().size, 1); for(Block block : content.blocks()){ - if(block.isAir() || block instanceof BuildBlock || block instanceof OreBlock || block instanceof LegacyBlock) continue; + if(block.isAir() || block instanceof ConstructBlock || block instanceof OreBlock || block instanceof LegacyBlock) continue; block.load(); @@ -172,7 +172,7 @@ public class Generators{ int radius = 4; GenRegion region = (GenRegion)regions[regions.length - 1]; Image base = ImagePacker.get(region); - Image out = last = new Image(region.getWidth(), region.getHeight()); + Image out = last = new Image(region.width, region.height); for(int x = 0; x < out.width; x++){ for(int y = 0; y < out.height; y++){ @@ -330,7 +330,7 @@ public class Generators{ image.save(type.name + "-cell"); } - Image cell = new Image(type.cellRegion.getWidth(), type.cellRegion.getHeight()); + Image cell = new Image(type.cellRegion.width, type.cellRegion.height); cell.each((x, y) -> cell.draw(x, y, baseCell.getColor(x, y).mul(Color.valueOf("ffa665")))); image.draw(cell, image.width / 2 - cell.width / 2, image.height / 2 - cell.height / 2); @@ -339,8 +339,8 @@ public class Generators{ weapon.load(); image.draw(weapon.region, - (int)(weapon.x / Draw.scl + image.width / 2f - weapon.region.getWidth() / 2f), - (int)(-weapon.y / Draw.scl + image.height / 2f - weapon.region.getHeight() / 2f), + (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); } @@ -382,7 +382,9 @@ public class Generators{ } for(Cicon icon : Cicon.scaled){ - Image scaled = new Image(icon.size, icon.size); + Vec2 size = Scaling.fit.apply(image.width, image.height, icon.size, icon.size); + Image scaled = new Image((int)size.x, (int)size.y); + scaled.drawScaled(image); scaled.save("../ui/unit-" + type.name + "-" + icon.name()); } diff --git a/tools/src/mindustry/tools/Image.java b/tools/src/mindustry/tools/Image.java index 9f7e5e5eee..e89ad3b8b9 100644 --- a/tools/src/mindustry/tools/Image.java +++ b/tools/src/mindustry/tools/Image.java @@ -81,12 +81,12 @@ class Image{ /** Draws a region at the center. */ void drawCenter(TextureRegion region){ - draw(region, (width - region.getWidth()) / 2, (height - region.getHeight()) / 2, false, false); + draw(region, (width - region.width) / 2, (height - region.height) / 2, false, false); } /** Draws a region at the center. */ void drawCenter(TextureRegion region, boolean flipx, boolean flipy){ - draw(region, (width - region.getWidth()) / 2, (height - region.getHeight()) / 2, flipx, flipy); + draw(region, (width - region.width) / 2, (height - region.height) / 2, flipx, flipy); } void drawScaled(Image image){ @@ -114,12 +114,12 @@ class Image{ graphics.drawImage(ImagePacker.get(region).image, x, y, - x + region.getWidth(), - y + region.getHeight(), - (flipx ? region.getWidth() : 0) + ofx, - (flipy ? region.getHeight() : 0) + ofy, - (flipx ? 0 : region.getWidth()) + ofx, - (flipy ? 0 : region.getHeight()) + ofy, + x + region.width, + y + region.height, + (flipx ? region.width : 0) + ofx, + (flipy ? region.height : 0) + ofy, + (flipx ? 0 : region.width) + ofx, + (flipy ? 0 : region.height) + ofy, null); } diff --git a/tools/src/mindustry/tools/ImagePacker.java b/tools/src/mindustry/tools/ImagePacker.java index 9f359dd30a..4f83e181db 100644 --- a/tools/src/mindustry/tools/ImagePacker.java +++ b/tools/src/mindustry/tools/ImagePacker.java @@ -42,28 +42,12 @@ public class ImagePacker{ BufferedImage image = ImageIO.read(path.file()); if(image == null) throw new IOException("image " + path.absolutePath() + " is null for terrible reasons"); - GenRegion region = new GenRegion(fname, path){ - - @Override - public int getX(){ - return 0; - } - - @Override - public int getY(){ - return 0; - } - - @Override - public int getWidth(){ - return image.getWidth(); - } - - @Override - public int getHeight(){ - return image.getHeight(); - } - }; + GenRegion region = new GenRegion(fname, path){{ + width = image.getWidth(); + height = image.getHeight(); + u2 = v2 = 1f; + u = v = 0f; + }}; regionCache.put(fname, region); imageCache.put(fname, image); @@ -105,7 +89,7 @@ public class ImagePacker{ } }; - Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth(); + Draw.scl = 1f / Core.atlas.find("scale_marker").width; Time.mark(); Generators.generate(); @@ -123,7 +107,7 @@ public class ImagePacker{ map.each((key, val) -> content2id.put(val.split("\\|")[0], key)); Seq cont = Seq.withArrays(Vars.content.blocks(), Vars.content.items(), Vars.content.liquids(), Vars.content.units()); - cont.removeAll(u -> u instanceof BuildBlock || u == Blocks.air); + cont.removeAll(u -> u instanceof ConstructBlock || u == Blocks.air); int minid = 0xF8FF; for(String key : map.keys()){ diff --git a/tools/src/mindustry/tools/ScriptStubGenerator.java b/tools/src/mindustry/tools/ScriptMainGenerator.java similarity index 95% rename from tools/src/mindustry/tools/ScriptStubGenerator.java rename to tools/src/mindustry/tools/ScriptMainGenerator.java index 6a4d90d9b0..66a5233e29 100644 --- a/tools/src/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/mindustry/tools/ScriptMainGenerator.java @@ -5,25 +5,27 @@ import arc.files.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.graphics.g2d.TextureAtlas.*; +import arc.graphics.gl.*; import arc.math.*; import arc.struct.*; import arc.util.*; import mindustry.game.*; import mindustry.gen.*; +import mindustry.net.*; import java.io.*; import java.lang.reflect.*; import java.net.*; import java.util.*; -public class ScriptStubGenerator{ +public class ScriptMainGenerator{ public static void main(String[] args) throws Exception{ String base = "mindustry"; Seq blacklist = Seq.with("plugin", "mod", "net", "io", "tools"); Seq nameBlacklist = Seq.with("ClassAccess"); Seq> whitelist = Seq.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, - AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, + AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, Shader.class, Sounds.class, Musics.class, Call.class, Texture.class, TextureData.class, Pixmap.class, I18NBundle.class, Interval.class, DataInput.class, DataOutput.class, DataInputStream.class, DataOutputStream.class, Integer.class, Float.class, Double.class, Long.class, Boolean.class, Short.class, Byte.class, Character.class); Seq nopackage = Seq.with("java.lang", "java"); @@ -40,6 +42,8 @@ public class ScriptStubGenerator{ 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.distinct(); classes.sortComparing(Class::getName); ObjectSet used = ObjectSet.with(); @@ -52,12 +56,12 @@ public class ScriptStubGenerator{ used.add(type.getPackage().getName()); } + Log.info("Imported @ packages.", used.size); + for(Class type : EventType.class.getClasses()){ result.append("const ").append(type.getSimpleName()).append(" = ").append("Packages.").append(type.getName().replace('$', '.')).append("\n"); } - //Log.info(result); - new Fi("core/assets/scripts/global.js").writeString(result.toString()); } diff --git a/tools/src/mindustry/tools/SectorDataGenerator.java b/tools/src/mindustry/tools/SectorDataGenerator.java index 34cc7c7200..622a0b2466 100644 --- a/tools/src/mindustry/tools/SectorDataGenerator.java +++ b/tools/src/mindustry/tools/SectorDataGenerator.java @@ -3,6 +3,7 @@ package mindustry.tools; import arc.*; import arc.backend.headless.mock.*; import arc.files.*; +import arc.math.geom.*; import arc.mock.*; import arc.struct.*; import arc.struct.ObjectIntMap.*; @@ -17,6 +18,7 @@ import mindustry.net.Net; import mindustry.type.*; import mindustry.type.Sector.*; import mindustry.world.*; +import mindustry.world.blocks.storage.*; import mindustry.world.blocks.storage.CoreBlock.*; import static mindustry.Vars.*; @@ -84,6 +86,19 @@ public class SectorDataGenerator{ CoreBuild entity = Team.sharded.core(); int cx = entity.tileX(), cy = entity.tileY(); + boolean path = pathfind(true); + boolean groundPath = pathfind(false); + + if(!path){ + Log.err("Sector &ly@&lr has no core path!", sector.id); + } + + if(!groundPath){ + Log.debug("&lbSector &ly@&lb is naval-only", sector.id); + + data.attributes |= (1 << SectorAttribute.navalPath.ordinal()); + } + int nearTiles = 0; int waterCheckRad = 5; @@ -150,7 +165,7 @@ public class SectorDataGenerator{ } if(count[0]++ % 10 == 0){ - Log.info("&lyDone with sector &lm@/@", count[0], planet.sectors.size); + Log.info("&ly[ &lg@% &ly] Done with sector &lm@/@ ", (int)((float)count[0] / planet.sectors.size * 100), count[0], planet.sectors.size); } return data; @@ -163,4 +178,51 @@ public class SectorDataGenerator{ } } } + + private static boolean pathfind(boolean allowWater){ + CoreBuild entity = Team.sharded.core(); + + IntSet enemies = new IntSet(); + world.tiles.eachTile(t -> { + if((t.team() == Team.crux && t.block() instanceof CoreBlock) || t.overlay() == Blocks.spawn){ + enemies.add(t.pos()); + } + }); + + GridBits used = new GridBits(world.width(), world.height()); + + IntQueue queue = new IntQueue(); + queue.addFirst(entity.pos()); + boolean any = false; + + outer: + while(!queue.isEmpty()){ + int pos = queue.removeFirst(); + int x = Point2.x(pos), y = Point2.y(pos); + used.set(x, y); + + for(Point2 p : Geometry.d4){ + int nx = p.x + x, ny = p.y + y; + + if(world.tiles.in(nx, ny) && !used.get(nx, ny)){ + Tile tile = world.tile(nx, ny); + + //skip full solids + if((tile.block().isStatic() && tile.solid()) || (!allowWater && tile.floor().isLiquid)) continue; + + int newpos = Point2.pack(nx, ny); + + used.set(nx, ny); + queue.addLast(newpos); + + if(enemies.contains(newpos)){ + any = true; + break outer; + } + } + } + } + + return any; + } }