diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 50fa001df5..dea711fef0 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -7,17 +7,21 @@ assignees: '' --- +**Note**: Do not report any new bugs directly relating to the v6 campaign. They will not be fixed or considered at this time. + **Platform**: *Android/iOS/Mac/Windows/Linux* **Build**: *The build number under the title in the main menu. Required.* **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. REQUIRED for any issue that happens in-game.* + +**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 f31a2d36f3..6b1dfd72ac 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,7 @@ script: - cp -a Mindustry/core/build/docs/javadoc/. docs/ - cd docs - if [ "$TRAVIS_PULL_REQUEST" = "false" ]; then git add .; git commit -m "Update ${TRAVIS_BUILD_NUMBER}"; git push https://Anuken:${GH_PUSH_TOKEN}@github.com/MindustryGame/docs; fi +- cd ../Mindustry deploy: - provider: releases skip_cleanup: true @@ -38,11 +39,11 @@ deploy: on: repo: Anuken/Mindustry tags: true -- provider: script - script: bash update_wiki.sh - on: - repo: Anuken/Mindustry - tags: true +#- provider: script +# script: bash update_wiki.sh +# on: +# repo: Anuken/Mindustry +# tags: true env: global: - secure: TqlUl/ojjkCMVOGbCTKz7Cnr4F08UyWzY/CiJ0vvUOGJGZ1qm7XavAlDf5XT0egU4mvr37THubFO8vojbqmrmy0oZnYh3njKFA8axgyZ8PyKkjGHOfd0i6qyEWsOr9H90/2X8r3LwEeLaDFyHpu3wljIGBjweg53g2qwmDwCFa9UR80FJZ+xDB+rD6B3cXT0DTEkCoLZXLqXm0Y3HvBdSuBL1LR/FNb2BSxNq+tNLGiz1kdQZV5erausbbZypBoGxzz63xAnyz2kkFz73A8xQYVTzGbFodTPz7HM13GVZ5s43I03Y+HYyHBgBaSLziO2hi2kzVJccOwzBp7wS4fs1MqsFY5+IeWJ9k+hm89NiYT7+6zlEgoUMlIniny1qLqWTzx7btUeuC/y/h5TVBNgaV+z0jmHycHfeSyq5I+vmX4J8qe3wmaN8TcdqYKU5nIznOTk3CM5Fzu0Bs9vkCkOxmormmcjMFW1RbdOLc/hpZWZggsBA88sNEAI8eq+r5QEeqzeCx8YKoZDjdrsqvgLMc3El3gS9oMGxkn0Y/TEcqs9Tc4BXtTkqIA68hD0DYzlAxYjVbbkAI9Hh9lHNvV3Dr/oCkGXQ/HflM143kj1L3tSBZpqeqQE2XhngB5nqpS3OZTmZbMTQ8qD2luU18yaTGMLF5tJS/fdKPRx0gQ1kL8= diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 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..5c9c797297 100644 --- a/README.md +++ b/README.md @@ -15,16 +15,16 @@ 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: #### Windows -_Running:_ `gradlew.bat desktop:run` -_Building:_ `gradlew.bat desktop:dist` -_Sprite Packing:_ `gradlew.bat tools:pack` +_Running:_ `gradlew desktop:run` +_Building:_ `gradlew desktop:dist` +_Sprite Packing:_ `gradlew tools:pack` #### Linux/Mac OS @@ -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 @@ -69,3 +70,7 @@ Post feature requests and feedback [here](https://github.com/Anuken/Mindustry-Su [Get it on F-Droid](https://f-droid.org/packages/io.anuke.mindustry/) + +[Download On Flathub](https://flathub.org/apps/details/com.github.Anuken.Mindustry) diff --git a/android/build.gradle b/android/build.gradle index ef1791a9b6..59b698955a 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){ @@ -98,7 +99,7 @@ android{ keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD }else{ - println("No keystore info property found!") + println("No keystore property found. Releases will be unsigned.") } } } diff --git a/android/src/mindustry/android/AndroidLauncher.java b/android/src/mindustry/android/AndroidLauncher.java index e2c484e50d..7400bd37a8 100644 --- a/android/src/mindustry/android/AndroidLauncher.java +++ b/android/src/mindustry/android/AndroidLauncher.java @@ -7,7 +7,6 @@ import android.content.pm.*; import android.net.*; import android.os.Build.*; import android.os.*; -import android.provider.Settings.*; import android.telephony.*; import arc.*; import arc.backend.android.*; @@ -15,7 +14,7 @@ import arc.files.*; import arc.func.*; import arc.scene.ui.layout.*; import arc.util.*; -import arc.util.serialization.*; +import dalvik.system.*; import mindustry.*; import mindustry.game.Saves.*; import mindustry.io.*; @@ -23,7 +22,6 @@ import mindustry.net.*; import mindustry.ui.dialogs.*; import java.io.*; -import java.lang.System; import java.lang.Thread.*; import java.util.*; @@ -73,12 +71,25 @@ public class AndroidLauncher extends AndroidApplication{ public void shareFile(Fi file){ } + @Override + public Class loadJar(Fi jar, String mainClass) throws Exception{ + DexClassLoader loader = new DexClassLoader(jar.file().getPath(), getFilesDir().getPath(), null, getClassLoader()); + return Class.forName(mainClass, true, loader); + } + @Override public void showFileChooser(boolean open, String extension, Cons cons){ + showFileChooser(open, cons, extension); + } + + void showFileChooser(boolean open, Cons cons, String... extensions){ + String extension = extensions[0]; + if(VERSION.SDK_INT >= VERSION_CODES.Q){ Intent intent = new Intent(open ? Intent.ACTION_OPEN_DOCUMENT : Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType(extension.equals("zip") && !open ? "application/zip" : "*/*"); + intent.setType(extension.equals("zip") && !open && extensions.length == 1 ? "application/zip" : "*/*"); + addResultListener(i -> startActivityForResult(intent, i), (code, in) -> { if(code == Activity.RESULT_OK && in != null && in.getData() != null){ Uri uri = in.getData(); @@ -108,7 +119,7 @@ public class AndroidLauncher extends AndroidApplication{ }); }else if(VERSION.SDK_INT >= VERSION_CODES.M && !(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)){ - chooser = new FileChooser(open ? "@open" : "@save", file -> file.extension().equalsIgnoreCase(extension), open, file -> { + chooser = new FileChooser(open ? "@open" : "@save", file -> Structs.contains(extensions, file.extension().toLowerCase()), open, file -> { if(!open){ cons.get(file.parent().child(file.nameWithoutExtension() + "." + extension)); }else{ @@ -125,10 +136,19 @@ public class AndroidLauncher extends AndroidApplication{ } requestPermissions(perms.toArray(new String[0]), PERMISSION_REQUEST_CODE); }else{ - super.showFileChooser(open, extension, cons); + if(open){ + new FileChooser("@open", file -> Structs.contains(extensions, file.extension().toLowerCase()), true, cons).show(); + }else{ + super.showFileChooser(open, extension, cons); + } } } + @Override + public void showMultiFileChooser(Cons cons, String... extensions){ + showFileChooser(true, cons, extensions); + } + @Override public void beginForceLandscape(){ setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); diff --git a/android/src/mindustry/android/AndroidRhinoContext.java b/android/src/mindustry/android/AndroidRhinoContext.java index c4468ecead..d3e80c7427 100644 --- a/android/src/mindustry/android/AndroidRhinoContext.java +++ b/android/src/mindustry/android/AndroidRhinoContext.java @@ -41,6 +41,11 @@ public class AndroidRhinoContext{ public Object getDynamicSecurityDomain(Object o){ return null; } + + @Override + public Object callWithDomain(Object o, Context context, Callable callable, Scriptable scriptable, Scriptable scriptable1, Object[] objects){ + return null; + } }); AndroidContextFactory factory; diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java index 341b26df3a..0bd3aa6b32 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java @@ -38,6 +38,8 @@ public class EntityIO{ this.serializer = serializer; this.name = name; + json.setIgnoreUnknownFields(true); + directory.mkdirs(); //load old revisions @@ -45,6 +47,8 @@ public class EntityIO{ revisions.add(json.fromJson(Revision.class, fi)); } + revisions.sort(r -> r.version); + //next revision to be used int nextRevision = revisions.isEmpty() ? 0 : revisions.max(r -> r.version).version + 1; @@ -61,11 +65,13 @@ public class EntityIO{ //keep track of fields present in the entity presentFields.addAll(fields.map(f -> f.name)); + Revision previous = revisions.isEmpty() ? null : revisions.peek(); + //add new revision if it doesn't match or there are no revisions if(revisions.isEmpty() || !revisions.peek().equal(fields)){ revisions.add(new Revision(nextRevision, - fields.map(f -> new RevisionField(f.name, f.type.toString(), - f.type.isPrimitive() ? BaseProcessor.typeSize(f.type.toString()) : -1)))); + fields.map(f -> new RevisionField(f.name, f.type.toString())))); + Log.warn("Adding new revision @ for @.\nPre = @\nNew = @\n", nextRevision, name, previous == null ? null : previous.fields.toString(", ", f -> f.name + ":" + f.type), fields.toString(", ", f -> f.name + ":" + f.type.toString())); //write revision directory.child(nextRevision + ".json").writeString(json.toJson(revisions.peek())); } @@ -147,6 +153,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(); } } @@ -316,8 +328,7 @@ public class EntityIO{ for(int i = 0; i < fields.size; i++){ RevisionField field = fields.get(i); FieldSpec spec = specs.get(i); - //TODO when making fields, their primitive size may be overwritten by an annotation; check for that - if(!(field.type.equals(spec.type.toString()) && (!spec.type.isPrimitive() || BaseProcessor.typeSize(spec.type.toString()) == field.size))){ + if(!field.type.replace("mindustry.gen.", "").equals(spec.type.toString().replace("mindustry.gen.", ""))){ return false; } } @@ -327,11 +338,9 @@ public class EntityIO{ public static class RevisionField{ String name, type; - int size; //in bytes - RevisionField(String name, String type, int size){ + RevisionField(String name, String type){ this.name = name; - this.size = size; this.type = type; } diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index 4de2254f7f..88b3b30438 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -1,6 +1,5 @@ package mindustry.annotations.entity; -import arc.*; import arc.files.*; import arc.func.*; import arc.struct.*; @@ -77,7 +76,11 @@ public class EntityProcess extends BaseProcessor{ for(Smethod elem : component.methods()){ if(elem.is(Modifier.ABSTRACT) || elem.is(Modifier.NATIVE)) continue; //get all statements in the method, store them - methodBlocks.put(elem.descString(), elem.tree().getBody().toString()); + methodBlocks.put(elem.descString(), elem.tree().getBody().toString() + //replace all self() invocations with this + .replaceAll("this\\.<(.*)>self\\(\\)", "this") + .replaceAll("self\\(\\)", "this") + ); } } @@ -468,6 +471,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){ @@ -505,7 +519,7 @@ public class EntityProcess extends BaseProcessor{ //add free code to remove methods - always at the end //this only gets called next frame. if(first.name().equals("remove") && ann.pooled()){ - mbuilder.addStatement("$T.app.post(() -> $T.free(this))", Core.class, Pools.class); + mbuilder.addStatement("mindustry.gen.Groups.queueFree(($T)this)", Poolable.class); } builder.addMethod(mbuilder.build()); @@ -572,6 +586,17 @@ public class EntityProcess extends BaseProcessor{ //write clear groupsBuilder.addMethod(groupClear.build()); + //add method for pool storage + groupsBuilder.addField(FieldSpec.builder(ParameterizedTypeName.get(Seq.class, Poolable.class), "freeQueue", Modifier.PRIVATE, Modifier.STATIC).initializer("new Seq<>()").build()); + + //method for freeing things + MethodSpec.Builder groupFreeQueue = MethodSpec.methodBuilder("queueFree") + .addModifiers(Modifier.PUBLIC, Modifier.STATIC) + .addParameter(Poolable.class, "obj") + .addStatement("freeQueue.add(obj)"); + + groupsBuilder.addMethod(groupFreeQueue.build()); + //add method for resizing all necessary groups MethodSpec.Builder groupResize = MethodSpec.methodBuilder("resize") .addParameter(TypeName.FLOAT, "x").addParameter(TypeName.FLOAT, "y").addParameter(TypeName.FLOAT, "w").addParameter(TypeName.FLOAT, "h") @@ -580,6 +605,11 @@ public class EntityProcess extends BaseProcessor{ MethodSpec.Builder groupUpdate = MethodSpec.methodBuilder("update") .addModifiers(Modifier.PUBLIC, Modifier.STATIC); + //free everything pooled at the start of each updaet + groupUpdate + .addStatement("for($T p : freeQueue) $T.free(p)", Poolable.class, Pools.class) + .addStatement("freeQueue.clear()"); + //method resize for(GroupDefinition group : groupDefs){ if(group.spatial){ @@ -631,10 +661,10 @@ public class EntityProcess extends BaseProcessor{ //build mapping class for sync IDs TypeSpec.Builder idBuilder = TypeSpec.classBuilder("EntityMapping").addModifiers(Modifier.PUBLIC) - .addField(FieldSpec.builder(TypeName.get(Prov[].class), "idMap", Modifier.PRIVATE, Modifier.STATIC).initializer("new Prov[256]").build()) + .addField(FieldSpec.builder(TypeName.get(Prov[].class), "idMap", Modifier.PUBLIC, Modifier.STATIC).initializer("new Prov[256]").build()) .addField(FieldSpec.builder(ParameterizedTypeName.get(ClassName.get(ObjectMap.class), tname(String.class), tname(Prov.class)), - "nameMap", Modifier.PRIVATE, Modifier.STATIC).initializer("new ObjectMap<>()").build()) + "nameMap", Modifier.PUBLIC, Modifier.STATIC).initializer("new ObjectMap<>()").build()) .addMethod(MethodSpec.methodBuilder("map").addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(TypeName.get(Prov.class)).addParameter(int.class, "id").addStatement("return idMap[id]").build()) .addMethod(MethodSpec.methodBuilder("map").addModifiers(Modifier.PUBLIC, Modifier.STATIC) diff --git a/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java b/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java index e3e70e8ddd..8e22e33db9 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java @@ -3,6 +3,8 @@ package mindustry.annotations.impl; import arc.files.*; import arc.scene.style.*; import arc.struct.*; +import arc.util.*; +import arc.util.io.*; import arc.util.serialization.*; import com.squareup.javapoet.*; import mindustry.annotations.Annotations.*; @@ -33,6 +35,17 @@ public class AssetsProcess extends BaseProcessor{ String resources = rootDirectory + "/core/assets-raw/sprites/ui"; Jval icons = Jval.read(Fi.get(rootDirectory + "/core/assets-raw/fontgen/config.json").readString()); + ObjectMap texIcons = new OrderedMap<>(); + PropertiesUtils.load(texIcons, Fi.get(rootDirectory + "/core/assets/icons/icons.properties").reader()); + + texIcons.each((key, val) -> { + String[] split = val.split("\\|"); + String name = Strings.kebabToCamel(split[1]).replace("Medium", "").replace("Icon", ""); + if(SourceVersion.isKeyword(name) || name.equals("char")) name = name + "i"; + + ichtype.addField(FieldSpec.builder(char.class, name, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("(char)" + key).build()); + }); + ictype.addField(FieldSpec.builder(ParameterizedTypeName.get(ObjectMap.class, String.class, TextureRegionDrawable.class), "icons", Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL).initializer("new ObjectMap<>()").build()); diff --git a/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java b/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java index b43a2d3eef..e28ecf13a0 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/CallSuperProcess.java @@ -68,9 +68,9 @@ public class CallSuperProcess extends AbstractProcessor{ } static class CodeAnalyzerTreeScanner extends TreePathScanner{ - private String methodName; - private MethodTree method; - private boolean callSuperUsed; + String methodName; + MethodTree method; + boolean callSuperUsed; @Override public Object visitClass(ClassTree classTree, Trees trees){ @@ -83,6 +83,9 @@ public class CallSuperProcess extends AbstractProcessor{ if(extendTree instanceof JCIdent){ JCIdent tree = (JCIdent)extendTree; + + if(tree == null || tree.sym == null) return super.visitClass(classTree, trees); + com.sun.tools.javac.code.Scope members = tree.sym.members(); if(checkScope(members)) diff --git a/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java b/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java index eca5d84387..64adc37c89 100644 --- a/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/misc/LogicStatementProcessor.java @@ -67,7 +67,7 @@ public class LogicStatementProcessor extends BaseProcessor{ int index = 0; for(Svar field : fields){ - if(field.is(Modifier.TRANSIENT)) continue; + if(field.isAny(Modifier.TRANSIENT, Modifier.STATIC)) continue; writer.addStatement("out.append(\" \")"); writer.addStatement("out.append((($T)obj).$L$L)", c.mirror(), field.name(), diff --git a/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java b/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java index c785582157..b3a473795a 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java +++ b/annotations/src/main/java/mindustry/annotations/remote/RemoteProcess.java @@ -19,7 +19,7 @@ import java.util.*; }) public class RemoteProcess extends BaseProcessor{ /** Maximum size of each event packet. */ - public static final int maxPacketSize = 4096; + public static final int maxPacketSize = 8192; /** Warning on top of each autogenerated file. */ public static final String autogenWarning = "Autogenerated file. Do not modify!\n"; diff --git a/annotations/src/main/resources/classids.properties b/annotations/src/main/resources/classids.properties index 288f09bdbe..86ca440e1c 100644 --- a/annotations/src/main/resources/classids.properties +++ b/annotations/src/main/resources/classids.properties @@ -3,6 +3,7 @@ alpha=0 atrax=1 block=2 +corvus=24 flare=3 mace=4 mega=5 @@ -16,9 +17,13 @@ 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 +oct=26 poly=18 pulsar=19 +quad=23 risso=20 -spiroct=21 \ No newline at end of file +spiroct=21 +vela=25 \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BlockUnitUnit/1.json b/annotations/src/main/resources/revisions/BlockUnitUnit/1.json new file mode 100644 index 0000000000..dd8fdb2784 --- /dev/null +++ b/annotations/src/main/resources/revisions/BlockUnitUnit/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnit/1.json b/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnit/1.json new file mode 100644 index 0000000000..6ed4e60191 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnit/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderCommanderPayloadUnit/0.json b/annotations/src/main/resources/revisions/BuilderCommanderPayloadUnit/0.json new file mode 100644 index 0000000000..826bd02faf --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderCommanderPayloadUnit/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float},{name:armor,type:float},{name:controller,type:mindustry.entities.units.UnitController},{name:elevation,type:float},{name:health,type:float},{name:isShooting,type:boolean},{name:mounts,type:"mindustry.entities.units.WeaponMount[]"},{name:payloads,type:arc.struct.Seq},{name:plans,type:arc.struct.Queue},{name:rotation,type:float},{name:shield,type:float},{name:spawnedByCore,type:boolean},{name:stack,type:mindustry.type.ItemStack},{name:statuses,type:arc.struct.Seq},{name:team,type:mindustry.game.Team},{name:type,type:mindustry.type.UnitType},{name:x,type:float},{name:y,type:float}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderLegsUnit/1.json b/annotations/src/main/resources/revisions/BuilderLegsUnit/1.json new file mode 100644 index 0000000000..885ef84f29 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderLegsUnit/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderMinerPayloadUnit/1.json b/annotations/src/main/resources/revisions/BuilderMinerPayloadUnit/1.json new file mode 100644 index 0000000000..de89770ab4 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderMinerPayloadUnit/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:payloads,type:arc.struct.Seq,size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderMinerUnit/1.json b/annotations/src/main/resources/revisions/BuilderMinerUnit/1.json new file mode 100644 index 0000000000..3a92a12856 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderMinerUnit/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderPayloadUnit/0.json b/annotations/src/main/resources/revisions/BuilderPayloadUnit/0.json new file mode 100644 index 0000000000..a85d764f8c --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderPayloadUnit/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:payloads,type:arc.struct.Seq,size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BuilderPayloadUnit/1.json b/annotations/src/main/resources/revisions/BuilderPayloadUnit/1.json new file mode 100644 index 0000000000..8ca4ac4388 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderPayloadUnit/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:payloads,type:arc.struct.Seq,size:-1},{name:plans,type:arc.struct.Queue,size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/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/CommanderLegsUnit/0.json b/annotations/src/main/resources/revisions/CommanderLegsUnit/0.json new file mode 100644 index 0000000000..5431957381 --- /dev/null +++ b/annotations/src/main/resources/revisions/CommanderLegsUnit/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/CommanderLegsUnit/1.json b/annotations/src/main/resources/revisions/CommanderLegsUnit/1.json new file mode 100644 index 0000000000..dd8fdb2784 --- /dev/null +++ b/annotations/src/main/resources/revisions/CommanderLegsUnit/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/CommanderMechUnit/0.json b/annotations/src/main/resources/revisions/CommanderMechUnit/0.json new file mode 100644 index 0000000000..1779e118de --- /dev/null +++ b/annotations/src/main/resources/revisions/CommanderMechUnit/0.json @@ -0,0 +1 @@ +{fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:deactivated,type:boolean,size:1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/CommanderMechUnit/1.json b/annotations/src/main/resources/revisions/CommanderMechUnit/1.json new file mode 100644 index 0000000000..66897ee06f --- /dev/null +++ b/annotations/src/main/resources/revisions/CommanderMechUnit/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/CommanderUnitWaterMove/1.json b/annotations/src/main/resources/revisions/CommanderUnitWaterMove/1.json new file mode 100644 index 0000000000..dd8fdb2784 --- /dev/null +++ b/annotations/src/main/resources/revisions/CommanderUnitWaterMove/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/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/LegsUnit/1.json b/annotations/src/main/resources/revisions/LegsUnit/1.json new file mode 100644 index 0000000000..dd8fdb2784 --- /dev/null +++ b/annotations/src/main/resources/revisions/LegsUnit/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/MechUnit/1.json b/annotations/src/main/resources/revisions/MechUnit/1.json new file mode 100644 index 0000000000..66897ee06f --- /dev/null +++ b/annotations/src/main/resources/revisions/MechUnit/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:baseRotation,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/MinerUnit/1.json b/annotations/src/main/resources/revisions/MinerUnit/1.json new file mode 100644 index 0000000000..9d58b6775a --- /dev/null +++ b/annotations/src/main/resources/revisions/MinerUnit/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mineTile,type:mindustry.world.Tile,size:-1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/UnitEntity/1.json b/annotations/src/main/resources/revisions/UnitEntity/1.json new file mode 100644 index 0000000000..dd8fdb2784 --- /dev/null +++ b/annotations/src/main/resources/revisions/UnitEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:float,size:4},{name:armor,type:float,size:4},{name:controller,type:mindustry.entities.units.UnitController,size:-1},{name:elevation,type:float,size:4},{name:health,type:float,size:4},{name:isShooting,type:boolean,size:1},{name:mounts,type:"mindustry.entities.units.WeaponMount[]",size:-1},{name:rotation,type:float,size:4},{name:shield,type:float,size:4},{name:spawnedByCore,type:boolean,size:1},{name:stack,type:mindustry.type.ItemStack,size:-1},{name:statuses,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,size:-1},{name:type,type:mindustry.type.UnitType,size:-1},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file diff --git a/build.gradle b/build.gradle index 20e2b7f0dd..267503915a 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 } @@ -200,7 +200,6 @@ project(":desktop"){ dependencies{ implementation project(":core") - implementation arcModule("natives:natives-box2d-desktop") implementation arcModule("natives:natives-desktop") implementation arcModule("natives:natives-freetype-desktop") implementation 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1' @@ -239,7 +238,6 @@ project(":ios"){ implementation arcModule("natives:natives-ios") implementation arcModule("natives:natives-freetype-ios") - implementation arcModule("natives:natives-box2d-ios") implementation arcModule("backends:backend-robovm") compileOnly project(":annotations") @@ -261,7 +259,6 @@ project(":core"){ doLast{ def props = loadVersionProps() def androidVersion = props['androidBuildCode'].toInteger() - 2 - def buildVersion = props["build"] def loglines = file("../changelog").text.split("\n") def maxLength = 460 @@ -273,7 +270,6 @@ project(":core"){ } } def changelogs = file("../fastlane/metadata/android/en-US/changelogs/") - new File(changelogs, buildVersion + ".txt").text = (result) new File(changelogs, androidVersion + ".txt").text = (result) } } @@ -284,7 +280,6 @@ project(":core"){ api "org.lz4:lz4-java:1.4.1" api arcModule("arc-core") api arcModule("extensions:freetype") - api arcModule("extensions:box2d") api arcModule("extensions:g3d") api arcModule("extensions:fx") api arcModule("extensions:arcnet") @@ -301,7 +296,6 @@ project(":server"){ dependencies{ implementation project(":core") - implementation arcModule("natives:natives-box2d-desktop") implementation arcModule("backends:backend-headless") } } @@ -314,7 +308,6 @@ project(":tests"){ testImplementation "org.junit.jupiter:junit-jupiter-params:5.3.1" testImplementation "org.junit.jupiter:junit-jupiter-api:5.3.1" testImplementation arcModule("backends:backend-headless") - testImplementation arcModule("natives:natives-box2d-desktop") testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.3.1" } @@ -336,7 +329,6 @@ project(":tools"){ implementation arcModule("natives:natives-desktop") implementation arcModule("natives:natives-freetype-desktop") - implementation arcModule("natives:natives-box2d-desktop") implementation arcModule("backends:backend-headless") } } diff --git a/core/assets-raw/sprites/blocks/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/distribution/conveyors/armored-conveyor-0-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-0.png index 5a113d8e02..2995011050 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png index 0312349cc8..4e3d884d60 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png index 97ff507f6e..ca1ca5e98f 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png index f0555606e1..b5afa99ceb 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-0-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png index caab53e98b..961cfc9290 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png index 26c760e325..3c2cb422da 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png index 652dff1730..d3e7cac664 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png index 8af227bd04..ba02b11f2f 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-1-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png index a10e7d2c30..dde9319f48 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png index babb8c9d7b..c1c73953ac 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png index 31af8a221e..5401d769aa 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png index 4bd89f0199..feb39f4ab1 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-2-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png index 5a665f713b..868b0f4798 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png index a9647797fe..2d7f0902f6 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png index fc36ed94f0..a1d8c76dd9 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png index 6db61c006e..e707dd80d4 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/armored-conveyor-4-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png index aed4c7decb..c50b281985 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png index 213168b5ea..6dfe694ec0 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png index a69604d6fe..ef313ad576 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png index 6cd887f110..e5ccf27dbb 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/conveyor-1-3.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png index 0eaf09d5a4..5041f028ed 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor-edge.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png index b19a7aaab7..3f5fbf0184 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/plastanium-conveyor.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png index 16b0938f9f..0f8b73714d 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-0.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png index 98d03b428e..89ad916de7 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-1.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png index f166ec32f7..fa082af1be 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-2.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.png b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.png index 0694b091f6..fd22fd478c 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.png and b/core/assets-raw/sprites/blocks/distribution/conveyors/titanium-conveyor-1-3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/ignarock1.png b/core/assets-raw/sprites/blocks/environment/basalt1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/ignarock1.png rename to core/assets-raw/sprites/blocks/environment/basalt1.png diff --git a/core/assets-raw/sprites/blocks/environment/ignarock2.png b/core/assets-raw/sprites/blocks/environment/basalt2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/ignarock2.png rename to core/assets-raw/sprites/blocks/environment/basalt2.png diff --git a/core/assets-raw/sprites/blocks/environment/ignarock3.png b/core/assets-raw/sprites/blocks/environment/basalt3.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/ignarock3.png rename to core/assets-raw/sprites/blocks/environment/basalt3.png diff --git a/core/assets-raw/sprites/blocks/environment/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/metal-floor-3.png b/core/assets-raw/sprites/blocks/environment/metal-floor-3.png index 7fbb9243b4..8b87059487 100644 Binary files a/core/assets-raw/sprites/blocks/environment/metal-floor-3.png and b/core/assets-raw/sprites/blocks/environment/metal-floor-3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/mud1.png b/core/assets-raw/sprites/blocks/environment/mud1.png new file mode 100644 index 0000000000..2f5963cef9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/mud1.png differ diff --git a/core/assets-raw/sprites/blocks/environment/mud2.png b/core/assets-raw/sprites/blocks/environment/mud2.png new file mode 100644 index 0000000000..2407ae4449 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/mud2.png differ diff --git a/core/assets-raw/sprites/blocks/environment/mud3.png b/core/assets-raw/sprites/blocks/environment/mud3.png new file mode 100644 index 0000000000..a602c93469 Binary files /dev/null and b/core/assets-raw/sprites/blocks/environment/mud3.png differ diff --git a/core/assets-raw/sprites/blocks/environment/saltrocks-large.png b/core/assets-raw/sprites/blocks/environment/salt-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/saltrocks-large.png rename to core/assets-raw/sprites/blocks/environment/salt-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/saltrocks1.png b/core/assets-raw/sprites/blocks/environment/salt-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/saltrocks1.png rename to core/assets-raw/sprites/blocks/environment/salt-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/saltrocks2.png b/core/assets-raw/sprites/blocks/environment/salt-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/saltrocks2.png rename to core/assets-raw/sprites/blocks/environment/salt-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/sandrocks-large.png b/core/assets-raw/sprites/blocks/environment/sand-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sandrocks-large.png rename to core/assets-raw/sprites/blocks/environment/sand-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/sandrocks1.png b/core/assets-raw/sprites/blocks/environment/sand-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sandrocks1.png rename to core/assets-raw/sprites/blocks/environment/sand-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/sandrocks2.png b/core/assets-raw/sprites/blocks/environment/sand-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sandrocks2.png rename to core/assets-raw/sprites/blocks/environment/sand-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/shalerocks-large.png b/core/assets-raw/sprites/blocks/environment/shale-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/shalerocks-large.png rename to core/assets-raw/sprites/blocks/environment/shale-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/shalerocks1.png b/core/assets-raw/sprites/blocks/environment/shale-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/shalerocks1.png rename to core/assets-raw/sprites/blocks/environment/shale-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/shalerocks2.png b/core/assets-raw/sprites/blocks/environment/shale-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/shalerocks2.png rename to core/assets-raw/sprites/blocks/environment/shale-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/snowrocks-large.png b/core/assets-raw/sprites/blocks/environment/snow-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/snowrocks-large.png rename to core/assets-raw/sprites/blocks/environment/snow-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/snowrocks1.png b/core/assets-raw/sprites/blocks/environment/snow-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/snowrocks1.png rename to core/assets-raw/sprites/blocks/environment/snow-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/snowrocks2.png b/core/assets-raw/sprites/blocks/environment/snow-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/snowrocks2.png rename to core/assets-raw/sprites/blocks/environment/snow-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/sporerocks-large.png b/core/assets-raw/sprites/blocks/environment/spore-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sporerocks-large.png rename to core/assets-raw/sprites/blocks/environment/spore-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/sporerocks1.png b/core/assets-raw/sprites/blocks/environment/spore-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sporerocks1.png rename to core/assets-raw/sprites/blocks/environment/spore-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/sporerocks2.png b/core/assets-raw/sprites/blocks/environment/spore-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/sporerocks2.png rename to core/assets-raw/sprites/blocks/environment/spore-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/rocks-large.png b/core/assets-raw/sprites/blocks/environment/stone-wall-large.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/rocks-large.png rename to core/assets-raw/sprites/blocks/environment/stone-wall-large.png diff --git a/core/assets-raw/sprites/blocks/environment/rocks1.png b/core/assets-raw/sprites/blocks/environment/stone-wall1.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/rocks1.png rename to core/assets-raw/sprites/blocks/environment/stone-wall1.png diff --git a/core/assets-raw/sprites/blocks/environment/rocks2.png b/core/assets-raw/sprites/blocks/environment/stone-wall2.png similarity index 100% rename from core/assets-raw/sprites/blocks/environment/rocks2.png rename to core/assets-raw/sprites/blocks/environment/stone-wall2.png diff --git a/core/assets-raw/sprites/blocks/environment/tar.png b/core/assets-raw/sprites/blocks/environment/tar.png index 8ad3f8ec68..d959f6df4b 100644 Binary files a/core/assets-raw/sprites/blocks/environment/tar.png and b/core/assets-raw/sprites/blocks/environment/tar.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/liquid-tank-bottom.png b/core/assets-raw/sprites/blocks/liquid/liquid-tank-bottom.png index a94e604467..4e33a6bfba 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/liquid-tank-bottom.png and b/core/assets-raw/sprites/blocks/liquid/liquid-tank-bottom.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png b/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png index 85533fef2f..961a9f82c7 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png and b/core/assets-raw/sprites/blocks/liquid/liquid-tank-liquid.png differ diff --git a/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.png b/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.png index 255c710915..c1c36e33be 100644 Binary files a/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.png and b/core/assets-raw/sprites/blocks/liquid/liquid-tank-top.png differ diff --git a/core/assets-raw/sprites/blocks/logic/large-logic-display.png b/core/assets-raw/sprites/blocks/logic/large-logic-display.png new file mode 100644 index 0000000000..fb10d438bb Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/large-logic-display.png differ diff --git a/core/assets-raw/sprites/blocks/logic/memory-bank.png b/core/assets-raw/sprites/blocks/logic/memory-bank.png new file mode 100644 index 0000000000..59bd139f2d Binary files /dev/null and b/core/assets-raw/sprites/blocks/logic/memory-bank.png differ diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-cap.png b/core/assets-raw/sprites/blocks/power/steam-generator-cap.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-cap.png rename to core/assets-raw/sprites/blocks/power/steam-generator-cap.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-liquid.png b/core/assets-raw/sprites/blocks/power/steam-generator-liquid.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-liquid.png rename to core/assets-raw/sprites/blocks/power/steam-generator-liquid.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-top.png b/core/assets-raw/sprites/blocks/power/steam-generator-top.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-top.png rename to core/assets-raw/sprites/blocks/power/steam-generator-top.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-turbine0.png b/core/assets-raw/sprites/blocks/power/steam-generator-turbine0.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-turbine0.png rename to core/assets-raw/sprites/blocks/power/steam-generator-turbine0.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-turbine1.png b/core/assets-raw/sprites/blocks/power/steam-generator-turbine1.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator-turbine1.png rename to core/assets-raw/sprites/blocks/power/steam-generator-turbine1.png diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator.png b/core/assets-raw/sprites/blocks/power/steam-generator.png similarity index 100% rename from core/assets-raw/sprites/blocks/power/turbine-generator.png rename to core/assets-raw/sprites/blocks/power/steam-generator.png diff --git a/core/assets-raw/sprites/blocks/production/cryofluidmixer-top.png b/core/assets-raw/sprites/blocks/production/cryofluidmixer-top.png index e90db33565..3bb5abe3cb 100644 Binary files a/core/assets-raw/sprites/blocks/production/cryofluidmixer-top.png and b/core/assets-raw/sprites/blocks/production/cryofluidmixer-top.png differ diff --git a/core/assets-raw/sprites/blocks/production/phase-weaver.png b/core/assets-raw/sprites/blocks/production/phase-weaver.png index 4cbda78f1b..282d9bcd6a 100644 Binary files a/core/assets-raw/sprites/blocks/production/phase-weaver.png and b/core/assets-raw/sprites/blocks/production/phase-weaver.png differ diff --git a/core/assets-raw/sprites/blocks/props/rock1.png b/core/assets-raw/sprites/blocks/props/boulder1.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/rock1.png rename to core/assets-raw/sprites/blocks/props/boulder1.png diff --git a/core/assets-raw/sprites/blocks/props/rock2.png b/core/assets-raw/sprites/blocks/props/boulder2.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/rock2.png rename to core/assets-raw/sprites/blocks/props/boulder2.png diff --git a/core/assets-raw/sprites/blocks/props/dacite-boulder1.png b/core/assets-raw/sprites/blocks/props/dacite-boulder1.png new file mode 100644 index 0000000000..ffddeef34b Binary files /dev/null and b/core/assets-raw/sprites/blocks/props/dacite-boulder1.png differ diff --git a/core/assets-raw/sprites/blocks/props/dacite-boulder2.png b/core/assets-raw/sprites/blocks/props/dacite-boulder2.png new file mode 100644 index 0000000000..aa258941cd Binary files /dev/null and b/core/assets-raw/sprites/blocks/props/dacite-boulder2.png differ diff --git a/core/assets-raw/sprites/blocks/props/snowrock1.png b/core/assets-raw/sprites/blocks/props/snow-boulder1.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/snowrock1.png rename to core/assets-raw/sprites/blocks/props/snow-boulder1.png diff --git a/core/assets-raw/sprites/blocks/props/snowrock2.png b/core/assets-raw/sprites/blocks/props/snow-boulder2.png similarity index 100% rename from core/assets-raw/sprites/blocks/props/snowrock2.png rename to core/assets-raw/sprites/blocks/props/snow-boulder2.png diff --git a/core/assets-raw/sprites/blocks/storage/container-team.png b/core/assets-raw/sprites/blocks/storage/container-team.png new file mode 100644 index 0000000000..5ee1dd3226 Binary files /dev/null and b/core/assets-raw/sprites/blocks/storage/container-team.png differ diff --git a/core/assets-raw/sprites/blocks/storage/container.png b/core/assets-raw/sprites/blocks/storage/container.png index 368cec3a21..959e2b6edf 100644 Binary files a/core/assets-raw/sprites/blocks/storage/container.png and b/core/assets-raw/sprites/blocks/storage/container.png differ diff --git a/core/assets-raw/sprites/blocks/storage/vault-team.png b/core/assets-raw/sprites/blocks/storage/vault-team.png new file mode 100644 index 0000000000..0ce6a50222 Binary files /dev/null and b/core/assets-raw/sprites/blocks/storage/vault-team.png differ diff --git a/core/assets-raw/sprites/blocks/storage/vault.png b/core/assets-raw/sprites/blocks/storage/vault.png index 38f46d97aa..36a4ee5ea5 100644 Binary files a/core/assets-raw/sprites/blocks/storage/vault.png and b/core/assets-raw/sprites/blocks/storage/vault.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/cyclone.png b/core/assets-raw/sprites/blocks/turrets/cyclone.png index 7e1ae002b1..a0e34e20e7 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/cyclone.png and b/core/assets-raw/sprites/blocks/turrets/cyclone.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/fuse.png b/core/assets-raw/sprites/blocks/turrets/fuse.png index 7322029f77..61ff3c7b2d 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/fuse.png and b/core/assets-raw/sprites/blocks/turrets/fuse.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/lancer.png b/core/assets-raw/sprites/blocks/turrets/lancer.png index d3bbc2d909..e119639eb5 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/lancer.png and b/core/assets-raw/sprites/blocks/turrets/lancer.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/swarmer.png b/core/assets-raw/sprites/blocks/turrets/swarmer.png index c8c5cd54cf..6f98a1ba7a 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/swarmer.png and b/core/assets-raw/sprites/blocks/turrets/swarmer.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/wave-top.png b/core/assets-raw/sprites/blocks/turrets/wave-top.png new file mode 100644 index 0000000000..66f9939101 Binary files /dev/null and b/core/assets-raw/sprites/blocks/turrets/wave-top.png differ diff --git a/core/assets-raw/sprites/blocks/turrets/wave.png b/core/assets-raw/sprites/blocks/turrets/wave.png index f7823cc437..e557fa43b2 100644 Binary files a/core/assets-raw/sprites/blocks/turrets/wave.png and b/core/assets-raw/sprites/blocks/turrets/wave.png differ diff --git a/core/assets-raw/sprites/blocks/units/command-center-team.png b/core/assets-raw/sprites/blocks/units/command-center-team.png new file mode 100644 index 0000000000..b9d27f73c9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/command-center-team.png differ diff --git a/core/assets-raw/sprites/blocks/units/command-center.png b/core/assets-raw/sprites/blocks/units/command-center.png index 1a829c1cfd..a0de4888a9 100644 Binary files a/core/assets-raw/sprites/blocks/units/command-center.png and b/core/assets-raw/sprites/blocks/units/command-center.png differ diff --git a/core/assets-raw/sprites/blocks/walls/copper-wall-large.png b/core/assets-raw/sprites/blocks/walls/copper-wall-large.png index dbc59dd808..00e890dabc 100644 Binary files a/core/assets-raw/sprites/blocks/walls/copper-wall-large.png and b/core/assets-raw/sprites/blocks/walls/copper-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/walls/surge-wall-large.png b/core/assets-raw/sprites/blocks/walls/surge-wall-large.png index 285cfb52e8..e0cc1b8b86 100644 Binary files a/core/assets-raw/sprites/blocks/walls/surge-wall-large.png and b/core/assets-raw/sprites/blocks/walls/surge-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/walls/surge-wall.png b/core/assets-raw/sprites/blocks/walls/surge-wall.png index 786ea64867..8dd6798b02 100644 Binary files a/core/assets-raw/sprites/blocks/walls/surge-wall.png and b/core/assets-raw/sprites/blocks/walls/surge-wall.png differ diff --git a/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png b/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png index 80564101f8..ef8f313f09 100644 Binary files a/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png and b/core/assets-raw/sprites/blocks/walls/thorium-wall-large.png differ diff --git a/core/assets-raw/sprites/blocks/walls/thorium-wall.png b/core/assets-raw/sprites/blocks/walls/thorium-wall.png index 4fb0aaf1da..deb9edeea0 100644 Binary files a/core/assets-raw/sprites/blocks/walls/thorium-wall.png and b/core/assets-raw/sprites/blocks/walls/thorium-wall.png differ diff --git a/core/assets-raw/sprites/blocks/walls/titanium-wall-large.png b/core/assets-raw/sprites/blocks/walls/titanium-wall-large.png index 2bf8ad2aec..9242df7d20 100644 Binary files a/core/assets-raw/sprites/blocks/walls/titanium-wall-large.png and b/core/assets-raw/sprites/blocks/walls/titanium-wall-large.png differ diff --git a/core/assets-raw/sprites/effects/large-bomb-back.png b/core/assets-raw/sprites/effects/large-bomb-back.png new file mode 100644 index 0000000000..7a7b643de6 Binary files /dev/null and b/core/assets-raw/sprites/effects/large-bomb-back.png differ diff --git a/core/assets-raw/sprites/effects/large-bomb.png b/core/assets-raw/sprites/effects/large-bomb.png new file mode 100644 index 0000000000..e670244c35 Binary files /dev/null and b/core/assets-raw/sprites/effects/large-bomb.png differ diff --git a/core/assets-raw/sprites/ui/button-right-disabled.9.png b/core/assets-raw/sprites/ui/button-right-disabled.9.png new file mode 100644 index 0000000000..4201ec590a Binary files /dev/null and b/core/assets-raw/sprites/ui/button-right-disabled.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right-down.9.png b/core/assets-raw/sprites/ui/button-right-down.9.png index 00b41dabe4..e0f26e84af 100644 Binary files a/core/assets-raw/sprites/ui/button-right-down.9.png and b/core/assets-raw/sprites/ui/button-right-down.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right-over.9.png b/core/assets-raw/sprites/ui/button-right-over.9.png index a8f83eee16..af7f6d1d6d 100644 Binary files a/core/assets-raw/sprites/ui/button-right-over.9.png and b/core/assets-raw/sprites/ui/button-right-over.9.png differ diff --git a/core/assets-raw/sprites/ui/button-right.9.png b/core/assets-raw/sprites/ui/button-right.9.png index e43fe0c11c..2fd7ee856d 100644 Binary files a/core/assets-raw/sprites/ui/button-right.9.png and b/core/assets-raw/sprites/ui/button-right.9.png differ diff --git a/core/assets-raw/sprites/ui/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/beta.png b/core/assets-raw/sprites/units/beta.png index b1bca129e6..5bba30659e 100644 Binary files a/core/assets-raw/sprites/units/beta.png and b/core/assets-raw/sprites/units/beta.png differ diff --git a/core/assets-raw/sprites/units/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/corvus-base.png b/core/assets-raw/sprites/units/corvus-base.png new file mode 100644 index 0000000000..448484ab53 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-base.png differ diff --git a/core/assets-raw/sprites/units/corvus-cell.png b/core/assets-raw/sprites/units/corvus-cell.png new file mode 100644 index 0000000000..a0be843703 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-cell.png differ diff --git a/core/assets-raw/sprites/units/corvus-foot.png b/core/assets-raw/sprites/units/corvus-foot.png new file mode 100644 index 0000000000..3dcb61c7fc Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-foot.png differ diff --git a/core/assets-raw/sprites/units/corvus-joint-base.png b/core/assets-raw/sprites/units/corvus-joint-base.png new file mode 100644 index 0000000000..921a27e55c Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-joint-base.png differ diff --git a/core/assets-raw/sprites/units/corvus-joint.png b/core/assets-raw/sprites/units/corvus-joint.png new file mode 100644 index 0000000000..2a83e1f3bc Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-joint.png differ diff --git a/core/assets-raw/sprites/units/corvus-leg-base.png b/core/assets-raw/sprites/units/corvus-leg-base.png new file mode 100644 index 0000000000..07d18a1a44 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-leg-base.png differ diff --git a/core/assets-raw/sprites/units/corvus-leg.png b/core/assets-raw/sprites/units/corvus-leg.png new file mode 100644 index 0000000000..581dc52032 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-leg.png differ diff --git a/core/assets-raw/sprites/units/corvus-weapon-heat.png b/core/assets-raw/sprites/units/corvus-weapon-heat.png new file mode 100644 index 0000000000..6ea3ffe1e7 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus-weapon-heat.png differ diff --git a/core/assets-raw/sprites/units/corvus.png b/core/assets-raw/sprites/units/corvus.png new file mode 100644 index 0000000000..59c20e2566 Binary files /dev/null and b/core/assets-raw/sprites/units/corvus.png differ diff --git a/core/assets-raw/sprites/units/dagger-leg.png b/core/assets-raw/sprites/units/dagger-leg.png index f67d4257cf..d27c010dbc 100644 Binary files a/core/assets-raw/sprites/units/dagger-leg.png and b/core/assets-raw/sprites/units/dagger-leg.png differ diff --git a/core/assets-raw/sprites/units/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/gamma.png b/core/assets-raw/sprites/units/gamma.png index bbc3c7a57a..c603be37d1 100644 Binary files a/core/assets-raw/sprites/units/gamma.png and b/core/assets-raw/sprites/units/gamma.png differ diff --git a/core/assets-raw/sprites/units/mace-leg.png b/core/assets-raw/sprites/units/mace-leg.png index 82aba38b82..bb1b501dfa 100644 Binary files a/core/assets-raw/sprites/units/mace-leg.png and b/core/assets-raw/sprites/units/mace-leg.png differ diff --git a/core/assets-raw/sprites/units/mega.png b/core/assets-raw/sprites/units/mega.png index 9fdade2d20..3cbd6cc822 100644 Binary files a/core/assets-raw/sprites/units/mega.png and b/core/assets-raw/sprites/units/mega.png differ diff --git a/core/assets-raw/sprites/units/minke.png b/core/assets-raw/sprites/units/minke.png index 99079defd5..32ec1fadfe 100644 Binary files a/core/assets-raw/sprites/units/minke.png and b/core/assets-raw/sprites/units/minke.png differ diff --git a/core/assets-raw/sprites/units/oct-cell.png b/core/assets-raw/sprites/units/oct-cell.png new file mode 100644 index 0000000000..436242ed95 Binary files /dev/null and b/core/assets-raw/sprites/units/oct-cell.png differ diff --git a/core/assets-raw/sprites/units/oct.png b/core/assets-raw/sprites/units/oct.png new file mode 100644 index 0000000000..067ebb857b Binary files /dev/null and b/core/assets-raw/sprites/units/oct.png differ diff --git a/core/assets-raw/sprites/units/omura-cannon-heat.png b/core/assets-raw/sprites/units/omura-cannon-heat.png new file mode 100644 index 0000000000..5e2b0dc212 Binary files /dev/null and b/core/assets-raw/sprites/units/omura-cannon-heat.png differ diff --git a/core/assets-raw/sprites/units/omura-cell.png b/core/assets-raw/sprites/units/omura-cell.png new file mode 100644 index 0000000000..504824b015 Binary files /dev/null and b/core/assets-raw/sprites/units/omura-cell.png differ diff --git a/core/assets-raw/sprites/units/omura.png b/core/assets-raw/sprites/units/omura.png new file mode 100644 index 0000000000..02befddd78 Binary files /dev/null and b/core/assets-raw/sprites/units/omura.png differ diff --git a/core/assets-raw/sprites/units/pulsar.png b/core/assets-raw/sprites/units/pulsar.png index eb49cd3751..af014df891 100644 Binary files a/core/assets-raw/sprites/units/pulsar.png and b/core/assets-raw/sprites/units/pulsar.png differ diff --git a/core/assets-raw/sprites/units/quad-cell.png b/core/assets-raw/sprites/units/quad-cell.png new file mode 100644 index 0000000000..13222f495b Binary files /dev/null and b/core/assets-raw/sprites/units/quad-cell.png differ diff --git a/core/assets-raw/sprites/units/quad.png b/core/assets-raw/sprites/units/quad.png new file mode 100644 index 0000000000..95435c1f38 Binary files /dev/null and b/core/assets-raw/sprites/units/quad.png differ diff --git a/core/assets-raw/sprites/units/reign-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/sei-cell.png b/core/assets-raw/sprites/units/sei-cell.png new file mode 100644 index 0000000000..c440ce3ee6 Binary files /dev/null and b/core/assets-raw/sprites/units/sei-cell.png differ diff --git a/core/assets-raw/sprites/units/sei.png b/core/assets-raw/sprites/units/sei.png new file mode 100644 index 0000000000..724fe9559b Binary files /dev/null and b/core/assets-raw/sprites/units/sei.png differ diff --git a/core/assets-raw/sprites/units/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/vela-base.png b/core/assets-raw/sprites/units/vela-base.png new file mode 100644 index 0000000000..1ec4aac230 Binary files /dev/null and b/core/assets-raw/sprites/units/vela-base.png differ diff --git a/core/assets-raw/sprites/units/vela-cell.png b/core/assets-raw/sprites/units/vela-cell.png new file mode 100644 index 0000000000..595fbce8be Binary files /dev/null and b/core/assets-raw/sprites/units/vela-cell.png differ diff --git a/core/assets-raw/sprites/units/vela-leg.png b/core/assets-raw/sprites/units/vela-leg.png new file mode 100644 index 0000000000..80e25079bf Binary files /dev/null and b/core/assets-raw/sprites/units/vela-leg.png differ diff --git a/core/assets-raw/sprites/units/vela-weapon-heat.png b/core/assets-raw/sprites/units/vela-weapon-heat.png new file mode 100644 index 0000000000..68e264c5d3 Binary files /dev/null and b/core/assets-raw/sprites/units/vela-weapon-heat.png differ diff --git a/core/assets-raw/sprites/units/vela.png b/core/assets-raw/sprites/units/vela.png new file mode 100644 index 0000000000..db1fdbb9c7 Binary files /dev/null and b/core/assets-raw/sprites/units/vela.png differ diff --git a/core/assets-raw/sprites/units/weapons/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/heal-shotgun-weapon.png b/core/assets-raw/sprites/units/weapons/heal-shotgun-weapon.png index 5b85b778a7..a519b8e8c0 100644 Binary files a/core/assets-raw/sprites/units/weapons/heal-shotgun-weapon.png and b/core/assets-raw/sprites/units/weapons/heal-shotgun-weapon.png differ diff --git a/core/assets-raw/sprites/units/weapons/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/omura-cannon-heat.png b/core/assets-raw/sprites/units/weapons/omura-cannon-heat.png new file mode 100644 index 0000000000..c3c0d6378c Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/omura-cannon-heat.png differ diff --git a/core/assets-raw/sprites/units/weapons/omura-cannon.png b/core/assets-raw/sprites/units/weapons/omura-cannon.png new file mode 100644 index 0000000000..e751f29572 Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/omura-cannon.png differ diff --git a/core/assets-raw/sprites/units/weapons/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-raw/sprites/units/weapons/sei-launcher.png b/core/assets-raw/sprites/units/weapons/sei-launcher.png new file mode 100644 index 0000000000..0b1e0b1932 Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/sei-launcher.png differ diff --git a/core/assets/baseparts/1591385575600.msch b/core/assets/baseparts/1591385575600.msch index a086e7d8a2..597351c682 100644 Binary files a/core/assets/baseparts/1591385575600.msch and b/core/assets/baseparts/1591385575600.msch differ diff --git a/core/assets/baseparts/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 56f21ac68e..d308127f39 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -20,6 +20,8 @@ gameover = Game Over gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]New highscore! copied = Copied. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sounds load.map = Maps @@ -53,6 +55,7 @@ schematic.saved = Schematic saved. schematic.delete.confirm = This schematic will be utterly eradicated. schematic.rename = Rename Schematic schematic.info = {0}x{1}, {2} blocks +schematic.disabled = [scarlet]Schematics disabled[]\nYou are not allowed to use schematics on this [accent]map[] or [accent]server. stat.wave = Waves Defeated:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} @@ -113,6 +116,7 @@ mod.disable = Disable mod.content = Content: mod.delete.error = Unable to delete mod. File may be in use. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -136,6 +140,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 +176,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 @@ -467,16 +473,9 @@ requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} requirement.research = Research {0} requirement.capture = Capture {0} -resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} -#TODO fix/remove this -launch = < LAUNCH > launch.text = Launch -launch.title = Launch Successful -launch.next = [lightgray]next opportunity at wave {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] -launch.confirm = This will launch all resources in your core.\nYou will not be able to return to this base. -launch.skip.confirm = If you skip now, you will not be able to launch until later waves. +campaign.multiplayer = While playing multiplayer in campaign, you can only research using items from [accent]your[] sectors, [scarlet]not[] the host's sector that you are on right now.\n\nTo get items to [accent]your[] sectors in multiplayer, use a [accent]launch pad[]. uncover = Uncover configure = Configure Loadout #TODO @@ -484,6 +483,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} @@ -505,6 +505,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + #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,6 +587,7 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Size +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range blocks.linkrange = Link Range @@ -581,6 +596,7 @@ blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage blocks.itemcapacity = Item Capacity +blocks.memorycapacity = Memory Capacity blocks.basepowergeneration = Base Power Generation blocks.productiontime = Production Time blocks.repairtime = Block Full Repair Time @@ -598,6 +614,8 @@ blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -640,9 +658,12 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees unit.seconds = seconds +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil @@ -770,6 +791,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -801,9 +825,11 @@ mode.custom = Custom Rules rules.infiniteresources = Infinite Resources rules.reactorexplosions = Reactor Explosions +rules.schematic = Schematics Allowed rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -825,8 +851,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 @@ -852,9 +882,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Speed: {0} unit.weapon = [lightgray]Weapon: {0} @@ -878,6 +910,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 @@ -886,34 +919,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -941,13 +983,17 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -963,10 +1009,9 @@ block.dark-panel-4.name = Dark Panel 4 block.dark-panel-5.name = Dark Panel 5 block.dark-panel-6.name = Dark Panel 6 block.dark-metal.name = Dark Metal -block.ignarock.name = Igna Rock +block.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -1015,7 +1060,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 @@ -1096,7 +1141,9 @@ block.micro-processor.name = Micro Processor block.logic-processor.name = Logic Processor block.hyper-processor.name = Hyper Processor block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display block.memory-cell.name = Memory Cell +block.memory-bank.name = Memory Bank team.blue.name = blue team.crux.name = red @@ -1223,7 +1270,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..daeeb0e525 100644 --- a/core/assets/bundles/bundle_be.properties +++ b/core/assets/bundles/bundle_be.properties @@ -20,6 +20,8 @@ gameover = Гульня скончана gameover.pvp = [accent]{0}[] каманда перамагла! highscore = [accent]Новы рэкорд! copied = Скапіявана. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Звукі load.map = Карты @@ -63,8 +65,7 @@ stat.delivered = Рэсурсаў запушчана: stat.playtime = Час гульні:[accent] {0} stat.rank = Фінальны ранг: [accent]{0} -launcheditems = [accent]Запушчаныя прадметы -launchinfo = [unlaunched]Націсніце на кнопку [ЗАПУСК], каб атрымаць прадметы, якія адзначаны сінім колера. +globalitems = [accent]Global Items map.delete = Вы сапраўды хочаце выдаліць карту «[accent]{0}[]»? level.highscore = Рэкорд: [accent]{0} level.select = Выбар карты @@ -114,6 +115,7 @@ mod.disable = Выкл. mod.content = Content: mod.delete.error = Немагчыма выдаліць мадыфікацыю. Магчыма, файл выкарыстоўваецца. mod.requiresversion = [scarlet]Мінімальная патрабаваная версія гульні: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Не знойдзены бацькоўскія мадыфікацыі: {0} mod.erroredcontent = [scarlet]Памылкі змесціва mod.errors = Памылкі былі выкліканыя загружаным змесцівам. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Аб гульні name = Імя: noname = Для пачатку, прыдумайце[accent] сабе iмя[]. +planetmap = Planet Map +launchcore = Launch Core filename = Iмя файла: unlocked = Новы кантэнт адмыкнуты! completed = [accent]Завершаны @@ -144,6 +148,7 @@ techtree = Дрэва\n тэхналогій research.list = [lightgray]Дасьледуйце: research = Даследаваць researched = [lightgray] {0} даследавана. +research.progress = {0}% complete players = Гульцоў: {0} players.single = {0} гулец players.search = search @@ -340,6 +345,11 @@ waves.load = Загрузіць з буфера абмену waves.invalid = Няслушныя хвалі ў буферы абмену. waves.copied = Хвалі скапіяваныя. waves.none = Ворагі не былі вызначаныя. \nЗвярнiце ўвагу, што пустыя хвалі будуць аўтаматычна замененыя звычайнай хваляй. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]<Па змаўчанні> details = Падрабязнасці... edit = Рэдагаваць... @@ -459,7 +469,8 @@ locked = Блякаваны complete = [lightgray]Выканаць: requirement.wave = дасягнем {0} хвалі ў зоне {1} requirement.core = Знішчыце варожае ядро ​​ў зоне {0} -requirement.unlock = разблакуюцца {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Аднавіць зону: \n[lightgray] {0} bestwave = [lightgray]Лепшая хваля: {0} launch = <Запуск> @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Забароненыя блокі addall = Дадаць всё +launch.destination = Destination: {0} configure.invalid = Колькасць павінна быць лікам паміж 0 і {0}. zone.unlocked = Зона «[lightgray] {0}» зараз адмыкнутая. zone.requirement.complete = Умовы для зоны «{0}» выкананы: [lightgray] \n {1} @@ -496,6 +508,20 @@ error.io = Сеткавая памылка ўводу-высновы. error.any = Невядомая сеткавая памылка. error.bloom = Не атрымалася ініцыялізаваць свячэнне (Bloom). \nМагчыма, зараз Вашая прылада не падтрымлівае яго. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Графіка settings.cleardata = Ачысціць гульнявыя дадзеныя... settings.clear.confirm = Вы сапраўды хочаце ачысціць свае дадзеныя? \nГэта нельга адмяніць! settings.clearall.confirm = [scarlet] АСЦЯРОЖНА![] \nГэта сатрэ ўсе дадзеныя, уключаючы захавання, карты, прагрэс кампаніі і налады кіравання. \nПосле таго як Вы націснеце [accent] [ОК][], гульня знішчыць усе дадзеныя і аўтаматычна зачыніцца. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent] <Паўза> clear = Ачысціць banned = [scarlet] Забаронена @@ -557,8 +585,11 @@ blocks.itemsmoved = Хуткасць перамяшчэння blocks.launchtime = Інтэрвал запускаў blocks.shootrange = Радыус дзеяння blocks.size = Памер +blocks.displaysize = Display Size blocks.liquidcapacity = Умяшчальнасць вадкасці blocks.powerrange = Далёкасць перадачы энергіі +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Колькасць злучэнняў blocks.poweruse = Спажывае энергіі blocks.powerdamage = Энергія/страты @@ -574,11 +605,14 @@ blocks.boosteffect = паскараўся эфект blocks.maxunits = Максімальная колькасць актыўных адзінак blocks.health = Здароўе blocks.buildtime = Час будаўніцтва +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Кошт будаўніцтва blocks.inaccuracy = Роскід blocks.shots = Стрэлы blocks.reload = Стрэлы/секунду blocks.ammo = Боепрыпасы +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Патрабуецца свідар лепей bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = вадкасных адзінак unit.powerunits = энерг. адзінак unit.degrees = град. unit.seconds = сек. +unit.minutes = mins unit.persecond = /сек +unit.perminute = /min unit.timesspeed = x хуткасць unit.percent = % +unit.shieldhealth = shield health unit.items = прадметаў unit.thousands = Тыс. unit.millions = М. +unit.billions = b category.general = Асноўныя category.power = Энергія category.liquids = Вадкасці @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Атакаваць command.rally = Кропка збору command.retreat = Адступіць +command.idle = Idle placement.blockselectkeys = \n[lightgray]Клавіша: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Рух па восі X keybind.move_y.name = Рух па восі Y keybind.mouse_move.name = наследуе курсорам +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Абраць вобласць keybind.schematic_menu.name = Меню схем @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Дыяганальнае размяшчэнн keybind.pick.name = Абраць блок keybind.break_block.name = Разбурыць блок keybind.deselect.name = Зняць вылучэнне +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Стрэл keybind.zoom.name = Маштабаванне keybind.menu.name = Меню @@ -782,6 +825,7 @@ rules.reactorexplosions = Выбухі рэактараў rules.wavetimer = Інтэрвал хваляў rules.waves = Хвалі rules.attack = Рэжым атакі +rules.buildai = AI Building rules.enemyCheat = Бясконцыя рэсурсы ІІ (чырвоная каманда) rules.blockhealthmultiplier = Множнік здароўя блокаў rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Баёў. адз. rules.title.experimental = эксперыментальнай rules.title.environment = Environment rules.lighting = Асвятленне +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Навакольны свет -rules.solarpowermultiplier = Множнік сонечнай энергіі +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Рэчывы content.liquid.name = Вадкасці @@ -830,9 +878,11 @@ liquid.water.name = Вада liquid.slag.name = Шлак liquid.oil.name = Нафта liquid.cryofluid.name = Крыягенная вадкасць + item.explosiveness = [lightgray]Выбуханебяспека: {0}% item.flammability = [lightgray]Узгаральнасць: {0}% item.radioactivity = [lightgray]Радыёактыўнасць: {0}% + unit.health = [lightgray]Здароўе: {0} unit.speed = [lightgray]Хуткасць: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Камікадзэ unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Скала block.sand-boulder.name = Пяшчаны валун block.grass.name = Трава block.slag.name = Шлак block.salt.name = Соль -block.saltrocks.name = Саляныя камяні +block.salt-wall.name = Salt Wall block.pebbles.name = Галька block.tendrils.name = Споравыя вусікі -block.sandrocks.name = Пяшчаныя камяні +block.sand-wall.name = Sand Wall block.spore-pine.name = Спорава хвоя -block.sporerocks.name = Споравыя камяні -block.rock.name = Каменны валун -block.snowrock.name = Заснежаны валун +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Заснежаная хвоя block.shale.name = Сланец block.shale-boulder.name = Сланцавы валун block.moss.name = Мох block.shrubs.name = Кусты block.spore-moss.name = Спорава мох -block.shalerocks.name = Сланцавыя камяні +block.shale-wall.name = Shale Wall block.scrap-wall.name = Сцяна з металалому block.scrap-wall-large.name = Вялікая сцяна з металалому block.scrap-wall-huge.name = Велізарная сцяна з металалому @@ -919,13 +979,17 @@ block.craters.name = Кратэры block.sand-water.name = Пясок з вадой block.darksand-water.name = Тёмный пясок з вадой block.char.name = Выпаленая зямля -block.holostone.name = Галаграфічны камень +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Заснежаны лёд -block.rocks.name = Камяні -block.icerocks.name = Ледзяныя камяні -block.snowrocks.name = Снежныя камяні -block.dunerocks.name = Цёмныя пясчаныя камяні +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Сасна +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Мёртвае белае дрэва block.white-tree.name = Белае дрэва block.spore-cluster.name = Навала спрэчка @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Цёмная панэль 4 block.dark-panel-5.name = Цёмная панэль 5 block.dark-panel-6.name = Цёмная панэль 6 block.dark-metal.name = Цёмны метал -block.ignarock.name = Абпечаны камень +block.basalt.name = Basalt block.hotrock.name = Гарачы камень block.magmarock.name = Магмавы камень -block.cliffs.name = Скалы block.copper-wall.name = Медная сцяна block.copper-wall-large.name = Вялікая медная сцяна block.titanium-wall.name = Тытанавая сцяна @@ -993,7 +1056,7 @@ block.diode.name = Дыёд block.battery.name = Акумулятар block.battery-large.name = Вялікі акумулятар block.combustion-generator.name = Генератар ўнутранага згарання -block.turbine-generator.name = Паравы генератар +block.steam-generator.name = Паравы генератар block.differential-generator.name = Дыферэнцыяльны генератар block.impact-reactor.name = Імпульсны рэактар block.mechanical-drill.name = Механічны бур @@ -1055,6 +1118,7 @@ block.container.name = Кантэйнер block.launch-pad.name = Пускавая пляцоўка block.launch-pad-large.name = Вялікая пускавая пляцоўка block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Сіняя team.crux.name = Чырвоная team.sharded.name = Аскепакавая @@ -1192,7 +1265,7 @@ block.battery.description = Назапашвае энергію як буфер block.battery-large.description = Захоўвае значна больш энергіі, чым звычайны акумулятар. block.combustion-generator.description = вырабленай энергіі шляхам спальвання лёгкаўзгаральных матэрыялаў, такіх як вугаль. block.thermal-generator.description = Генеруе энергію, калі знаходзіцца ў гарачых месцах. -block.turbine-generator.description = Удасканалены генератар згарання. Больш эфектыўны, але дадаткова патрабуе ваду для выпрацоўкі пары. +block.steam-generator.description = Удасканалены генератар згарання. Больш эфектыўны, але дадаткова патрабуе ваду для выпрацоўкі пары. block.differential-generator.description = Генеруе вялікая колькасць энергіі. Выкарыстоўвае розніцу тэмператур паміж крыягеннай вадкасцю і падпаленым пиротитом. block.rtg-generator.description = Просты, надзейны генератар. Выкарыстоўвае цяпло распадаюцца радыеактыўных злучэнняў для вытворчасці энергіі з нізкай хуткасцю. block.solar-panel.description = Забяспечвае невялікая колькасць энергіі ад сонца. diff --git a/core/assets/bundles/bundle_cs.properties b/core/assets/bundles/bundle_cs.properties index 18d6b667e3..a946de85ed 100644 --- a/core/assets/bundles/bundle_cs.properties +++ b/core/assets/bundles/bundle_cs.properties @@ -12,7 +12,7 @@ link.itch.io.description = Stránka na itch.io s odkazy na stažení hry link.google-play.description = Obchod Google Play link.f-droid.description = Katalog F-Droid link.wiki.description = Oficiální Wiki Mindustry -link.suggestions.description = Navrhni něco nového do hry! +link.suggestions.description = Suggest new features linkfail = Nepodařilo se otevřít odkaz!\nAdresa URL byla zkopírována do schránky. screenshot = Snímek obrazovky uložen {0} screenshot.invalid = Mapa je moc velká, nemusí být dost paměti pro získání snímku obrazovky. @@ -20,6 +20,8 @@ gameover = Konec hry gameover.pvp = Vyhrál tým [accent]{0}[]! highscore = [accent]Nový rekord! copied = Zkopírováno. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = Tato část hry ještě není připravena load.sound = Zvuky load.map = Mapy @@ -63,8 +65,7 @@ stat.delivered = Materiálu vysláno: stat.playtime = Odehraný čas: [accent]{0}[] stat.rank = Celková známka: [accent]{0}[] -launcheditems = [accent]Získané předměty[] -launchinfo = [unlaunched]Je třeba vyslat zpět Tvé jádro, abys získal věci vyznačené modře.[] +globalitems = [accent]Celkové položky[] map.delete = Jsi si jistý, že chceš smazat mapu "[accent]{0}[]"? level.highscore = Nejvyšší skóre: [accent]{0}[] level.select = Výběr úrovně @@ -106,7 +107,7 @@ mods.guide = Průvodce modifikacemi mods.report = Nahlásit závadu mods.openfolder = Otevřít složku s modifikacemi mods.reload = Znovu načíst -mods.reloadexit = The game will now exit, to reload mods. +mods.reloadexit = Hra bude nyní ukončena, aby si znovu načetla modifikace. mod.display = [gray]Modifikace:[][orange] {0}[] mod.enabled = [lightgray]Povoleno[] mod.disabled = [scarlet]Zakázáno[] @@ -114,6 +115,7 @@ mod.disable = Zakázat mod.content = Obsah: mod.delete.error = Nebylo možnost smazat modifikaci. Soubor může být používán. mod.requiresversion = [scarlet]Minimální požadovaná verze hry: [accent]{0}[] +mod.outdated = [scarlet]Nekompatibilní s V6 (chybí minGameVersion: 105) mod.missingdependencies = [scarlet]Chybějící závislosti: {0}[] mod.erroredcontent = [scarlet]V obsahu jsou chyby[] mod.errors = Při načítání obsahu hry se vyskytly problémy. @@ -125,7 +127,7 @@ mod.reloadrequired = [scarlet]Je vyžadováno znovuspuštění hry. mod.import = Importovat modifikaci mod.import.file = Importovat soubor mod.import.github = Import modifikace z GitHubu -mod.jarwarn = [scarlet]JAR mods are inherently unsafe.[]\nMake sure you're importing this mod from a trustworthy source! +mod.jarwarn = [scarlet]JAR modifikace jsou z podstaty nebezpečné.[]Ujisti se, že je importuješ z důvěryhodného zdroje! mod.item.remove = Tato položka je součástí [accent]'{0}'[] modifikace. Pokud ji chcete odstranit, odinstalujte tuto modifikaci. mod.remove.confirm = Tato modifikace bude odstraněna. mod.author = [lightgray]Autor:[] {0} @@ -137,6 +139,8 @@ mod.scripts.disable = Tvoje zařízení nepodporuje skripty. Musíš zakázat ty about.button = O hře name = Jméno: noname = Nejdřív si vyber [accent]jméno ve hře[]. +planetmap = Planetární mapa +launchcore = Vyslat jádro filename = Název souboru: unlocked = Byl odemmknut nový blok! completed = [accent]Dokončeno[] @@ -144,6 +148,7 @@ techtree = Technologie research.list = [lightgray]Výzkum:[] research = Výzkum researched = Dokončen výzkum technologie: [lightgray]{0}[]. +research.progress = {0}% dokončeno players = Hráčů: {0} players.single = Hráč: {0} players.search = hledat @@ -198,8 +203,8 @@ server.admins.none = Žádní správci nebyli nalezeni. server.add = Přidat server server.delete = Jsi si jistý, že chceš smazat tento server? server.edit = Upravit server -server.outdated = [crimson]Zastaralá verze serveru![] -server.outdated.client = [crimson]Zastaralá verze klienta![] +server.outdated = [scarlet]Zastaralá verze serveru![] +server.outdated.client = [scarlet]Zastaralá verze klienta![] server.version = [gray]Verze: {0} {1}[] server.custombuild = [accent]Upravená verze hry[] confirmban = Jsi si jistý, že chceš zakázat hráče "{0}[white]"?[] @@ -221,7 +226,7 @@ connecting.data = [accent]Načítám data ze serveru...[] server.port = Port: server.addressinuse = Adresu již někdo používá! server.invalidport = Neplatné číslo portu! -server.error = [crimson]Chyba při hostování serveru.[] +server.error = [scarlet]Chyba při hostování serveru.[] save.new = Nové uložení hry save.overwrite = Jsi si jistý, že chceš přepsat\ntuto pozici pro uložení hry? overwrite = Přepsat @@ -231,8 +236,8 @@ save.delete.confirm = Jsi si jistý, že chceš smazat toto uložení hry? save.delete = Smazat save.export = Exportovat uložení hry save.import.invalid = [accent]Toto uložení není v pořádku![] -save.import.fail = [crimson]Nepodařilo se importovat uložení hry: [accent]{0}[] -save.export.fail = [crimson]Nepodařilo se exportovat uložení hry: [accent]{0}[] +save.import.fail = [scarlet]Nepodařilo se importovat uložení hry: [accent]{0}[] +save.export.fail = [scarlet]Nepodařilo se exportovat uložení hry: [accent]{0}[] save.import = Importovat uložení hry save.newslot = Uložit hru: save.rename = Přejmenovat @@ -340,6 +345,11 @@ waves.load = Načíst ze schránky waves.invalid = Neplatné vlny ve schránce. waves.copied = Vlny byly zkopírovány. waves.none = Žádní nepřátelé nebyli definováni.\nVlny s prázdným rozložením budou automaticky upraveny na výchozí rozložení. + +wavemode.counts = počty +wavemode.totals = součty +wavemode.health = zdraví + editor.default = [lightgray][] details = Podrobnosti... edit = Upravit... @@ -379,7 +389,7 @@ editor.exportimage = Exportovat obrázek terénu editor.exportimage.description = Exportovat obrázek mapy do souboru editor.loadimage = Importovat terén editor.saveimage = Exportovat terén -editor.unsaved = [scarlet]Máš neuložené změny![]\nPřesto chceš odejít z editoru? Změny budou ztraceny. +editor.unsaved = Opravdu chceš odejít z editoru?\n[scarlet]Neuložené změny budou ztraceny.[] editor.resizemap = Změnit velikost mapy editor.mapname = Jméno mapy: editor.overwrite = [accent]Varování!\nToto přepíše již existující mapu.[] @@ -459,11 +469,12 @@ locked = Zamčeno complete = [lightgray]Dokončeno: requirement.wave = Dosáhni vlny {0} na mapě {1} requirement.core = Znič nepřátelské jádro na mapě {0} -requirement.unlock = Odemknuto {0} +requirement.research = Vynalezeno {0} +requirement.capture = Polapeno {0} resume = Zpět do mapy:\n[lightgray]{0}[] bestwave = [lightgray]Nejvyšší vlna: {0} -launch = Vyslat do této mapy Tvé jádro -launch.text = Launch +launch = < VYSLAT > +launch.text = Vyslat launch.title = Vyslání bylo úspěšné launch.next = [lightgray]další možnost bude až ve vlně {0}[] launch.unable2 = [scarlet]Není možno se vyslat.[] @@ -471,10 +482,11 @@ launch.confirm = Toto vyšle veškeré suroviny ve Tvém jádře zpět.\nJiž se launch.skip.confirm = Jestli teď zůstaneš, budeš moci odejít až po několika dalších vlnách. uncover = Odkrýt mapu configure = Přizpůsobit vybavení -loadout = Loadout -resources = Resources +loadout = Načtení +resources = Zdroje bannedblocks = Zakázané bloky addall = Přidat vše +launch.destination = Destination: {0} configure.invalid = Hodnota musí být číslo mezi 0 a {0}. zone.unlocked = [lightgray]Mapa {0} byla odemknuta.[] zone.requirement.complete = Bylo dosaženo vlny {0},\nčímž byla splněna podmínka pro mapu {1}. @@ -485,7 +497,7 @@ zone.objective.attack = Znič nepřátelské jádro add = Přidat... boss.health = Životy Strážce -connectfail = [crimson]Nepovedlo se připojení k serveru:\n\n[accent]{0}[] +connectfail = [scarlet]Nepovedlo se připojení k serveru:\n\n[accent]{0}[] error.unreachable = Server je nedostupný.\nJe IP adresa napsaná správně (XXX.XXX.XXX.XXX)? error.invalidaddress = Neplatná IP adresa. error.timedout = Čas pro spojení se serverem vypršel!\nUjisti se, že IP adresa je napsaná správně. Zkus také zjistit, zda má hostitel správně nastavené přesměrování portů. @@ -496,6 +508,20 @@ error.io = Vstupně/výstupní (I/O) chyba sítě. error.any = Ueznámá chyba sítě. error.bloom = Chyba inicializace filtru Bloom.\nTvé zařízení ho nejspíš nepodporuje. +weather.rain.name = Déšť +weather.snow.name = Sníh +weather.sandstorm.name = Písečná ouře +weather.sporestorm.name = Spórová bouře + +sectors.unexplored = [lightgray]Neprozkoumáno +sectors.resources = Zdroje: +sectors.production = Výroba: +sectors.stored = Uskladněno: +sectors.resume = Pokračovat +sectors.launch = Vyslat +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Základní tábor sector.craters.name = Krátery sector.frozenForest.name = Zamrzlý les @@ -532,6 +558,8 @@ settings.graphics = Grafika settings.cleardata = Vymazat data hry... settings.clear.confirm = Jsi si jistý, že chceš vymazat Tvá data ve hře?\nTento krok je nevratný! settings.clearall.confirm = [scarlet]Varování![]\nToto vyresetuje všechna Tvá data ve hře, včetně uložení hry, map, odemknutého postupu v kampani a nastavení ovládání.\nJakmile stiskneš "OK", všechna data se vymažou a hra se automaticky ukončí. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pozastaveno >[] clear = Vyčistit banned = [scarlet]Zakázán[] @@ -539,7 +567,7 @@ unplaceable.sectorcaptured = [scarlet]Vyžaduje polapený sektor[] yes = Ano no = Ne info.title = Informace -error.title = [crimson]Objevila se chyba[] +error.title = [scarlet]Objevila se chyba[] error.crashtitle = Objevila se chyba unit.nobuild = [scarlet]Jednotka nemůže stavět blocks.input = Vstup @@ -557,8 +585,11 @@ blocks.itemsmoved = Rychlost pohybu blocks.launchtime = Čas mezi vysláním blocks.shootrange = Dostřel blocks.size = Velikost +blocks.displaysize = Velikost zobrazovače blocks.liquidcapacity = Kapacita kapalin blocks.powerrange = Rozsah energie +blocks.linkrange = Dosah napojení +blocks.instructions = Instrukce blocks.powerconnections = Nejvyšší počet spojení blocks.poweruse = Spotřeba energie blocks.powerdamage = Energie na jednotku poškození @@ -574,15 +605,18 @@ blocks.boosteffect = Účinek posílení blocks.maxunits = Nejvýše aktivních jednotek blocks.health = Životy blocks.buildtime = Čas stavby +blocks.maxconsecutive = Nejvýše po sobě blocks.buildcost = Cena stavby blocks.inaccuracy = Nepřesnost blocks.shots = Střely blocks.reload = Střel za 1s blocks.ammo = Střelivo +blocks.shieldhealth = Zdraví štítu +blocks.cooldowntime = Čas na zchladnutí bar.drilltierreq = Je vyžadován lepší vrt -bar.noresources = Missing Resources -bar.corereq = Core Base Required +bar.noresources = Chybějí zdroje +bar.corereq = Je vyžadováno základní jádro bar.drillspeed = Rychlost vrtu: {0}/s bar.pumpspeed = Rychlost pumpy: {0}/s bar.efficiency = Účinnost: {0}% @@ -593,7 +627,7 @@ bar.poweroutput = Výstup energie: {0} bar.items = Předměty: {0} bar.capacity = Kapacita: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] +bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[jednotka je vypnuta] bar.liquid = Chlazení bar.heat = Teplo bar.power = Energie @@ -621,12 +655,16 @@ unit.liquidunits = jednotek kapalin unit.powerunits = jednotek energie unit.degrees = úhly unit.seconds = sekundy +unit.minutes = minuty unit.persecond = /s +unit.perminute = /min unit.timesspeed = x větší rychlost unit.percent = % +unit.shieldhealth = zdraví štítu unit.items = předměty -unit.thousands = t -unit.millions = m +unit.thousands = tis +unit.millions = mio +unit.billions = mld category.general = Všeobecné category.power = Energie category.liquids = Kapaliny @@ -679,7 +717,7 @@ setting.blockselectkeys.name = Ukázat klávesy při práci s blokem setting.vsync.name = Vertikální synchronizace setting.pixelate.name = Rozpixlovat setting.minimap.name = Ukázat mapičku -setting.coreitems.name = Display Core Items (WIP) +setting.coreitems.name = Ukázat položky jádra (WIP) setting.position.name = Ukázat pozici hráče setting.musicvol.name = Hlasitost hudby setting.atmosphere.name = Ukázat atmosféru planety @@ -705,10 +743,11 @@ keybinds.mobile = [scarlet]Většina kláves nefunguje v mobilní verzi hry. Je category.general.name = Všeobecné category.view.name = Pohled category.multiplayer.name = Hra více hráčů -category.blocks.name = Block Select +category.blocks.name = Výběr bloků command.attack = Útok command.rally = Shromáždění command.retreat = Ústup +command.idle = Nečinný placement.blockselectkeys = \n[lightgray]Klávesa:[] [{0}, keybind.respawn.name = Znovuzrození keybind.control.name = Ovládací jednotka @@ -721,7 +760,8 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Pohyb vodorovně keybind.move_y.name = Pohyb svisle keybind.mouse_move.name = Následovat myš -keybind.boost.name = Boost +keybind.pan.name = Následovat kameru +keybind.boost.name = Posílení keybind.schematic_select.name = Vybrat oblast keybind.schematic_menu.name = Nabídka šablon keybind.schematic_flip_x.name = Překlopit šablona podle svislé osy @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Umisťovat úhlopříčně keybind.pick.name = Vybrat blok keybind.break_block.name = Rozbít blok keybind.deselect.name = Odznačit +keybind.pickupCargo.name = Vyzvednout náklad +keybind.dropCargo.name = Položit náklad +keybind.command.name = Velet keybind.shoot.name = Střílet keybind.zoom.name = Přiblížení keybind.menu.name = Hlavní nabídka @@ -782,6 +825,7 @@ rules.reactorexplosions = Výbuch reaktoru rules.wavetimer = Časovač vln rules.waves = Vlny rules.attack = Režim útoku +rules.buildai = Umělá inteligence staví rules.enemyCheat = Neomezeně surovin pro umělou inteligenci rules.blockhealthmultiplier = Násobek zdraví bloků rules.blockdamagemultiplier = Násobek poškození bloků @@ -803,8 +847,12 @@ rules.title.unit = Jednotky rules.title.experimental = Experimentální rules.title.environment = Environmentální rules.lighting = Světlo +rules.fire = Výstřel +rules.explosions = Výbušné poškození bloku/jednotky rules.ambientlight = Světlo prostředí -rules.solarpowermultiplier = Násobek sluneční energie +rules.weather = Počasí +rules.weather.frequency = Četnost: +rules.weather.duration = Trvání: content.item.name = Předměty content.liquid.name = Kapaliny @@ -830,9 +878,11 @@ liquid.water.name = Voda liquid.slag.name = Roztavený kov liquid.oil.name = Nafta liquid.cryofluid.name = Chladící kapalina + item.explosiveness = [lightgray]Výbušnost: {0}%[] item.flammability = [lightgray]Zápalnost: {0}%[] item.radioactivity = [lightgray]Radioaktivita: {0}%[] + unit.health = [lightgray]Životy: {0}[] unit.speed = [lightgray]Rychlost: {0}[] unit.weapon = [lightgray]Zbraň: {0} @@ -846,52 +896,62 @@ liquid.heatcapacity = [lightgray]Teplotní kapacita: {0}[] liquid.viscosity = [lightgray]Viskozita: {0}[] liquid.temperature = [lightgray]Teplota: {0}[] -unit.dagger.name = Mech Dýka -unit.mace.name = Mace -unit.fortress.name = Mech Pevnost +unit.dagger.name = Dýka +unit.mace.name = Palcát +unit.fortress.name = Pevnost unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar -unit.crawler.name = Mech Slídil +unit.pulsar.name = Pulzar +unit.quasar.name = Kvasar +unit.crawler.name = Slídil unit.atrax.name = Atrax -unit.spiroct.name = Spiroct +unit.spiroct.name = Spirokt unit.arkyid.name = Arkyid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith +unit.toxopid.name = Toxopid +unit.flare.name = Záře +unit.horizon.name = Horizont +unit.zenith.name = Zenit unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse +unit.eclipse.name = Zatmění unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde -unit.alpha.name = Alpha +unit.sei.name = Sei +unit.omura.name = Omura +unit.alpha.name = Alfa unit.beta.name = Beta -unit.gamma.name = Gamma +unit.gamma.name = Gama +unit.scepter.name = Žezlo +unit.reign.name = Panovník +unit.vela.name = Vela +unit.corvus.name = Corvus -block.parallax.name = Parallax -block.cliff.name = Cliff +block.resupply-point.name = Zásobovací místo +block.parallax.name = Paralaxa +block.cliff.name = Útes block.sand-boulder.name = Pískovec block.grass.name = Tráva block.slag.name = Slag block.salt.name = Sůl -block.saltrocks.name = Solný kámen +block.salt-wall.name = Solné skály block.pebbles.name = Oblázky block.tendrils.name = Úponky -block.sandrocks.name = Písečný kámen +block.sand-wall.name = Písečné skály block.spore-pine.name = Spórová borovice -block.sporerocks.name = Spórové kamení -block.rock.name = Kámen -block.snowrock.name = Sněhový kámen +block.spore-wall.name = Spórové skály +block.boulder.name = Kámen +block.snow-boulder.name = Sněhový kámen block.snow-pine.name = Sněžná borovice block.shale.name = Břidlice block.shale-boulder.name = Břidličný balvan block.moss.name = Mech block.shrubs.name = Křoví block.spore-moss.name = Spórový mech -block.shalerocks.name = Břidlicové kamení +block.shale-wall.name = Břidlicové skály block.scrap-wall.name = Rozpadlá zeď block.scrap-wall-large.name = Velká rozpadlá zeď block.scrap-wall-huge.name = Obří rozpadlá zeď @@ -918,14 +978,18 @@ block.snow.name = Sníh block.craters.name = Krátery block.sand-water.name = Voda s pískem block.darksand-water.name = Voda s černým pískem -block.char.name = Char -block.holostone.name = Blok kamene +block.char.name = Dřevěné uhlí +block.dacite.name = Dacit +block.dacite-wall.name = Stěna dacitu block.ice-snow.name = Zasněžený led -block.rocks.name = Skály -block.icerocks.name = Ledové skály -block.snowrocks.name = Sněhové skály -block.dunerocks.name = Písečné duny +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ledové skály +block.snow-wall.name = Sněhové skály +block.dune-wall.name = Písečné duny block.pine.name = Borovice +block.dirt.name = Hlína +block.dirt-wall.name = Kopec hlíny +block.mud.name = Bláto block.white-tree-dead.name = Bílá souška block.white-tree.name = Bílý strom block.spore-cluster.name = Shluk spór @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Tmavá deska 4 block.dark-panel-5.name = Tmavá deska 5 block.dark-panel-6.name = Tmavá deska 6 block.dark-metal.name = Tmavý kov -block.ignarock.name = Třaskavec +block.basalt.name = Čedič block.hotrock.name = Horký kámen block.magmarock.name = Magmatický kámen -block.cliffs.name = Útesy block.copper-wall.name = Měděná zeď block.copper-wall-large.name = Velká měděná zeď block.titanium-wall.name = Titanová zeď @@ -993,7 +1056,7 @@ block.diode.name = Bateriová dioda block.battery.name = Baterie block.battery-large.name = Velká baterie block.combustion-generator.name = Spalovací generátor -block.turbine-generator.name = Turbínový generátor +block.steam-generator.name = Turbínový generátor block.differential-generator.name = Rozdílový Generator block.impact-reactor.name = Rázový reaktor block.mechanical-drill.name = Mechanický vrt @@ -1055,18 +1118,28 @@ block.container.name = Kontejnér block.launch-pad.name = Vysílací plošina block.launch-pad-large.name = Velká vysílací plošina block.segment.name = Úsek +block.command-center.name = Velín block.ground-factory.name = Pozemní továrna block.air-factory.name = Letecká továrna block.naval-factory.name = Námořní továrna block.additive-reconstructor.name = Přídavný přestavbovač block.multiplicative-reconstructor.name = Násobný přestavbovač block.exponential-reconstructor.name = Exponenciální přestavbovač -block.tetrative-reconstructor.name = Umocňující přestavbovač -block.payload-conveyor.name = Hromadný dopravník +block.tetrative-reconstructor.name = Mocninný přestavbovač +block.payload-conveyor.name = Dopravník nákladu block.payload-router.name = Směřovač nákladu block.disassembler.name = Rozebírač -block.silicon-crucible.name = Křemíková nádoba -block.large-overdrive-projector.name = Velký urychlující projektor +block.silicon-crucible.name = Tavicí tyglík pro křemík +block.overdrive-dome.name = Velká urychlující kupole + +block.switch.name = Přepínač +block.micro-processor.name = Mikroprocesor +block.logic-processor.name = Logický procesor +block.hyper-processor.name = Hyperprocesor +block.logic-display.name = Zobrazovač logiky +block.large-logic-display.name = Velký zobrazovač logiky +block.memory-cell.name = Paměťová buňka + team.blue.name = modrý team.crux.name = červený team.sharded.name = oranžový @@ -1162,7 +1235,7 @@ block.force-projector.description = Vytvoří okolo sebe šestihrané silové po block.shock-mine.description = Působí poškození nepřátelským jednotkám při sešlápnutí. Takřka neviditelné pro nepřátele (a i v nabídce bloků :) ). block.conveyor.description = Základní blok pro přepravu předmětů. Unáší předměty kupředu a automaticky plní vhodná úložiště (budovy, kontejnery, jádro), které po cestě potká. Lze jej otáčet dle potřeby. block.titanium-conveyor.description = Pokročilý blok pro přepravu předmětů. Přenáší předměty rychleji, než základní dopravník. -block.plastanium-conveyor.description = Přesouvá položky v dávkích.\nPřijímá položky zezadu, a vykládá je do tří směrů vepředu. +block.plastanium-conveyor.description = Přesouvá položky v dávkích.\nPřijímá položky zezadu, a vykládá je do tří směrů vepředu.\nPro špičkový průchod vyžaduje několik nakládacích a vykládacích míst. block.junction.description = Chová se jako most pro dva křížící se pásy dopravníků. Užitečný při situaci, kdy dva rozdílné dopravníky dopravují dva rozdílné materiály přes jedno pole. block.bridge-conveyor.description = Pokročilý blok pro přepravu předmětů. Dovoluje transport předmětů až přes tři pole, a to přes jakýkoliv terén nebo budovu. block.phase-conveyor.description = Pokročilý blok pro přepravu předmětů. Využívá energii k teleportaci předmětů na vzdálenost několika dlaždic mezi jiným propojeným fázovým dopravníkem. @@ -1192,7 +1265,7 @@ block.battery.description = Ukládá energii v případě nadbytku v síti a pos block.battery-large.description = Ukládá více energie, než základní baterie. block.combustion-generator.description = Generuje energii spalováním hořlaných materiálů, jako je například uhlí. block.thermal-generator.description = Pokud je umístěn na teplotně aktivní místo (jako je magmatický kámen), dokáže z tepla generovat energii. -block.turbine-generator.description = Pokročilý spalovací generátor. Efektivnější, ale vyžaduje dodatečný přísun vody pro produkci páry. +block.steam-generator.description = Pokročilý spalovací generátor. Efektivnější, ale vyžaduje dodatečný přísun vody pro produkci páry. block.differential-generator.description = Generuje velké množství energie. Využívá teplotního rozdílu mezi chladící kapalinou a hořícím pyratitem. block.rtg-generator.description = Radioizotopní termoenergetický generátor (RTG) je jednoduchý, spolehlivý generátor. Využívá tepla z rozpadu radioaktivních složek ke generování menších dávek energie. block.solar-panel.description = Základní solární panel pro generování malého množství energie ze Slunce. diff --git a/core/assets/bundles/bundle_da.properties b/core/assets/bundles/bundle_da.properties index f448bcafaf..3f94fbdd9f 100644 --- a/core/assets/bundles/bundle_da.properties +++ b/core/assets/bundles/bundle_da.properties @@ -20,6 +20,8 @@ gameover = Game Over gameover.pvp = [accent] {0}[] hold har vundet! highscore = [accent]Ny highscore! copied = kopieret. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Lyd load.map = Bane @@ -63,8 +65,7 @@ stat.delivered = Ressourcer afsendt: stat.playtime = Spilletid:[accent] {0} stat.rank = Endelig Rang: [accent]{0} -launcheditems = [accent]Afsendte genstande -launchinfo = [unlaunched][[LAUNCH] din kerne for at modtage genstandene vist i blå. +globalitems = [accent]Global Items map.delete = Er du sikker på at du vil slette banen"[accent]{0}[]"? level.highscore = High Score: [accent]{0} level.select = Vælg bane @@ -114,6 +115,7 @@ mod.disable = Deaktiver mod.content = Content: mod.delete.error = Kan ikke slette mod. Filer er muligvis i brug. mod.requiresversion = [scarlet]Behøver minimal spil version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Mangler afhængigheder: {0} mod.erroredcontent = [scarlet]Indholds fejl mod.errors = Fejl ved afhentning af indhold. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Om name = Navn: noname = Vælg et[accent] spiller navn[] først. +planetmap = Planet Map +launchcore = Launch Core filename = Fil navn: unlocked = Nyt indhold tilgængeligt! completed = [accent]Færdiggjort @@ -144,6 +148,7 @@ techtree = Teknologi træ research.list = [lightgray]Forskning: research = Udforsk researched = [lightgray]{0} Udforsket. +research.progress = {0}% complete players = {0} spillere players.single = {0} spiller players.search = search @@ -340,6 +345,11 @@ waves.load = Load from Clipboard waves.invalid = Invalid waves in clipboard. waves.copied = Waves copied. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Edit... @@ -459,7 +469,8 @@ locked = Locked complete = [lightgray]Complete: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} launch = < LAUNCH > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Graphics settings.cleardata = Clear Game Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Paused > clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Size +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Health blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees unit.seconds = seconds +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil +unit.billions = b category.general = General category.power = Power category.liquids = Liquids @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move X keybind.move_y.name = Move Y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Liquids @@ -830,9 +878,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Speed: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -919,13 +979,17 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Dark Panel 4 block.dark-panel-5.name = Dark Panel 5 block.dark-panel-6.name = Dark Panel 6 block.dark-metal.name = Dark Metal -block.ignarock.name = Igna Rock +block.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Steam Generator +block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blue team.crux.name = red team.sharded.name = orange @@ -1192,7 +1265,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 881ffe40be..2231d79456 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -20,6 +20,8 @@ gameover = Der Kern wurde zerstört. gameover.pvp = Das[accent] {0}[] Team ist siegreich! highscore = [accent]Neuer Highscore! copied = Kopiert. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Audio load.map = Karten @@ -63,8 +65,7 @@ stat.delivered = Übertragene Ressourcen: stat.playtime = Time Played:[accent] {0} stat.rank = Finaler Rang:[accent] {0} -launcheditems = [accent]Abgefeuerte Items -launchinfo = [unlaunched][[LAUNCH] deine Basis um blau markierte Items zu erhalten. +globalitems = [accent]Global Items map.delete = Bist du sicher, dass du die Karte "[accent]{0}[]" löschen möchtest? level.highscore = Highscore: [accent]{0} level.select = Level-Auswahl @@ -114,6 +115,7 @@ mod.disable = Deaktivieren mod.content = Content: mod.delete.error = Unfähig Mod zu löschen. Datei könnte in Benutzung sein. mod.requiresversion = [scarlet]Benötigt mindestens Version:[accent] {0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Fehlende Abhängigkeiten: {0} mod.erroredcontent = [scarlet]Inhalt-Fehler mod.errors = Beim Laden von Inhalt sind Fehler aufgetreten. @@ -137,6 +139,8 @@ mod.scripts.disable = Ihr Gerät unterstüzt keine Mods mit Scripts. Du musst di about.button = Info name = Name: noname = Wähle zunächst einen[accent] Spielernamen[]. +planetmap = Planet Map +launchcore = Launch Core filename = Dateiname: unlocked = Neuer Inhalt freigeschaltet! completed = [accent]Abgeschlossen @@ -144,6 +148,7 @@ techtree = Forschung research.list = [lightgray]Forschung: research = Erforschen researched = [lightgray]{0} erforscht. +research.progress = {0}% complete players = {0} Spieler online players.single = {0} Spieler online players.search = search @@ -340,6 +345,11 @@ waves.load = Aus der Zwischenablage laden waves.invalid = Ungültige Wellen in der Zwischenablage. waves.copied = Wellen kopiert. waves.none = Keine Gegner definiert.\nInfo: Leere Wellenentwürfe werden automatisch mit dem Standard-Entwurf ersetzt. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details edit = Bearbeiten @@ -459,7 +469,8 @@ locked = Gesperrt complete = [lightgray]Abschließen: requirement.wave = Erreiche Welle {0} in {1} requirement.core = Zerstöre den feindlichen Kern in {0} -requirement.unlock = Schalte {0} frei +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Zu Zone zurückkehren:\n[lightgray]{0} bestwave = [lightgray]Beste Welle: {0} launch = Starten @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Gesperrte Blöcke addall = Alle hinzufügen +launch.destination = Destination: {0} configure.invalid = Anzahl muss eine Zahl zwischen 0 und {0} sein. zone.unlocked = [lightgray]{0} freigeschaltet. zone.requirement.complete = Welle {0} erreicht:\n{1} Anforderungen der Zone erfüllt. @@ -496,6 +508,20 @@ error.io = Netzwerk-I/O-Fehler. error.any = Unbekannter Netzwerkfehler. error.bloom = Bloom konnte nicht initialisiert werden.\nEs kann sein, dass dein Gerät es nicht unterstützt. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafik settings.cleardata = Spieldaten zurücksetzen... settings.clear.confirm = Bist du sicher, dass du die Spieldaten zurücksetzen willst?\n Diese Aktion kann nicht rückgängig gemacht werden! settings.clearall.confirm = [scarlet]WARNUNG![]\nDas wird jegliche Spieldaten zurücksetzen, inklusive Speicherstände, Karten, Freischaltungen und Tastenbelegungen.\n Sobald du 'OK' drückst, wird alles zurückgesetzt und das Spiel schließt sich automatisch. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pausiert > clear = Leeren banned = [scarlet]Verbannt @@ -557,8 +585,11 @@ blocks.itemsmoved = Bewegungsgeschwindigkeit blocks.launchtime = Zeit zwischen Starts blocks.shootrange = Reichweite blocks.size = Größe +blocks.displaysize = Display Size blocks.liquidcapacity = Flüssigkeitskapazität blocks.powerrange = Stromreichweite +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Maximale Stromverbindungen blocks.poweruse = Stromverbrauch blocks.powerdamage = Stromverbrauch/Schadenspunkt @@ -574,11 +605,14 @@ blocks.boosteffect = Verstärkungseffekt blocks.maxunits = Max. aktive Einheiten blocks.health = Lebenspunkte blocks.buildtime = Baudauer +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Baukosten blocks.inaccuracy = Ungenauigkeit blocks.shots = Schüsse blocks.reload = Schüsse/Sekunde blocks.ammo = Munition +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Besserer Bohrer Benötigt bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = Flüssigkeitseinheiten unit.powerunits = Stromeinheiten unit.degrees = Grad unit.seconds = Sekunden +unit.minutes = mins unit.persecond = /sek +unit.perminute = /min unit.timesspeed = x Geschwindigkeit unit.percent = % +unit.shieldhealth = shield health unit.items = Materialeinheiten unit.thousands = k unit.millions = mil +unit.billions = b category.general = Allgemeines category.power = Strom category.liquids = Flüssigkeiten @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Angreifen command.rally = Patrouillieren command.retreat = Rückzug +command.idle = Idle placement.blockselectkeys = \n[lightgray]Taste: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = X-Achse keybind.move_y.name = Y-Achse keybind.mouse_move.name = Der Maus folgen +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Bereich auswählen keybind.schematic_menu.name = Entwurfsmenü @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal platzieren keybind.pick.name = Block auswählen keybind.break_block.name = Block zerstören keybind.deselect.name = Auswahl aufheben +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Schießen keybind.zoom.name = Zoomen keybind.menu.name = Menü @@ -782,6 +825,7 @@ rules.reactorexplosions = Reaktor-Explosionen rules.wavetimer = Wellen-Timer rules.waves = Wellen rules.attack = Angriff-Modus +rules.buildai = AI Building rules.enemyCheat = Unbegrenzte Ressourcen für die KI (Rotes Team) rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Einheiten rules.title.experimental = Experimentell rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Materialien content.liquid.name = Flüssigkeiten @@ -830,9 +878,11 @@ liquid.water.name = Wasser liquid.slag.name = Schlacke liquid.oil.name = Öl liquid.cryofluid.name = Kryoflüssigkeit + item.explosiveness = [lightgray]Explosivität: {0} item.flammability = [lightgray]Entflammbarkeit: {0} item.radioactivity = [lightgray]Radioaktivität: {0} + unit.health = [lightgray]Lebenskraft: {0} unit.speed = [lightgray]Geschwindigkeit: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sandbrocken block.grass.name = Gras block.slag.name = Slag block.salt.name = Salz -block.saltrocks.name = Salzgestein +block.salt-wall.name = Salt Wall block.pebbles.name = Geröll block.tendrils.name = Ranken -block.sandrocks.name = Sandstein +block.sand-wall.name = Sand Wall block.spore-pine.name = Sporenkiefer -block.sporerocks.name = Sporengestein -block.rock.name = Gestein -block.snowrock.name = Schnee-Gestein +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Schnee-Kiefer block.shale.name = Schiefer block.shale-boulder.name = Schiefergeröll block.moss.name = Moos block.shrubs.name = Gestrüpp block.spore-moss.name = Moossporen -block.shalerocks.name = Schiefer-Gestein +block.shale-wall.name = Shale Wall block.scrap-wall.name = Schrottmauer block.scrap-wall-large.name = Große Schrottmauer block.scrap-wall-huge.name = Riesige Schrottmauer @@ -919,13 +979,17 @@ block.craters.name = Krater block.sand-water.name = Sandiges Wasser block.darksand-water.name = Dunkles sandiges Wasser block.char.name = Holzkohle -block.holostone.name = Holo-Stein +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Eisschnee -block.rocks.name = Felsen -block.icerocks.name = Eis-Felsen -block.snowrocks.name = Schnee-Felsen -block.dunerocks.name = Dünen-Felsen +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Kiefer +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Weißer Baum (tot) block.white-tree.name = Weißer Baum block.spore-cluster.name = Sporen-Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Dunkles Panel 4 block.dark-panel-5.name = Dunkles Panel 5 block.dark-panel-6.name = Dunkles Panel 6 block.dark-metal.name = Dunkles Metall -block.ignarock.name = Igna-Felsen +block.basalt.name = Basalt block.hotrock.name = Heißer Felsen block.magmarock.name = Magma-Felsen -block.cliffs.name = Klippen block.copper-wall.name = Kupfermauer block.copper-wall-large.name = Große Kupfermauer block.titanium-wall.name = Titanmauer @@ -993,7 +1056,7 @@ block.diode.name = Batterie-Diode block.battery.name = Batterie block.battery-large.name = Große Batterie block.combustion-generator.name = Verbrennungsgenerator -block.turbine-generator.name = Turbinengenerator +block.steam-generator.name = Turbinengenerator block.differential-generator.name = Differentialgenerator block.impact-reactor.name = Schlaggenerator block.mechanical-drill.name = Mechanischer Bohrer @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launchpad block.launch-pad-large.name = Großes Launchpad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Blau team.crux.name = Rot team.sharded.name = Orange @@ -1192,7 +1265,7 @@ block.battery.description = Speichert Strom, solange ein Überschuss besteht, un block.battery-large.description = Speichert sehr viel mehr Strom als eine normale Batterie. block.combustion-generator.description = Generiert Strom, indem Öl oder entzündliche Materialien verbrannt werden. block.thermal-generator.description = Erzeugt große Mengen Strom aus Lava. -block.turbine-generator.description = Effizienter als ein Verbrennungsgenerator, benötigt jedoch zusätzlich Wasser. +block.steam-generator.description = Effizienter als ein Verbrennungsgenerator, benötigt jedoch zusätzlich Wasser. block.differential-generator.description = Erzeugt große Mengen an Energie. Nutzt den Temperaturunterschied zwischen Kryofluid und brennendem Pyratit. block.rtg-generator.description = Ein Radioisotopengenerator, der keine Kühlung benötigt, aber weniger Strom als ein Thorium-Reaktor liefert. block.solar-panel.description = Erzeugt kleine Mengen an Strom aus Sonnenenergie. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index 9fad522899..93d422040e 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -20,6 +20,8 @@ gameover = Tu núcleo ha sido destruido. gameover.pvp = ¡El equipo[accent] {0}[] ha ganado! highscore = [accent]¡Nueva mejor puntuación! copied = Copiado. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sonidos load.map = Mapas @@ -63,8 +65,7 @@ stat.delivered = Recursos Lanzados: stat.playtime = Tiempo jugado:[accent] {0} stat.rank = Rango final: [accent]{0} -launcheditems = [accent]Recursos Lanzados -launchinfo = [unlaunched][[LAUNCH] tu núcleo core obtenga los objetos indicados en azul. +globalitems = [accent]Global Items map.delete = ¿Estás seguro que quieres borrar el mapa "[accent]{0}[]"? level.highscore = Puntuación más alta: [accent]{0} level.select = Selección de nivel @@ -114,6 +115,7 @@ mod.disable = Desactivar mod.content = Content: mod.delete.error = Fallo al elminar el mod. Quizás el archivo esta en uso. mod.requiresversion = [scarlet]Requiere mínima versión del juego: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Dependencias faltantes: {0} mod.erroredcontent = [scarlet]Errores de contenido mod.errors = Ocurrieron fallos al cargar el contenido. @@ -137,6 +139,8 @@ mod.scripts.disable = Tu dispositivo no soporta los mods con scripts. Debes desh about.button = Acerca de name = Nombre: noname = Elige un[accent] nombre de jugador[] primero. +planetmap = Planet Map +launchcore = Launch Core filename = Nombre del archivo: unlocked = ¡Nuevo Bloque Desbloqueado! completed = [accent]Completado @@ -144,6 +148,7 @@ techtree = Árbol de Tecnologías research.list = [lightgray]investigación: research = Investigación researched = [lightgray]{0} investigado. +research.progress = {0}% complete players = {0} jugadores online players.single = {0} jugador online players.search = buscar @@ -340,6 +345,11 @@ waves.load = Cargar del Portapapeles waves.invalid = Oleadas inválidaas en el portapapeles. waves.copied = Oleadas copiadas. waves.none = No hay enemigos definidos.\nNótese que las listas de oleadas vacías se sustituirán por la lista por defecto. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detalles... edit = Editar... @@ -459,7 +469,8 @@ locked = Bloqueado complete = [lightgray]Completado: requirement.wave = Alcanzar la oleada {0} en {1} requirement.core = Destruir el núcleo enemigo en {0} -requirement.unlock = Desbloquear {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Continuar Zona:\n[lightgray]{0} bestwave = [lightgray]Récord: {0} launch = Lanzar @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Bloques prohibidos addall = Añadir todo +launch.destination = Destination: {0} configure.invalid = La cantidad debe estar entre 0 y {0}. zone.unlocked = [lightgray]{0} desbloqueado. zone.requirement.complete = Oleada {0} alcanzada:\nrequerimientos de la zona {1} cumplidos. @@ -496,6 +508,20 @@ error.io = Error I/O de conexión. error.any = Error de red desconocido. error.bloom = Error al cargar el bloom.\nPuede que tu dispositivo no soporte esta característica. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Gráficos settings.cleardata = Limpiar Datos del Juego... settings.clear.confirm = ¿Estas seguro de querer limpiar estos datos?\n¡Esta acción no puede deshacerse! settings.clearall.confirm = [scarlet]ADVERTENCIA![]\nEsto va a eliminar todos tus datos, incluyendo guardados, mapas, desbloqueos y atajos de teclado.\nUna vez presiones 'ok', el juego va a borrrar todos tus datos y saldrá del juego automáticamente. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent] < Pausado > clear = Limpiar banned = [scarlet]Baneado @@ -557,8 +585,11 @@ blocks.itemsmoved = Velocidad de movimiento blocks.launchtime = Tiempo entre lanzamientos blocks.shootrange = Rango de Disparo blocks.size = Tamaño +blocks.displaysize = Display Size blocks.liquidcapacity = Capacidad de Líquidos blocks.powerrange = Rango de Energía +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Conexiones maximas blocks.poweruse = Consumo de Energía blocks.powerdamage = Energía/Daño @@ -574,11 +605,14 @@ blocks.boosteffect = Efecto del Potenciador blocks.maxunits = Máximo de Unidades Activas blocks.health = Vida blocks.buildtime = Tiempo de construcción +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Coste de construcción blocks.inaccuracy = Imprecisión blocks.shots = Disparos blocks.reload = Recarga blocks.ammo = Munición +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Se requiere un mejor taladro. bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = unidades de líquido unit.powerunits = unidades de energía unit.degrees = grados unit.seconds = segundos +unit.minutes = mins unit.persecond = /seg +unit.perminute = /min unit.timesspeed = x velocidad unit.percent = % +unit.shieldhealth = shield health unit.items = objetos unit.thousands = k unit.millions = M +unit.billions = b category.general = General category.power = Energía category.liquids = Líquidos @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Atacar command.rally = Patrullar command.retreat = Retirarse +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Mover x keybind.move_y.name = Mover y keybind.mouse_move.name = Seguír al ratón +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Seleccionar región keybind.schematic_menu.name = Menu de esquématicos @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Construcción Diagonal keybind.pick.name = Elegir bloque keybind.break_block.name = Destruir Bloque keybind.deselect.name = Deseleccionar +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Disparar keybind.zoom.name = Zoom keybind.menu.name = Menú @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Temportzador de Oleadas rules.waves = Oleadas rules.attack = Modo de Ataque +rules.buildai = AI Building rules.enemyCheat = Recursos infinitos de la IA rules.blockhealthmultiplier = Multiplicador de salud de bloque rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unidades rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Iluminación +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Iluminación ambiental -rules.solarpowermultiplier = Multiplicador de Potencia de Panel Solar +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Objetos content.liquid.name = Líquidos @@ -830,9 +878,11 @@ liquid.water.name = Agua liquid.slag.name = Fundido liquid.oil.name = Petróleo liquid.cryofluid.name = Criogénico + item.explosiveness = [lightgray]Explosividad: {0} item.flammability = [lightgray]Inflamabilidad: {0} item.radioactivity = [lightgray]Radioactividad: {0} + unit.health = [lightgray]Vida: {0} unit.speed = [lightgray]Velocidad: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Oruga unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Piedra de Arena block.grass.name = Hierba block.slag.name = Slag block.salt.name = Sal -block.saltrocks.name = Rocas de Sal +block.salt-wall.name = Salt Wall block.pebbles.name = Guijarros block.tendrils.name = Zarcillos -block.sandrocks.name = Rocas de arena +block.sand-wall.name = Sand Wall block.spore-pine.name = Pino de esporas -block.sporerocks.name = Rocas de espora -block.rock.name = Roca -block.snowrock.name = Roca de nieve +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pino de nieve block.shale.name = Pizarra block.shale-boulder.name = Piedra de Pizarra block.moss.name = Musgo block.shrubs.name = Arbustos block.spore-moss.name = Musgo de esporas -block.shalerocks.name = Rocas de Pizarra +block.shale-wall.name = Shale Wall block.scrap-wall.name = Muro de Chatarra block.scrap-wall-large.name = Muro de Chatarra grande block.scrap-wall-huge.name = Muro de Chatarra muy grande @@ -919,13 +979,17 @@ block.craters.name = Cráteres block.sand-water.name = Agua con Arena block.darksand-water.name = Agua con Arena Oscura block.char.name = Carbonizado -block.holostone.name = Piedra hologramatica +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Hielo Nieve -block.rocks.name = Rocas -block.icerocks.name = Rocas de hielo -block.snowrocks.name = Rocas de nieve -block.dunerocks.name = Dune Rocks +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pino +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Árbol Blanco Muerto block.white-tree.name = Árbol Blanco block.spore-cluster.name = Concentración de Esporas @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Panel Oscuro 4 block.dark-panel-5.name = Panel Oscuro 5 block.dark-panel-6.name = Panel Oscuro 6 block.dark-metal.name = Metal Oscuro -block.ignarock.name = Roca Ignea +block.basalt.name = Basalt block.hotrock.name = Roca Caliente block.magmarock.name = Roca de Magma -block.cliffs.name = Acantilados block.copper-wall.name = Muro de Cobre block.copper-wall-large.name = Muro de Cobre grande block.titanium-wall.name = Muro de Titanio @@ -993,7 +1056,7 @@ block.diode.name = Diodo de batería block.battery.name = Batería block.battery-large.name = Batería Grande block.combustion-generator.name = Generador de Combustión -block.turbine-generator.name = Turbina +block.steam-generator.name = Turbina block.differential-generator.name = Generador Diferencial block.impact-reactor.name = Reactor de Impacto block.mechanical-drill.name = Taladro mecánico @@ -1055,6 +1118,7 @@ block.container.name = Contenedor block.launch-pad.name = Pad de Lanzamiento block.launch-pad-large.name = Pad de Lanzamiento Grande block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Azul team.crux.name = rojo team.sharded.name = naranja @@ -1192,7 +1265,7 @@ block.battery.description = Guarda energía cuando hay abundancia y proporciona block.battery-large.description = Almacena mucha más energía que una batería normal. block.combustion-generator.description = Genera energía quemando aceite o materiales inflamables. block.thermal-generator.description = Genera una gran cantidad de energía con la lava. -block.turbine-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional. +block.steam-generator.description = Más eficiente que un generador de combustión, pero requiere agua adicional. block.differential-generator.description = Genera grandes cantidades de energía. Utiliza la diferencia de temperatura entre el fluído criogenico y la quema de piratita. block.rtg-generator.description = Un generador radioisótropo termoeléctrico que no necesita enfriamiento, pero proporciona menos energía que un reactor de torio. block.solar-panel.description = Proporciona una pequeña cantidad de energía procedente del sol. diff --git a/core/assets/bundles/bundle_et.properties b/core/assets/bundles/bundle_et.properties index ea08f62c6d..0565a4920b 100644 --- a/core/assets/bundles/bundle_et.properties +++ b/core/assets/bundles/bundle_et.properties @@ -20,6 +20,8 @@ gameover = Mäng läbi! gameover.pvp = Võistkond[accent] {0}[] võitis! highscore = [accent]Uus rekord! copied = Copied. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Helid load.map = Maailmad @@ -63,8 +65,7 @@ stat.delivered = Kaasavõetud ressursid: stat.playtime = Time Played:[accent] {0} stat.rank = Hinne:[accent] {0} -launcheditems = [accent]Kaasavõetud ressursid -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +globalitems = [accent]Global Items map.delete = Kas oled kindel, et soovid kustutada\nmaailma "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} level.select = Taseme valimine @@ -114,6 +115,7 @@ mod.disable = Disable mod.content = Content: mod.delete.error = Unable to delete mod. File may be in use. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Info name = Nimi: noname = Valige kõigepealt [accent]nimi[]. +planetmap = Planet Map +launchcore = Launch Core filename = Failinimi: unlocked = Uus sisu! completed = [accent]Olemas @@ -144,6 +148,7 @@ techtree = Uurimispuu research.list = [lightgray]Vajalikud uuringud: research = Uuri researched = [lightgray]{0} uuritud. +research.progress = {0}% complete players = {0} mängijat players.single = {0} mängija players.search = search @@ -340,6 +345,11 @@ waves.load = Lae puhvrist waves.invalid = Puhvrist laeti vigane lahingulainete informatsioon. waves.copied = Lahingulainete informatsioon kopeeriti puhvrisse. waves.none = Vaenlased on täpsustamata.\n[accent]Märkus: Tühjad lahingulained asendatakse automaatselt[]\n[accent]vaikimisi lahingulainetega. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Üksikasjad... edit = Muuda... @@ -459,7 +469,8 @@ locked = Lukus complete = [lightgray]Eesmärgid: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Jätka piirkonnas:\n[lightgray]{0} bestwave = [lightgray]Parim lahingulaine: {0} launch = < LENDUTÕUS > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Arv peab olema 0 ja {0} vahel. zone.unlocked = [lightgray]{0} avatud. zone.requirement.complete = Jõudsid lahingulaineni {0}:\nPiirkonna "{1}" nõuded täidetud. @@ -496,6 +508,20 @@ error.io = Võrgu sisend-väljundi viga. error.any = Teadmata viga võrgus. error.bloom = Bloom-efekti lähtestamine ebaõnnestus.\nSinu seade ei pruugi seda efekti toetada. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Graafika settings.cleardata = Kustuta mänguandmed... settings.clear.confirm = Oled kindel, et soovid olemasolevad\nsätted kustutada?\n[accent]Seda ei saa tagasi võtta! settings.clearall.confirm = [scarlet]HOIATUS![]\nKustutatakse kõik andmed, sealhulgas salvestised, maailmad, kampaania saavutused\nja juhtnuppude sätted.\n[accent]Vajutades nupule "OK", kustutatakse\nkõik andmed ja seejärel mäng sulgub.[] +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Paus > clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Transportimise kiirus blocks.launchtime = Aeg lendutõusude vahel blocks.shootrange = Ulatus blocks.size = Suurus +blocks.displaysize = Display Size blocks.liquidcapacity = Vedelike mahutavus blocks.powerrange = Energia ulatus +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Energiatarve blocks.powerdamage = Energiatarve hävituspunkti kohta @@ -574,11 +605,14 @@ blocks.boosteffect = Kiirendaja mõju blocks.maxunits = Maks. aktiivseid väeüksuseid blocks.health = Elud blocks.buildtime = Ehitamise aeg +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Ehitamise maksumus blocks.inaccuracy = Ebatäpsus blocks.shots = Laske blocks.reload = Lasku/s blocks.ammo = Laskemoon +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Nõuab paremat puuri bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = vedelikuühikut unit.powerunits = energiaühikut unit.degrees = kraadi unit.seconds = s +unit.minutes = mins unit.persecond = /s +unit.perminute = /min unit.timesspeed = x kiirus unit.percent = % +unit.shieldhealth = shield health unit.items = ressursiühikut unit.thousands = k unit.millions = mil +unit.billions = b category.general = Üldinfo category.power = Energia category.liquids = Vedelikud @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Ründa command.rally = Patrulli command.retreat = Põgene +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Liigu X-teljel keybind.move_y.name = Liigu Y-teljel keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonaalne paigutamine keybind.pick.name = Vali blokk keybind.break_block.name = Hävita blokk keybind.deselect.name = Tühista valik +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Tulista keybind.zoom.name = Muuda suumi keybind.menu.name = Menüü @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Kasuta taimerit rules.waves = Kasuta lahingulaineid rules.attack = Mänguviis "Rünnak" +rules.buildai = AI Building rules.enemyCheat = [scarlet]Vaenlastel[] on lõputult ressursse rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Väeüksused rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Ressursid content.liquid.name = Vedelikud @@ -830,9 +878,11 @@ liquid.water.name = Vesi liquid.slag.name = Räbu liquid.oil.name = Nafta liquid.cryofluid.name = Krüovedelik + item.explosiveness = [lightgray]Plahvatusohtlikkus: {0}% item.flammability = [lightgray]Tuleohtlikkus: {0}% item.radioactivity = [lightgray]Radioaktiivsus: {0}% + unit.health = [lightgray]Elud: {0} unit.speed = [lightgray]Kiirus: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Plahvataja unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Liivakamakas block.grass.name = Rohi block.slag.name = Slag block.salt.name = Sool -block.saltrocks.name = Kristallsool +block.salt-wall.name = Salt Wall block.pebbles.name = Kruus block.tendrils.name = Kombitsad -block.sandrocks.name = Liivakivid +block.sand-wall.name = Sand Wall block.spore-pine.name = Spoorine puu -block.sporerocks.name = Spoorkivid -block.rock.name = Kivikamakas -block.snowrock.name = Lumine kivikamakas +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Lumine puu block.shale.name = Savikilt block.shale-boulder.name = Kivikamakas block.moss.name = Sammal block.shrubs.name = Põõsad block.spore-moss.name = Spoorsammal -block.shalerocks.name = Savikildad +block.shale-wall.name = Shale Wall block.scrap-wall.name = Vanametallist sein block.scrap-wall-large.name = Suur vanametallist sein block.scrap-wall-huge.name = Tohutu vanametallist sein @@ -919,13 +979,17 @@ block.craters.name = Kraatrid block.sand-water.name = Vesi liival block.darksand-water.name = Vesi tumedal liival block.char.name = Puusüsi -block.holostone.name = Helendav kivi +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Jäine lumi -block.rocks.name = Kivid -block.icerocks.name = Jäised kivid -block.snowrocks.name = Lumised kivid -block.dunerocks.name = Luitekivid +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Puu +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Surnud valgepuu block.white-tree.name = Valgepuu block.spore-cluster.name = Spoorikobarad @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Tume paneel 4 block.dark-panel-5.name = Tume paneel 5 block.dark-panel-6.name = Tume paneel 6 block.dark-metal.name = Tume metall -block.ignarock.name = Tardkivim +block.basalt.name = Basalt block.hotrock.name = Kuumad kivid block.magmarock.name = Magmakivim -block.cliffs.name = Rahnud block.copper-wall.name = Vasksein block.copper-wall-large.name = Suur vasksein block.titanium-wall.name = Titaansein @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Aku block.battery-large.name = Suur aku block.combustion-generator.name = Põlemisgeneraator -block.turbine-generator.name = Aurugeneraator +block.steam-generator.name = Aurugeneraator block.differential-generator.name = Diferentseeriv generaator block.impact-reactor.name = Impulssreaktor block.mechanical-drill.name = Harilik puur @@ -1055,6 +1118,7 @@ block.container.name = Hoidla block.launch-pad.name = Stardiplatvorm block.launch-pad-large.name = Suur stardiplatvorm block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = sinine team.crux.name = punane team.sharded.name = killustunud @@ -1192,7 +1265,7 @@ block.battery.description = Salvestab energiat puhvrina positiivse energiabilans block.battery-large.description = Salvestab rohkem energiat kui tavaline aku. block.combustion-generator.description = Toodab energiat süttivate materjalide, näiteks söe, põletamisel. block.thermal-generator.description = Toodab energiat kuumades piirkondades. -block.turbine-generator.description = Täiustatud põlemisgeneraator. Tõhusam kui põlemisgeneraator, kuid vajab auru tootmiseks lisanduvat vett. +block.steam-generator.description = Täiustatud põlemisgeneraator. Tõhusam kui põlemisgeneraator, kuid vajab auru tootmiseks lisanduvat vett. block.differential-generator.description = Tekitab suurel hulgal energiat. Kasutab ära krüovedeliku ja põleva püratiidi temperatuuride erinevust. block.rtg-generator.description = Töökindel generaator, mis kasutab radioaktiivsete ühendite lagunemisel eralduvat soojust, et toota sellest aeglasel kiirusel energiat. block.solar-panel.description = Toodab vähesel määral energiat päikesekiirgusest. diff --git a/core/assets/bundles/bundle_eu.properties b/core/assets/bundles/bundle_eu.properties index 1c115f90ad..1c77a1068c 100644 --- a/core/assets/bundles/bundle_eu.properties +++ b/core/assets/bundles/bundle_eu.properties @@ -20,6 +20,8 @@ gameover = Partida amaitu da gameover.pvp = [accent] {0}[] taldeak irabazi du! highscore = [accent]Marka berria! copied = Kopiatuta. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Soinuak load.map = Mapak @@ -63,8 +65,7 @@ stat.delivered = Egotzitako baliabideak: stat.playtime = Time Played:[accent] {0} stat.rank = Azken graduazioa: [accent]{0} -launcheditems = [accent]Egotzitako baliabideak -launchinfo = [unlaunched][[EGOTZI] zure muina urdinez adierazitako baliabideak eskuratzeko. +globalitems = [accent]Global Items map.delete = Ziur al zaude "[accent]{0}[]" mapa ezabatu nahi duzula? level.highscore = Marka: [accent]{0} level.select = Maila hautaketa @@ -114,6 +115,7 @@ mod.disable = Desgaitu mod.content = Content: mod.delete.error = Ezin izan da mod-a ezabatu. Agian fitxategia erabilia izaten ari da. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Falta diren menpekotasunak: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Honi buruz name = Izena: noname = Hautatu[accent] jokalari-izena[] aurretik. +planetmap = Planet Map +launchcore = Launch Core filename = Fitxategi-izena: unlocked = Eduki berria desblokeatuta! completed = [accent]Ikertua @@ -144,6 +148,7 @@ techtree = Teknologia zuhaitza research.list = [lightgray]Ikertu: research = Ikertu researched = [lightgray]{0} ikertuta. +research.progress = {0}% complete players = {0} jokalari konektatuta players.single = Jokalari {0} konektatuta players.search = search @@ -340,6 +345,11 @@ waves.load = Kargatu arbeletik waves.invalid = Bolada baliogabeak arbelean. waves.copied = Boladak kopiatuta. waves.none = Ez da etsairik zehaztu.\nKontuan izan bolada hutsak lehenetsitako diseinuarekin ordeztuko direla. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Xehetasunak... edit = Editatu... @@ -459,7 +469,8 @@ locked = Blokeatuta complete = [lightgray]Helmena: requirement.wave = Iritsi {0} boladara {1} requirement.core = Suntsitu etsaiaren muina {0} -requirement.unlock = Desblokeatu {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Berrekin:\n[lightgray]{0} bestwave = [lightgray]Bolada onena: {0} launch = < EGOTZI > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Debekatutako blokeak addall = Gehitu denak +launch.destination = Destination: {0} configure.invalid = Kopurua 0 eta {0} bitarteko zenbaki bat izan behar da. zone.unlocked = [lightgray]{0} desblokeatuta. zone.requirement.complete = {0}. boladara iritsia:\n{1} Eremuaren betebeharra beteta. @@ -496,6 +508,20 @@ error.io = Sareko irteera/sarrera errorea. error.any = Sareko errore ezezaguna. error.bloom = Ezin izan da distira hasieratu.\nAgian zure gailuak ez du onartzen. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafikoak settings.cleardata = Garbitu jolasaren datuak... settings.clear.confirm = Ziur datu hauek garbitu nahi dituzula?\nEgindakoa ezin da desegin! settings.clearall.confirm = [scarlet]ABISUA![]\nHonek datu guztiak garbituko ditu, gordetako partidak, mapak, desblokeatutakoak, eta teklen konfigurazioak barne.\nBehin 'Ados' sakatzen duzula jolasak datuk guztiak ezabatuko ditu eta automatikoki irten. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pausatuta > clear = Garbitu banned = [scarlet]Debekatuta @@ -557,8 +585,11 @@ blocks.itemsmoved = Garraio-abiadura blocks.launchtime = Egozketen arteko denbora blocks.shootrange = Irismena blocks.size = Neurria +blocks.displaysize = Display Size blocks.liquidcapacity = Likido-edukiera blocks.powerrange = Energia irismena +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Gehieneko konexioak blocks.poweruse = Energia-erabilera blocks.powerdamage = Energia/Kaltea @@ -574,11 +605,14 @@ blocks.boosteffect = Indartze-efektua blocks.maxunits = Gehieneko unitate aktiboak blocks.health = Osasuna blocks.buildtime = Eraikitze-denbora +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Eraikitze-kostua blocks.inaccuracy = Zehazgabetasuna blocks.shots = Tiroak blocks.reload = Tiroak/segundoko blocks.ammo = Munizioa +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Zulagailu hobea behar da bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = likido unitate unit.powerunits = energia unitate unit.degrees = grado unit.seconds = segundo +unit.minutes = mins unit.persecond = /seg +unit.perminute = /min unit.timesspeed = x abiadura unit.percent = % +unit.shieldhealth = shield health unit.items = elementu unit.thousands = k unit.millions = mil +unit.billions = b category.general = Orokorra category.power = Energia category.liquids = Likidoak @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Eraso command.rally = Batu command.retreat = Erretreta +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Mugitu x keybind.move_y.name = Mugitu y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Hautatu eskualdea keybind.schematic_menu.name = Eskema menua @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Kokatze diagonala keybind.pick.name = Jaso blokea keybind.break_block.name = Apurtu blokea keybind.deselect.name = Deshautatu +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Tirokatu keybind.zoom.name = Zoom keybind.menu.name = Menua @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Boladen denboragailua rules.waves = Boladak rules.attack = Eraso modua +rules.buildai = AI Building rules.enemyCheat = IA-k (talde gorriak) baliabide amaigabeak ditu rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unitateak rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Solidoak content.liquid.name = Likidoak @@ -830,9 +878,11 @@ liquid.water.name = Ura liquid.slag.name = Zepa liquid.oil.name = Olioa liquid.cryofluid.name = Krio-isurkaria + item.explosiveness = [lightgray]Lehergarritasuna: {0}% item.flammability = [lightgray]Sukoitasuna: {0}% item.radioactivity = [lightgray]Erradioaktibitatea: {0}% + unit.health = [lightgray]Osasuna: {0} unit.speed = [lightgray]Abiadura: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Ibilkaria unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Hondar harkaitza block.grass.name = Belarra block.slag.name = Slag block.salt.name = Gatza -block.saltrocks.name = Gatz harkaitzak +block.salt-wall.name = Salt Wall block.pebbles.name = Harribilak block.tendrils.name = Kiribilak -block.sandrocks.name = Hondar arrokak +block.sand-wall.name = Sand Wall block.spore-pine.name = Espora pinua -block.sporerocks.name = Espora arrokak -block.rock.name = Arroka -block.snowrock.name = Elur arroka +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Elur pinua block.shale.name = Shalea block.shale-boulder.name = Shale harkaitza block.moss.name = Goroldioa block.shrubs.name = Zuhaixkak block.spore-moss.name = Espora goroldioa -block.shalerocks.name = Espora arrokak +block.shale-wall.name = Shale Wall block.scrap-wall.name = Txatarrezko horma block.scrap-wall-large.name = Txatarrezko horma handia block.scrap-wall-huge.name = Txatarrezko horma itzela @@ -919,13 +979,17 @@ block.craters.name = Kraterrak block.sand-water.name = Hondar ura block.darksand-water.name = Hondar ilun ura block.char.name = Kokea -block.holostone.name = Holo harria +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Izotz elurra -block.rocks.name = Harkaitzak -block.icerocks.name = Izotz harkaitzak -block.snowrocks.name = Elur harkaitzak -block.dunerocks.name = Duna arrokak +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pinua +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Zuhaitz zuri hila block.white-tree.name = Zuhaitz zuria block.spore-cluster.name = Espora mordoa @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Panel iluna 4 block.dark-panel-5.name = Panel iluna 5 block.dark-panel-6.name = Panel iluna 6 block.dark-metal.name = Metal iluna -block.ignarock.name = Igna arroka +block.basalt.name = Basalt block.hotrock.name = Arroka beroa block.magmarock.name = Magma arroka -block.cliffs.name = Amildegiak block.copper-wall.name = Kobrezko horma block.copper-wall-large.name = Kobrezko horma handia block.titanium-wall.name = Titaniozko horma @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Bateria block.battery-large.name = Bateria handia block.combustion-generator.name = Errekuntza sorgailua -block.turbine-generator.name = Lurrin sorgailua +block.steam-generator.name = Lurrin sorgailua block.differential-generator.name = Sorgailu diferentziala block.impact-reactor.name = Talkazko erreaktorea block.mechanical-drill.name = Zulagailu mekanikoa @@ -1055,6 +1118,7 @@ block.container.name = Edukiontzia block.launch-pad.name = Egozketa-plataforma block.launch-pad-large.name = Egozketa-plataforma handia block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = urdina team.crux.name = gorria team.sharded.name = laranja @@ -1192,7 +1265,7 @@ block.battery.description = Energia biltegiratu dezake gehiegi dagoenean tarteka block.battery-large.description = Bateria arrunt batek baino energia gehiago biltegiratu dezake. block.combustion-generator.description = Energia sortzen du gai erregarriak errez, esaterako ikatza. block.thermal-generator.description = Energia sortzen du toki beroetan jarrita. -block.turbine-generator.description = Errekuntza sorgailu aurreratu bat. Eraginkorragoa. baina ur gehiago behar du lurrina sortzeko. +block.steam-generator.description = Errekuntza sorgailu aurreratu bat. Eraginkorragoa. baina ur gehiago behar du lurrina sortzeko. block.differential-generator.description = Energia kopuru handia sortzen du. Krio-isurkaria eta piratita goriaren arteko tenperatura diferentzia erabiltzen du. block.rtg-generator.description = Sorgailu sinple eta fidagarria. Konposatu erradioaktiboen hirotzearen beroa erabiltzen du geldiro energia sortzeko. block.solar-panel.description = Eguzkiaren energia kopuru txiki bat ematen du. diff --git a/core/assets/bundles/bundle_fi.properties b/core/assets/bundles/bundle_fi.properties index 93cf3feaaf..a65555994c 100644 --- a/core/assets/bundles/bundle_fi.properties +++ b/core/assets/bundles/bundle_fi.properties @@ -20,6 +20,8 @@ gameover = Peli ohi gameover.pvp = [accent] {0}[] joukkue voittaa! highscore = [accent]Uusi ennätys! copied = Kopioitu. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Ääniä load.map = Karttoja @@ -63,8 +65,7 @@ stat.delivered = Resursseja laukaistu: stat.playtime = Time Played:[accent] {0} stat.rank = Lopullinen arvosana: [accent]{0} -launcheditems = [accent]Laukaistut tavarat -launchinfo = [unlaunched][[LAUKAISE] ytimesi saadaksesi sinisellä merkityt tavarat. +globalitems = [accent]Global Items map.delete = Oletko varma että haluat poistaa kartan "[accent]{0}[]"? level.highscore = Ennätys: [accent]{0} level.select = Tason valinta @@ -114,6 +115,7 @@ mod.disable = Poista käytössä mod.content = Sisältö: mod.delete.error = Modia ei pystytty poistamaan. Tiedosto voi olla käytössä. mod.requiresversion = [scarlet]Tarvitsee vähintään pelin version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Tarvitsee nämä modit: {0} mod.erroredcontent = [scarlet]Sisältövirheet mod.errors = Virheitä on tapahtunut pelin ladatessa. @@ -137,6 +139,8 @@ mod.scripts.disable = Laitteesi ei tue modeja skripteillä. Sinun on sammutettav about.button = Tietoa name = Nimi: noname = Valitse ensin[accent] pelaajanimi[]. +planetmap = Planet Map +launchcore = Launch Core filename = Tiedostonimi: unlocked = Uutta sisältöä avattu! completed = [accent]Suoritettu @@ -144,6 +148,7 @@ techtree = Tekniikkapuu research.list = [lightgray]Tutki: research = Tutki researched = [lightgray]{0} tutkittu. +research.progress = {0}% complete players = {0} pelaajaa paikalla players.single = {0} pelaaja paikalla players.search = etsiä @@ -340,6 +345,11 @@ waves.load = Lataa leikepöydältä waves.invalid = Invalid waves in clipboard. waves.copied = Tasot kopioitu. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Yksityiskohdat... edit = Muokkaa... @@ -459,7 +469,8 @@ locked = Lukittu complete = [lightgray]Reach: requirement.wave = Pääse Tasolle {0} kartassa {1} requirement.core = Tuhoa vihollisen ydin kartassa {0} -requirement.unlock = Avaa {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Paras taso: {0} launch = < LAUKAISE > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Kielletyt Palikat addall = Lisää kaikki +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafiikat settings.cleardata = Tyhjennä Pelin Data... settings.clear.confirm = Oletko varma että haluat tyhjentää pelin datan?\nMitä on tehty ei voi peruuttaa! settings.clearall.confirm = [scarlet]WARNING![]\nTämä poistaa kaiken datan, mukaanlukien kesken olevat pelit, kartat, avatut asiat ja kontrolliasetukset.\nKun painat 'ok' kaikki datasi poistetaan ja peli suljetaan. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pysäytetty > clear = Tyhjä banned = [scarlet]Kielletty @@ -557,8 +585,11 @@ blocks.itemsmoved = Liikkumisnopeus blocks.launchtime = Aika laukaisujen välillä blocks.shootrange = Kantama blocks.size = Koko +blocks.displaysize = Display Size blocks.liquidcapacity = Nestekapasiteetti blocks.powerrange = Energiakantama +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Maksimimäärä yhdistyksiä blocks.poweruse = Energian käyttö blocks.powerdamage = Energia/Vahinko @@ -574,11 +605,14 @@ blocks.boosteffect = Tehostamisem vaikutus blocks.maxunits = Maksimimäärä yksikköjä blocks.health = Elämäpisteet blocks.buildtime = Rakentamisaika +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Rakentamishinta blocks.inaccuracy = Epätarkkuus blocks.shots = Ammusta blocks.reload = Ammusta/sekunnissa blocks.ammo = Ammus +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Parempi pora vaadittu bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = nesteyksikköä unit.powerunits = energiayksikköä unit.degrees = astetta unit.seconds = sekunttia +unit.minutes = mins unit.persecond = /s +unit.perminute = /min unit.timesspeed = x nopeus unit.percent = % +unit.shieldhealth = shield health unit.items = esinettä unit.thousands = t unit.millions = mil +unit.billions = b category.general = Yleinen category.power = Energia category.liquids = Neste @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Hyökkäys command.rally = Kokoontuminen command.retreat = Perääntyminen +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move x keybind.move_y.name = Move y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Valitse alue keybind.schematic_menu.name = Kaavio Valikko @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reaktorien räjähtäminen rules.wavetimer = Tasojen aikaraja rules.waves = Tasot rules.attack = Hyökkäystila +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Tavarat content.liquid.name = Nesteet @@ -830,9 +878,11 @@ liquid.water.name = Vesi liquid.slag.name = Kuona liquid.oil.name = Öljy liquid.cryofluid.name = Kryoneste + item.explosiveness = [lightgray]Räjädysmäisyys: {0}% item.flammability = [lightgray]Syttyvyys: {0}% item.radioactivity = [lightgray]Radioaktiivisuus: {0}% + unit.health = [lightgray]Elämäpisteet: {0} unit.speed = [lightgray]Nopeus: {0} unit.weapon = [lightgray]Ammuksia: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Indeksointirobotti unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Vuoren block.sand-boulder.name = Hiekkalohkare block.grass.name = Ruoho block.slag.name = Kuono block.salt.name = Suolapitoisuus -block.saltrocks.name = Suolakivi +block.salt-wall.name = Salt Wall block.pebbles.name = Pikkukivi block.tendrils.name = Tendrils -block.sandrocks.name = Hiekkakivet +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Mukulakivi -block.snowrock.name = Lumi kivi +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Lumimänny block.shale.name = Liuske block.shale-boulder.name = Shale Boulder block.moss.name = Sammal block.shrubs.name = Pensaikko block.spore-moss.name = Itiösammal -block.shalerocks.name = Liuskekivet +block.shale-wall.name = Shale Wall block.scrap-wall.name = Romuseinä block.scrap-wall-large.name = Suuri romuseinä block.scrap-wall-huge.name = Valtava romuseinä @@ -919,13 +979,17 @@ block.craters.name = Kraatterit block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Jääkivet -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Mänty +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Valkoinen kuollut puu block.white-tree.name = Valkoinen puu block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Tumma paneeli 4 block.dark-panel-5.name = Tumma paneeli 5 block.dark-panel-6.name = Tumma paneeli 6 block.dark-metal.name = Tumma metalli -block.ignarock.name = Igna Rock +block.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Kallio block.copper-wall.name = Kupariseinä block.copper-wall-large.name = Suuri kupariseinä block.titanium-wall.name = Titaaniseinä @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Akku block.battery-large.name = Suuri akku block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Höyrygeneraattori +block.steam-generator.name = Höyrygeneraattori block.differential-generator.name = Differential Generator block.impact-reactor.name = Törmäysreaktori block.mechanical-drill.name = Mechanical Drill @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = sininen team.crux.name = punainen team.sharded.name = orange @@ -1192,7 +1265,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_fil.properties b/core/assets/bundles/bundle_fil.properties index a07e8ebf76..27dea1e7c7 100644 --- a/core/assets/bundles/bundle_fil.properties +++ b/core/assets/bundles/bundle_fil.properties @@ -20,6 +20,8 @@ gameover = Tapos Na Ang Laro gameover.pvp = Ang[accent] {0}[] team ay nanalo! highscore = [accent]Panibagong mataas na Iskor! copied = Kinopya. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Mga Tunog load.map = Mga Mapa @@ -113,6 +115,7 @@ mod.disable = 'Wag Paganahin mod.content = Nilalaman: mod.delete.error = 'Di matanggal ang mod. Maaaring ginagamit pa 'to. mod.requiresversion = [scarlet]Kinakailangan ang minimum bersyon ng laro: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Nawawalang mga Dependency: {0} mod.erroredcontent = [scarlet]Mga Error sa Nilalaman mod.errors = May mga error na naitala habang ni-lo-load ang nilalaman. @@ -136,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = About name = Name: noname = Pick a[accent] player name[] first. +planetmap = Planet Map +launchcore = Launch Core filename = File Name: unlocked = New content unlocked! completed = [accent]Completed @@ -341,7 +346,6 @@ waves.invalid = Invalid waves in clipboard. waves.copied = Waves copied. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. -#these are intentionally in lower case wavemode.counts = counts wavemode.totals = totals wavemode.health = health @@ -466,9 +470,9 @@ complete = [lightgray]Complete: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} -#TODO fix/remove this launch = < LAUNCH > launch.text = Launch launch.title = Launch Successful @@ -478,11 +482,11 @@ launch.confirm = This will launch all resources in your core.\nYou will not be a launch.skip.confirm = If you skip now, you will not be able to launch until later waves. uncover = Uncover configure = Configure Loadout -#TODO loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} @@ -504,7 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. -#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -517,10 +534,6 @@ sector.tarFields.name = Tar Fields sector.saltFlats.name = Salt Flats sector.fungalPass.name = Fungal Pass -#unused -#sector.impact0078.name = Impact 0078 -#sector.crags.name = Crags - sector.groundZero.description = The optimal location to begin once more. Low enemy threat. Few resources.\nGather as much lead and copper as possible.\nMove on. sector.frozenForest.description = Even here, closer to mountains, the spores have spread. The frigid temperatures cannot contain them forever.\n\nBegin the venture into power. Build combustion generators. Learn to use menders. sector.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. @@ -545,6 +558,8 @@ settings.graphics = Graphics settings.cleardata = Clear Game Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Paused > clear = Clear banned = [scarlet]Banned @@ -570,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Size +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage @@ -587,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Health blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -634,9 +655,12 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees unit.seconds = seconds +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil @@ -723,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -735,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move X keybind.move_y.name = Move Y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -762,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -796,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -817,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Liquids @@ -844,9 +878,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Speed: {0} unit.weapon = [lightgray]Weapon: {0} @@ -870,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -878,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -933,13 +979,17 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -955,10 +1005,9 @@ block.dark-panel-4.name = Dark Panel 4 block.dark-panel-5.name = Dark Panel 5 block.dark-panel-6.name = Dark Panel 6 block.dark-metal.name = Dark Metal -block.ignarock.name = Igna Rock +block.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -1007,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Steam Generator +block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1069,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1081,6 +1131,15 @@ block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blue team.crux.name = red team.sharded.name = orange @@ -1206,7 +1265,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_fr.properties b/core/assets/bundles/bundle_fr.properties index cd79e0ab9c..798e482994 100644 --- a/core/assets/bundles/bundle_fr.properties +++ b/core/assets/bundles/bundle_fr.properties @@ -20,6 +20,8 @@ gameover = Game over gameover.pvp = L'équipe [accent] {0}[] a gagné ! highscore = [accent]Nouveau meilleur score! copied = Copié. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sons load.map = Cartes @@ -63,8 +65,7 @@ stat.delivered = Ressources transférées: stat.playtime = Temps de jeu:[accent] {0} stat.rank = Rang Final: [accent]{0} -launcheditems = [accent]Ressources transférées -launchinfo = [unlaunched][[LANCER] votre noyau pour obtenir les objets indiqués en bleu. +globalitems = [accent]Global Items map.delete = Êtes-vous certain(e) de vouloir supprimer la carte "[accent]{0}[]"? level.highscore = Meilleur score: [accent]{0} level.select = Sélection du niveau @@ -114,6 +115,7 @@ mod.disable = Désactiver mod.content = Contenu: mod.delete.error = Impossible de supprimer le mod. Le fichier est probablement en cours d'utilisation. mod.requiresversion = [scarlet]Version du jeu requise : [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Dépendances manquantes: {0} mod.erroredcontent = [scarlet]Erreurs de contenu mod.errors = Des erreurs se sont produites lors du chargement du contenu. @@ -137,6 +139,8 @@ mod.scripts.disable = Votre appareil ne supporte pas les mods avec des scripts. about.button = À propos name = Nom: noname = Commencez par choisir un[accent] nom de joueur[]. +planetmap = Planet Map +launchcore = Launch Core filename = Nom du fichier: unlocked = Nouveau bloc débloqué! completed = [accent]Complété @@ -144,6 +148,7 @@ techtree = Arbre technologique research.list = [lightgray]Recherche: research = Rechercher researched = [lightgray]{0} recherché(e). +research.progress = {0}% complete players = {0} joueurs en ligne players.single = {0} joueur en ligne players.search = Recherche @@ -340,6 +345,11 @@ waves.load = Coller depuis le presse-papiers waves.invalid = Vagues invalides dans le presse-papiers. waves.copied = Vagues copiées waves.none = Aucun ennemi défini.\nNotez que les vagues vides seront automatiquement remplacées par une vague générée par défaut. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Détails... edit = Modifier... @@ -459,7 +469,8 @@ locked = Verrouillé complete = [lightgray]Compléter: requirement.wave = Vague {0} dans {1} requirement.core = Détruire le Noyau ennemi dans {0} -requirement.unlock = Débloque {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Reprendre la partie:\n[lightgray]{0} bestwave = [lightgray]Meilleur: {0} launch = < LANCEMENT > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Blocs Bannis addall = Ajouter TOUS +launch.destination = Destination: {0} configure.invalid = Le montant doit être un nombre compris entre 0 et {0}. zone.unlocked = [lightgray]{0} débloquée. zone.requirement.complete = Exigences pour {0} complétées:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = Erreur de Réseau (I/O) error.any = Erreur réseau inconnue error.bloom = Échec de l'initialisation du flou lumineux.\nVotre appareil peut ne pas le supporter. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Graphismes settings.cleardata = Effacer les données du jeu... settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\nAucun retour en arrière n'est possible! settings.clearall.confirm = [scarlet]ATTENTION![]\nCette action effacera toutes les données, y compris les sauvegardes, les cartes, la progression et la configuration des touches.\nUne fois que vous aurez pressé 'OK' le jeu effacera TOUTES les données et se fermera. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pause > clear = Effacer banned = [scarlet]Bannis @@ -557,8 +585,11 @@ blocks.itemsmoved = Vitesse de Déplacement blocks.launchtime = Temps entre chaque lancement blocks.shootrange = Portée de tir blocks.size = Taille +blocks.displaysize = Display Size blocks.liquidcapacity = Capacité liquide blocks.powerrange = Portée électrique +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Nombre maximal de connections blocks.poweruse = Énergie utilisée blocks.powerdamage = Dégâts d'énergie @@ -574,11 +605,14 @@ blocks.boosteffect = Effet du Boost blocks.maxunits = Unités actives max blocks.health = Santé blocks.buildtime = Durée de construction +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Coût de construction blocks.inaccuracy = Imprécision blocks.shots = Tirs blocks.reload = Tirs/Seconde blocks.ammo = Munitions +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Meilleure Foreuse Requise bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = unité de liquide unit.powerunits = unité d'énergie unit.degrees = degrés unit.seconds = secondes +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x vitesse unit.percent = % +unit.shieldhealth = shield health unit.items = objets unit.thousands = k unit.millions = M +unit.billions = b category.general = Général category.power = Énergie category.liquids = Liquides @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attaque command.rally = Rassembler command.retreat = Retraite +command.idle = Idle placement.blockselectkeys = \n[lightgray]Touche: [{0}, keybind.respawn.name = Réapparaitre keybind.control.name = Controler une Unité @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Montrer/Cacher les Status des Blocs keybind.move_x.name = Mouvement X keybind.move_y.name = Mouvement Y keybind.mouse_move.name = Suivre la Souris +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Sélectionner une Région keybind.schematic_menu.name = Menu des schémas @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Placement en diagonale keybind.pick.name = Choisir un bloc keybind.break_block.name = Supprimer un bloc keybind.deselect.name = Désélectionner +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Tirer keybind.zoom.name = Zoomer keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Explosion des Réacteurs rules.wavetimer = Minuterie pour les vagues rules.waves = Vagues rules.attack = Mode « Attaque » +rules.buildai = AI Building rules.enemyCheat = Ressources infinies pour l'IA (équipe rouge) rules.blockhealthmultiplier = Multiplicateur de Santé des Blocs rules.blockdamagemultiplier = Multiplicateur de Dégât des Blocs @@ -803,8 +847,12 @@ rules.title.unit = Unités rules.title.experimental = Expérimental rules.title.environment = Environment rules.lighting = Éclairage +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Éclairage Ambiant -rules.solarpowermultiplier = Multiplicateur d'Énergie Solaire +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Objets content.liquid.name = Liquides @@ -830,9 +878,11 @@ liquid.water.name = Eau liquid.slag.name = Scories liquid.oil.name = Pétrole liquid.cryofluid.name = Liquide Cryogénique + item.explosiveness = [lightgray]Explosivité: {0} item.flammability = [lightgray]Inflammabilité: {0} item.radioactivity = [lightgray]Radioactivité: {0} + unit.health = [lightgray]Santé: {0} unit.speed = [lightgray]Vitesse: {0} unit.weapon = [lightgray]Arme: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Rampeur unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Falaise block.sand-boulder.name = Bloc de Sable block.grass.name = Herbe block.slag.name = Scories block.salt.name = Sel -block.saltrocks.name = Roches de sel +block.salt-wall.name = Salt Wall block.pebbles.name = Cailloux block.tendrils.name = Vrilles -block.sandrocks.name = Roches de sable +block.sand-wall.name = Sand Wall block.spore-pine.name = Pin Sporeux -block.sporerocks.name = Roche Sporeuse -block.rock.name = Roche -block.snowrock.name = Roches enneigées +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pin enneigé block.shale.name = Schiste block.shale-boulder.name = Blocs de Schiste block.moss.name = Mousse block.shrubs.name = Arbustes block.spore-moss.name = Mousse Sporeuse -block.shalerocks.name = Rochers de Schiste Argileux +block.shale-wall.name = Shale Wall block.scrap-wall.name = Mur de Ferraille block.scrap-wall-large.name = Grand Mur de Ferraille block.scrap-wall-huge.name = Énorme Mur de Ferraille @@ -919,13 +979,17 @@ block.craters.name = Cratères block.sand-water.name = Eau avec fond de Sable block.darksand-water.name = Eau avec fond de Sable Sombre block.char.name = Cendre -block.holostone.name = Pierre Holographique +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Neige et Glace -block.rocks.name = Rochers -block.icerocks.name = Rochers de Glace -block.snowrocks.name = Rochers de Neige -block.dunerocks.name = Rochers de Sable +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pin +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Arbre Blanc Mort block.white-tree.name = Arbre Blanc block.spore-cluster.name = Grappe de Spores @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Panneau Sombre 4 block.dark-panel-5.name = Panneau Sombre 5 block.dark-panel-6.name = Panneau Sombre 6 block.dark-metal.name = Métal Sombre -block.ignarock.name = Roches Ignées +block.basalt.name = Basalt block.hotrock.name = Roches Chaudes block.magmarock.name = Roches Magmatiques -block.cliffs.name = Falaises block.copper-wall.name = Mur de Cuivre block.copper-wall-large.name = Grand Mur de Cuivre block.titanium-wall.name = Mur de Titane @@ -993,7 +1056,7 @@ block.diode.name = Diode block.battery.name = Batterie block.battery-large.name = Grande Batterie block.combustion-generator.name = Générateur à Combustion -block.turbine-generator.name = Générateur à Turbine +block.steam-generator.name = Générateur à Turbine block.differential-generator.name = Générateur Différentiel block.impact-reactor.name = Réacteur à Impact block.mechanical-drill.name = Foreuse Mécanique @@ -1055,6 +1118,7 @@ block.container.name = Conteneur block.launch-pad.name = Plateforme de Lancement block.launch-pad-large.name = Grande Plateforme de Lancement block.segment.name = Diviseur +block.command-center.name = Command Center block.ground-factory.name = Usine d'Unité Terrestre block.air-factory.name = Usine d'Unité Aérienne block.naval-factory.name = Usine d'Unité Navale @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Convoyeur de Masse block.payload-router.name = Routeur de Charge Utile block.disassembler.name = Disassembler block.silicon-crucible.name = Creuset de Silicium -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = bleu team.crux.name = rouge team.sharded.name = jaune @@ -1192,7 +1265,7 @@ block.battery.description = Stocke le surplus d'énergie et le redistribue en ca block.battery-large.description = Stocke bien plus d'énergie qu'une batterie normale. block.combustion-generator.description = Génère de l'énergie en brûlant du charbon ou d'autres matériaux inflammables. block.thermal-generator.description = Génère une grande quantité d'énergie à partir de zones de chaleur. -block.turbine-generator.description = Plus efficace qu'un générateur à combustion, mais requiert de l'eau. +block.steam-generator.description = Plus efficace qu'un générateur à combustion, mais requiert de l'eau. block.differential-generator.description = Génère de grandes quantités d'énergie en utilisant la différence de température entre le liquide cryogénique et la pyratite brûlante. block.rtg-generator.description = Un générateur thermo-électrique à radioisotope qui ne demande pas de refroidissement mais produit moins d'énergie qu'un réacteur à Thorium. block.solar-panel.description = Génère une faible quantité d'énergie grâce aux rayons du soleil. diff --git a/core/assets/bundles/bundle_fr_BE.properties b/core/assets/bundles/bundle_fr_BE.properties index aeff0d5cb8..f3d33f1028 100644 --- a/core/assets/bundles/bundle_fr_BE.properties +++ b/core/assets/bundles/bundle_fr_BE.properties @@ -20,6 +20,8 @@ gameover = Le base a été détruite. gameover.pvp = L'équipe[accent] {0}[] a gagnée ! highscore = [accent]Nouveau meilleur score ! copied = Copié. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Son load.map = Maps @@ -63,8 +65,7 @@ stat.delivered = Ressources transférées: stat.playtime = Temps Joué:[accent] {0} stat.rank = Rang Final: [accent]{0} -launcheditems = [accent]Ressources transférées -launchinfo = [unlaunched][[LAUNCH] votre core pour obtenir les objets indiqués en bleu. +globalitems = [accent]Global Items map.delete = Êtes-vous sûr de vouloir supprimer cette carte ?"[accent]{0}[]"? level.highscore = Meilleur score: [accent]{0} level.select = Sélection de niveau @@ -114,6 +115,7 @@ mod.disable = Désactive mod.content = Contenu: mod.delete.error = Unable to delete mod. File may be in use. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = À propos name = Nom: noname = Choisissez d'abord [accent]un pseudo[]. +planetmap = Planet Map +launchcore = Launch Core filename = Nom du fichier: unlocked = Nouveau bloc debloqué! completed = [accent]Terminé @@ -144,6 +148,7 @@ techtree = Arbre technologique research.list = [lightgray]Recherche: research = Recherche researched = [lightgray]{0} recherché. +research.progress = {0}% complete players = {0} joueurs players.single = {0} joueur players.search = search @@ -340,6 +345,11 @@ waves.load = Coller depuis le Presse-papiers waves.invalid = Vagues invalides dans le Presse-papiers. waves.copied = Vagues copiées. waves.none = Aucun ennemi défini.\nNotez que les dispositions vides seront automatiquement remplacées par la dispositions par défaut. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Modifier... @@ -459,7 +469,8 @@ locked = Verrouillé complete = [lightgray]Compléter: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Reprendre la partie en cours:\n[lightgray]{0} bestwave = [lightgray]Meilleur: {0} launch = Lancement @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} Débloquée. zone.requirement.complete = Vague {0} atteinte:\n{1} Exigences de la zone complétées @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Erreur réseau inconnue. error.bloom = Échec d'initialisation du flou lumineux.\nVotre appareil peut ne pas le supporter. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Graphiques settings.cleardata = Effacer les données du jeu... settings.clear.confirm = Êtes-vous sûr d'effacer ces données ?\n[scarlet]Ceci est irréversible settings.clearall.confirm = [scarlet]ATTENTION![]\nCet action effacera toutes les données , incluant les sauvegarges, les cartes, les déblocages et la configuration des touches.\nUne fois que vous aurez pressé 'Ok' le jeu effacera toutes les données et se fermera. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = En pause clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Vitesse de déplacement blocks.launchtime = Temps entre chaque lancement blocks.shootrange = Portée blocks.size = Taille +blocks.displaysize = Display Size blocks.liquidcapacity = Capacité en liquide blocks.powerrange = Distance de transmission +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Énergie utilisée blocks.powerdamage = Énergie/Dégâts @@ -574,11 +605,14 @@ blocks.boosteffect = Effet boostant blocks.maxunits = Maximum d'unitée active blocks.health = Santé blocks.buildtime = Temps de construction +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Coût de construction blocks.inaccuracy = Précision blocks.shots = Tirs blocks.reload = Tirs/Seconde blocks.ammo = Munition +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = Unité de liquide unit.powerunits = Unité d'énergie unit.degrees = degrés unit.seconds = secondes +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x vitesse unit.percent = % +unit.shieldhealth = shield health unit.items = Objets unit.thousands = k unit.millions = mil +unit.billions = b category.general = Général category.power = Énergie category.liquids = Liquides @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attaquer command.rally = Rally command.retreat = Retraite +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Mouvement X keybind.move_y.name = Mouvement Y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Placement en diagonal keybind.pick.name = Choisir un bloc keybind.break_block.name = Supprimer un bloc keybind.deselect.name = Déselectionner +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Tirer keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Temps de vague rules.waves = Vague rules.attack = Mode attaque +rules.buildai = AI Building rules.enemyCheat = Ressources infinies pour l'IA rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unités rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Objets content.liquid.name = Liquides @@ -830,9 +878,11 @@ liquid.water.name = Eau liquid.slag.name = Scorie liquid.oil.name = Pétrole liquid.cryofluid.name = Liquide Cryogénique + item.explosiveness = [lightgray]Explosivité: {0} item.flammability = [lightgray]Inflammabilité: {0} item.radioactivity = [lightgray]Radioactivité: {0} + unit.health = [lightgray]Santé: {0} unit.speed = [lightgray]Vitesse: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Chenille unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sable rocheux block.grass.name = Herbe block.slag.name = Slag block.salt.name = Sel -block.saltrocks.name = Roches de sel +block.salt-wall.name = Salt Wall block.pebbles.name = Cailloux block.tendrils.name = Vrilles -block.sandrocks.name = Roche de sableuse +block.sand-wall.name = Sand Wall block.spore-pine.name = Pin sporifère -block.sporerocks.name = Roche sporifère -block.rock.name = Roche -block.snowrock.name = Roche enneigée +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Schiste block.shale-boulder.name = Rocher de schiste block.moss.name = Mousse block.shrubs.name = Arbustes block.spore-moss.name = Mousse sporifère -block.shalerocks.name = Roche de schiste +block.shale-wall.name = Shale Wall block.scrap-wall.name = Mur de ferraille block.scrap-wall-large.name = Grand mur de ferraille block.scrap-wall-huge.name = Enorme mur de ferraille @@ -919,13 +979,17 @@ block.craters.name = Cratères block.sand-water.name = Eau (sable) block.darksand-water.name = Eau (sable noir) block.char.name = Carboniser -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Neige glacée -block.rocks.name = Roche -block.icerocks.name = Roches de glace -block.snowrocks.name = Roches de neige -block.dunerocks.name = Roches de sable +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pin +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Arbre blanc mort block.white-tree.name = Arbre blanc block.spore-cluster.name = Grappe de spores @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Panneau noir 4 block.dark-panel-5.name = Panneau noir 5 block.dark-panel-6.name = Panneau noir 6 block.dark-metal.name = Métal noir -block.ignarock.name = Roche d'igna +block.basalt.name = Basalt block.hotrock.name = Roche chaude block.magmarock.name = Roche de magma -block.cliffs.name = Falaises block.copper-wall.name = Mur de cuivre block.copper-wall-large.name = Grand mur de cuivre block.titanium-wall.name = Mur de titane @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Batterie block.battery-large.name = Batterie large block.combustion-generator.name = Générateur à combustion -block.turbine-generator.name = Générateur à turbine +block.steam-generator.name = Générateur à turbine block.differential-generator.name = Générateur différentiel block.impact-reactor.name = Réacteur à impact block.mechanical-drill.name = Foreuse mécanique @@ -1055,6 +1118,7 @@ block.container.name = Conteneur block.launch-pad.name = Rampe de lancement block.launch-pad-large.name = Grande rampe de lancement block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Bleu team.crux.name = red team.sharded.name = orange @@ -1192,7 +1265,7 @@ block.battery.description = Stocke l’énergie chaque fois qu’il ya abondance block.battery-large.description = Stocke beaucoup plus d'énergie qu'une batterie ordinaire. block.combustion-generator.description = Génère de l'énergie en brûlant du pétrole ou des matériaux inflammables. block.thermal-generator.description = Génère une grande quantité d'énergie grâce à la lave. -block.turbine-generator.description = Plus efficace qu'un générateur de combustion, mais nécessite de l'eau supplémentaire. +block.steam-generator.description = Plus efficace qu'un générateur de combustion, mais nécessite de l'eau supplémentaire. block.differential-generator.description = Génère de grandes quantités d'énergie. Utilise la différence de température entre le cryofluide et la pyratite en combustion. block.rtg-generator.description = Générateur thermoélectrique à radio-isotopes ne nécessitant pas de refroidissement mais fournissant moins d'énergie qu'un réacteur à thorium. block.solar-panel.description = Fournit une petite quantité d'énergie grâce au soleil. diff --git a/core/assets/bundles/bundle_hu.properties b/core/assets/bundles/bundle_hu.properties index 6c8e0bd47d..76522053f7 100644 --- a/core/assets/bundles/bundle_hu.properties +++ b/core/assets/bundles/bundle_hu.properties @@ -20,6 +20,8 @@ gameover = Vége a játéknak gameover.pvp = A[accent] {0}[] csapat nyert! highscore = [accent]Új rekord! copied = Másolva. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Hangok load.map = Térképek @@ -63,8 +65,7 @@ stat.delivered = Elindított erőforrások: stat.playtime = Játékidő:[accent] {0} stat.rank = Végső értékelés: [accent]{0} -launcheditems = [accent]Elindított elemek -launchinfo = [unlaunched][[INDÍTSD EL] a magot hogy megszerezd a kékkel jelölt erőforrásokat. +globalitems = [accent]Global Items map.delete = Biztos, hogy törölni akarod a "[accent]{0}[]" térképet? level.highscore = Rekord: [accent]{0} level.select = Pálya választása @@ -114,6 +115,7 @@ mod.disable = Letiltás mod.content = Content: mod.delete.error = Nem lehet törölni a Modot. Lehet, hogy egy másik folyamat használja. mod.requiresversion = [scarlet]Minimális játék verzió: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Hiányzó függőségek: {0} mod.erroredcontent = [scarlet]Tartalom hiba mod.errors = Hiba történt a tartalom betöltése közben. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Közreműködők name = Név: noname = Válassz egy[accent] nevet[] előbb. +planetmap = Planet Map +launchcore = Launch Core filename = Fájl név: unlocked = Új tartalom kinyitva! completed = [accent]Kész @@ -144,6 +148,7 @@ techtree = Tech Tree research.list = [lightgray]Fedezd fel: research = Felfedezés researched = [lightgray]{0} felfedezve. +research.progress = {0}% complete players = {0} játékos players.single = {0} játékos players.search = keresés @@ -340,6 +345,11 @@ waves.load = Load from Clipboard waves.invalid = Invalid waves in clipboard. waves.copied = Waves copied. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Edit... @@ -459,7 +469,8 @@ locked = Zárva complete = [lightgray]Complete: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} launch = < INDÍTÁS > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Requirement for {0} completed:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Graphics settings.cleardata = Clear Game Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Paused > clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Size +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Health blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees unit.seconds = seconds +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil +unit.billions = b category.general = General category.power = Power category.liquids = Liquids @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move X keybind.move_y.name = Move Y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Liquids @@ -830,9 +878,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Robbanékonyság: {0}% item.flammability = [lightgray]Gyúlékonyság: {0}% item.radioactivity = [lightgray]Radioaktivitás: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Sebesség: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -919,13 +979,17 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Dark Panel 4 block.dark-panel-5.name = Dark Panel 5 block.dark-panel-6.name = Dark Panel 6 block.dark-metal.name = Dark Metal -block.ignarock.name = Igna Rock +block.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Steam Generator +block.steam-generator.name = Steam Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blue team.crux.name = red team.sharded.name = orange @@ -1192,7 +1265,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_in_ID.properties b/core/assets/bundles/bundle_in_ID.properties index 7d101e0476..42a19d4934 100644 --- a/core/assets/bundles/bundle_in_ID.properties +++ b/core/assets/bundles/bundle_in_ID.properties @@ -21,6 +21,7 @@ gameover.pvp = Tim[accent] {0}[] menang! highscore = [accent]Rekor Baru! copied = Tersalin. indevpopup = [accent]v6[] saat ini dalam versi [accent]alpha[].\n[lightgray]Artinya:[]\n[scarlet]- Kampanye belum sepenuhnya selesai[]\n- Beberapa konten tidak tersedia\n - Beberapa [scarlet]Unit AI[] tidak sepenuhnya bekerja\n- Beberapa unit belum sepenuhnya selesai\n- Semua yang kamu lihat dapat berubah atau dihapus sewaktu-waktu.\n\nLaporkan bug atau crash di [accent]Github[]. +indev.notready = Bagian tersebut saat ini belum siap load.sound = Suara load.map = Peta @@ -51,9 +52,10 @@ schematic.copy.import = Impor dari papan klip schematic.shareworkshop = Bagikan di Workshop schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Balik Skema schematic.saved = Skema telah disimpan. -schematic.delete.confirm = Skema ini akan benar - benar dihapus +schematic.delete.confirm = Skema ini akan benar-benar dihapus. schematic.rename = Ganti nama Skema schematic.info = {0}x{1}, {2} blok +schematic.disabled = [scarlet]Skema dilarang[]\nAnda tidak diperbolehkan untuk menggunakan skema di [accent]peta[] atau [accent]server ini. stat.wave = Gelombang Terkalahkan:[accent] {0} stat.enemiesDestroyed = Musuh Terhancurkan:[accent] {0} @@ -469,18 +471,11 @@ locked = Terkunci complete = [lightgray]Mencapai: requirement.wave = Capai gelombang {0} dalam {1} requirement.core = Hancurkan inti musuh dalam {0} -requirement.unlock = Buka {0} +requirement.research = Kembangkan {0} requirement.capture = Kuasai {0} -resume = Lanjutkan Zona:\n[lightgray]{0} bestwave = [lightgray]Gelombang Terbaik: {0} -#TODO fix/remove this -launch = < MELUNCUR > launch.text = Luncurkan -launch.title = Berhasil Meluncur -launch.next = [lightgray]kesempatan berikutnya di gelombang {0} -launch.unable2 = [scarlet]Tidak dapat MELUNCUR.[] -launch.confirm = Ini akan meluncurkan semua sumber daya di inti.\nAnda tidak bisa kembali lagi ke tempat ini. -launch.skip.confirm = Jika Anda lewati sekarang, Anda tidak akan dapat meluncur hingga gelombang berikutnya. +campaign.multiplayer = While playing multiplayer in campaign, you can only research using items from [accent]your[] sectors, [scarlet]not[] the host's sector that you are on right now.\n\nTo get items to [accent]your[] sectors in multiplayer, use a [accent]launch pad[]. uncover = Buka configure = Konfigurasi Muatan #TODO @@ -488,6 +483,7 @@ loadout = Muatan resources = Sumber Daya bannedblocks = Balok yang dilarang addall = Tambah Semua +launch.destination = Destination: {0} configure.invalid = Jumlah harus berupa angka diantara 0 dan {0}. zone.unlocked = [lightgray]{0} terbuka. zone.requirement.complete = Gelombang {0} terselesaikan:\nPersyaratan zona {1} tercapai. @@ -520,6 +516,8 @@ sectors.production = Produksi: sectors.stored = Terisi: sectors.resume = Lanjutkan sectors.launch = Luncurkan +sectors.select = Pilih +sectors.nonelaunch = [lightgray]tidak ada #NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway sector.groundZero.name = Ground Zero @@ -598,6 +596,7 @@ blocks.powerconnections = Koneksi Maksimal blocks.poweruse = Penggunaan Tenaga blocks.powerdamage = Tenaga/Pukulan blocks.itemcapacity = Kapasitas Item +blocks.memorycapacity = Kapasitas Memori blocks.basepowergeneration = Basis Generasi Tenaga blocks.productiontime = Waktu Produksi blocks.repairtime = Waktu Memperbaiki Blok Penuh @@ -615,6 +614,8 @@ blocks.inaccuracy = Jarak Melenceng blocks.shots = Tembakan blocks.reload = Tembakan/Detik blocks.ammo = Amunisi +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Membutuhkan Bor yang Lebih Baik bar.noresources = Sumber Daya Tidak Ditemukan @@ -662,6 +663,7 @@ unit.persecond = /detik unit.perminute = /menit unit.timesspeed = x kecepatan unit.percent = % +unit.shieldhealth = shield health unit.items = item unit.thousands = rb unit.millions = jt @@ -789,6 +791,9 @@ keybind.diagonal_placement.name = Penaruhan Diagonal keybind.pick.name = Memilih Blok keybind.break_block.name = Menghancurkan Blok keybind.deselect.name = Batal Memilih +keybind.pickupCargo.name = Muat Kargo +keybind.dropCargo.name = Turunkan Kargo +keybind.command.name = Perintah keybind.shoot.name = Menembak keybind.zoom.name = Perbesar keybind.menu.name = Menu @@ -820,6 +825,7 @@ mode.custom = Pengaturan Modifikasi rules.infiniteresources = Sumber Daya Tak Terbatas rules.reactorexplosions = Ledakan Reaktor +rules.schematic = Skema Diperbolehkan rules.wavetimer = Pengaturan Waktu Gelombang rules.waves = Gelombang rules.attack = Mode Penyerangan @@ -876,9 +882,11 @@ liquid.water.name = Air liquid.slag.name = Terak liquid.oil.name = Minyak liquid.cryofluid.name = Cairan Dingin + item.explosiveness = [lightgray]Tingkat Keledakan: {0}% item.flammability = [lightgray]Tingkat Kebakaran: {0}% item.radioactivity = [lightgray]Tingkat Radioaktif: {0}% + unit.health = [lightgray]Darah: {0} unit.speed = [lightgray]Kecepatan: {0} unit.weapon = [lightgray]Senjata: {0} @@ -911,14 +919,20 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma unit.scepter.name = Scepter unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus block.resupply-point.name = Titik Pemasok Ulang block.parallax.name = Parallax @@ -927,21 +941,21 @@ block.sand-boulder.name = Batu Pasir block.grass.name = Rumput block.slag.name = Slag block.salt.name = Garam -block.saltrocks.name = Batu Garam +block.salt-wall.name = Salt Wall block.pebbles.name = Kerikil block.tendrils.name = Sulur -block.sandrocks.name = Batu Pasir +block.sand-wall.name = Sand Wall block.spore-pine.name = Cemara Spora -block.sporerocks.name = Batu Spora -block.rock.name = Batu -block.snowrock.name = Batu Salju +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pinus Salju block.shale.name = Serpihan block.shale-boulder.name = Serpihan Batu Besar block.moss.name = Lumut block.shrubs.name = Semak-Semak block.spore-moss.name = Lumut Spora -block.shalerocks.name = Batu Serpihan +block.shale-wall.name = Shale Wall block.scrap-wall.name = Dinding Kepingan block.scrap-wall-large.name = Dinding Kepingan Besar 1 block.scrap-wall-huge.name = Dinding Kepingan Besar 2 @@ -979,6 +993,7 @@ block.dune-wall.name = Dinding Pasir block.pine.name = Cemara block.dirt.name = Tanah block.dirt-wall.name = Dinding Tanah +block.mud.name = Lumpur block.white-tree-dead.name = Pohon Putih Mati block.white-tree.name = Pohon Putih block.spore-cluster.name = Kumpulan Spora @@ -997,7 +1012,6 @@ block.dark-metal.name = Besi Gelap block.basalt.name = Basal block.hotrock.name = Batu Panas block.magmarock.name = Batu Lahar -block.cliffs.name = Tebing block.copper-wall.name = Dinding Tembaga block.copper-wall-large.name = Dinding Tembaga Besar block.titanium-wall.name = Dinding Titanium @@ -1129,6 +1143,7 @@ block.hyper-processor.name = Prosesor Cepat block.logic-display.name = Tampilan Logika block.large-logic-display.name = Tampilan Logika Besar block.memory-cell.name = Sel Memori +block.memory-bank.name = Bank Memori team.blue.name = biru team.crux.name = merah diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index 93e2de29d2..bacb61ebdd 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -20,6 +20,8 @@ gameover = Il Nucleo è stato distrutto. gameover.pvp = La squadra[accent] {0}[] ha vinto! highscore = [accent]Nuovo record! copied = Copiato. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Suoni load.map = Mappe @@ -63,8 +65,7 @@ stat.delivered = Risorse Lanciate: stat.playtime = Tempo Di Gioco:[accent] {0} stat.rank = Livello Finale: [accent]{0} -launcheditems = [accent]Oggetti Lanciati -launchinfo = [unlaunched][[LANCIA] il tuo Nucleo per ottenere gli oggetti indicati in blu. +globalitems = [accent]Global Items map.delete = Sei sicuro di voler eliminare la mappa '[accent]{0}[]'? level.highscore = Miglior Punteggio: [accent]{0} level.select = Selezione del Livello @@ -114,6 +115,7 @@ mod.disable = Disabilita mod.content = Contenuto: mod.delete.error = Impossibile eliminare questa mod. Il file potrebbe essere in uso. mod.requiresversion = [scarlet]Versione minima richiesta: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Dipendenze mancanti: {0} mod.erroredcontent = [scarlet]Errori di Contenuto mod.errors = Si sono verificati degli errori durante il caricamento del contenuto. @@ -137,6 +139,8 @@ mod.scripts.disable = Il tuo dispositivo non supporta le mod con gli script. Dev about.button = Info name = Nome: noname = Scegli un[accent] nome[] prima di unirti. +planetmap = Planet Map +launchcore = Launch Core filename = Nome File: unlocked = Nuovo contenuto sbloccato! completed = [accent]Completato @@ -144,6 +148,7 @@ techtree = Albero Scoperta research.list = [lightgray]Ricerca: research = Ricerca researched = [lightgray]{0} cercati. +research.progress = {0}% complete players = {0} giocatori online players.single = {0} giocatore online players.search = Cerca @@ -340,6 +345,11 @@ waves.load = Carica dagli Appunti waves.invalid = Ondate dagli appunti non valide. waves.copied = Ondate copiate. waves.none = Nessun nemico impostato.\nNota che le disposizioni di ondate vuote verranno automaticamente rimpiazzate con la disposizione predefinita. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Dettagli... edit = Modifica... @@ -459,7 +469,8 @@ locked = Bloccato complete = [lightgray]Completato: requirement.wave = Raggiungi l'ondata {0} in {1} requirement.core = Distruggi il Nucleo Nemico in {0} -requirement.unlock = Sblocca {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Riprendi Zona:\n[lightgray]{0} bestwave = [lightgray]Ondata Migliore: {0} launch = < DECOLLARE > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Blocchi Banditi addall = Aggiungi Tutti +launch.destination = Destination: {0} configure.invalid = Il valore dev'essere un numero compresto tra 0 e {0}. zone.unlocked = [lightgray]{0} sbloccata. zone.requirement.complete = Ondata {0} raggiunta:\n[lightgray]{1}[] requisiti di zona soddisfatti. @@ -496,6 +508,20 @@ error.io = Errore I/O di rete. error.any = Errore di rete sconosciuto. error.bloom = Errore dell'avvio delle shaders.\nIl tuo dispositivo potrebbe non supportarle. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafica settings.cleardata = Elimina Dati di Gioco settings.clear.confirm = Sei sicuro di voler cancellare i dati?\nQuesta operazione non può essere annullata! settings.clearall.confirm = [scarlet]ATTENZIONE![]\nQuesto cancellerà tutti i dati, inclusi salvataggi, mappe, oggetti sbloccati ed impostazioni.\nDopo aver premuto su 'ok' il gioco eliminerà i dati e si chiuderà automaticamente. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< In Pausa > clear = Pulisci banned = [scarlet]Bandito @@ -557,8 +585,11 @@ blocks.itemsmoved = Velocità di Movimento blocks.launchtime = Tempo fra Decolli blocks.shootrange = Raggio blocks.size = Dimensioni +blocks.displaysize = Display Size blocks.liquidcapacity = Capacità del Liquido blocks.powerrange = Raggio Energia +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Connessioni Massime blocks.poweruse = Utilizzo Energia blocks.powerdamage = Energia/Danno @@ -574,11 +605,14 @@ blocks.boosteffect = Effetto Boost blocks.maxunits = Unità Attive Max blocks.health = Salute blocks.buildtime = Tempo di Costruzione +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Costo di Costruzione blocks.inaccuracy = Inaccuratezza blocks.shots = Colpi blocks.reload = Ricarica blocks.ammo = Munizioni +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Miglior Trivella Richiesta bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = unità liquidi unit.powerunits = unità energia unit.degrees = gradi unit.seconds = secondi +unit.minutes = mins unit.persecond = /s +unit.perminute = /min unit.timesspeed = x velocità unit.percent = % +unit.shieldhealth = shield health unit.items = oggetti unit.thousands = k unit.millions = mln +unit.billions = b category.general = Generali category.power = Energia category.liquids = Liquidi @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attacca command.rally = Guardia command.retreat = Ritirata +command.idle = Idle placement.blockselectkeys = \n[lightgray]Tasto: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Attiva/Disattiva Stato Blocchi keybind.move_x.name = Muovi Orizzontalmente keybind.move_y.name = Muovi Verticalmente keybind.mouse_move.name = Segui il Mouse +keybind.pan.name = Pan View keybind.boost.name = Scatto keybind.schematic_select.name = Seleziona Regione keybind.schematic_menu.name = Menu Schematica @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Posiziona Diagonalmente keybind.pick.name = Scegli Blocco keybind.break_block.name = Rompi Blocco keybind.deselect.name = Deseleziona +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Spara keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Esplosioni Reattore rules.wavetimer = Timer Ondate rules.waves = Ondate rules.attack = Modalità Attacco +rules.buildai = AI Building rules.enemyCheat = Risorse AI Infinite rules.blockhealthmultiplier = Moltiplicatore Danno Blocco rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unità rules.title.experimental = Sperimentale rules.title.environment = Environment rules.lighting = Illuminazione +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Illuminazione\nAmbientale -rules.solarpowermultiplier = Moltiplicatore Energia Solare +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Oggetti content.liquid.name = Liquidi @@ -830,9 +878,11 @@ liquid.water.name = Acqua liquid.slag.name = Scoria liquid.oil.name = Petrolio liquid.cryofluid.name = Criofluido + item.explosiveness = [lightgray]Esplosività: {0} item.flammability = [lightgray]Infiammabilità: {0} item.radioactivity = [lightgray]Radioattività: {0} + unit.health = [lightgray]Salute: {0} unit.speed = [lightgray]Velocità: {0} unit.weapon = [lightgray]Armi: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Strisciatore unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Scogliera block.sand-boulder.name = Masso di Sabbia block.grass.name = Erba block.slag.name = Scoria block.salt.name = Sale -block.saltrocks.name = Rocce Salate +block.salt-wall.name = Salt Wall block.pebbles.name = Ciottoli block.tendrils.name = Viticci -block.sandrocks.name = Rocce Sabbiose +block.sand-wall.name = Sand Wall block.spore-pine.name = Pino di Spore -block.sporerocks.name = Roccia di Spore -block.rock.name = Masso -block.snowrock.name = Masso Innevato +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pino Innevato block.shale.name = Scisto block.shale-boulder.name = Masso di Scisto block.moss.name = Muschio block.shrubs.name = Arbusti block.spore-moss.name = Muschio di Spore -block.shalerocks.name = Rocce di Scisto +block.shale-wall.name = Shale Wall block.scrap-wall.name = Muro di Rottami block.scrap-wall-large.name = Muro di Rottami Grande block.scrap-wall-huge.name = Muro di Rottami Enorme @@ -919,13 +979,17 @@ block.craters.name = Crateri block.sand-water.name = Acqua Sabbiosa block.darksand-water.name = Acqua Sabbiosa Scura block.char.name = Carbone -block.holostone.name = Pietra Holo +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Neve Ghiacciata -block.rocks.name = Rocce -block.icerocks.name = Rocce Ghiacciate -block.snowrocks.name = Rocce Innevate -block.dunerocks.name = Rocce delle Dune +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pino +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Albero Bianco Morto block.white-tree.name = Albero Morto block.spore-cluster.name = Agglomerato di Spore @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Pannello Scuro 4 block.dark-panel-5.name = Pannello Scuro 5 block.dark-panel-6.name = Pannello Scuro 6 block.dark-metal.name = Metallo Scuro -block.ignarock.name = Roccia Ignea +block.basalt.name = Basalt block.hotrock.name = Roccia Bollente block.magmarock.name = Roccia Magmatica -block.cliffs.name = Scogliere block.copper-wall.name = Muro di Rame block.copper-wall-large.name = Muro di Rame Grande block.titanium-wall.name = Muro di Titanio @@ -993,7 +1056,7 @@ block.diode.name = Diodo block.battery.name = Batteria block.battery-large.name = Batteria Grande block.combustion-generator.name = Generatore a Combustibile -block.turbine-generator.name = Turbina a Vapore +block.steam-generator.name = Turbina a Vapore block.differential-generator.name = Generatore Differenziale block.impact-reactor.name = Reattore ad Impatto block.mechanical-drill.name = Trivella Meccanica @@ -1055,6 +1118,7 @@ block.container.name = Contenitore block.launch-pad.name = Ascensore Spaziale block.launch-pad-large.name = Ascensore Spaziale Avanzato block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blu team.crux.name = rosso team.sharded.name = arancione @@ -1192,7 +1265,7 @@ block.battery.description = Accumula energia ogni volta che c'è abbondanza e fo block.battery-large.description = Immagazzina molta più energia di una normale batteria. block.combustion-generator.description = Genera energia bruciando combustibile. block.thermal-generator.description = Genera una grande quantità di energia dalla lava. -block.turbine-generator.description = Più efficiente di un generatore a combustione, ma richiede l'aggiunta di acqua. +block.steam-generator.description = Più efficiente di un generatore a combustione, ma richiede l'aggiunta di acqua. block.differential-generator.description = Genera grandi quantità di energia. Utilizza la differenza di temperatura tra criofluido e pirite in combustione. block.rtg-generator.description = Un generatore che sfrutta il calore del decadimento di materiale radioattivo per produrre energia.\nNon richiede raffreddamento ma fornisce meno energia di un reattore al torio. block.solar-panel.description = Fornisce una piccola quantità di energia dal sole. diff --git a/core/assets/bundles/bundle_ja.properties b/core/assets/bundles/bundle_ja.properties index 933ae1992a..c5d498b872 100644 --- a/core/assets/bundles/bundle_ja.properties +++ b/core/assets/bundles/bundle_ja.properties @@ -20,6 +20,8 @@ gameover = ゲームオーバー gameover.pvp = [accent] {0}[] チームの勝利! highscore = [accent]ハイスコアを更新! copied = コピーしました。 +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = サウンド load.map = マップ @@ -63,8 +65,7 @@ stat.delivered = 獲得した資源: stat.playtime = プレイ時間:[accent] {0} stat.rank = 最終ランク: [accent]{0} -launcheditems = [accent]回収したアイテム -launchinfo = [unlaunched][[発射] コアを発射すると青色で示されたアイテムを入手します。 +globalitems = [accent]Global Items map.delete = マップ "[accent]{0}[]" を削除してもよろしいですか? level.highscore = ハイスコア: [accent]{0} level.select = レベル選択 @@ -114,6 +115,7 @@ mod.disable = 無効化 mod.content = コンテンツ: mod.delete.error = MODを削除することができませんでした。 mod.requiresversion = [scarlet]Modが要求する最低バージョン: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]依存関係がありません。: {0} mod.erroredcontent = [scarlet]コンテンツエラー mod.errors = コンテンツの読み込み中にエラーが発生しました。 @@ -137,6 +139,8 @@ mod.scripts.disable = お使いのデバイスはScriptを使用したModをサ about.button = 情報 name = 名前: noname = [accent]プレイヤー名[]を入力してください。 +planetmap = Planet Map +launchcore = Launch Core filename = ファイル名: unlocked = 新しい要素をアンロック! completed = [accent]完了 @@ -144,6 +148,7 @@ techtree = テックツリー research.list = [lightgray]研究: research = 研究 researched = [lightgray]{0} の研究が完了しました +research.progress = {0}% complete players = {0} 人がオンライン players.single = {0} 人がオンライン players.search = 検索 @@ -340,6 +345,11 @@ waves.load = クリップボードから読み込む waves.invalid = クリップボードのウェーブは無効なウェーブです。 waves.copied = ウェーブをコピーしました。 waves.none = 敵が定義されていません。\n空のウェーブレイアウトはデフォルトのレイアウトに自動的に置き換えられます。 + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]<デフォルト> details = 詳細... edit = 編集... @@ -459,7 +469,8 @@ locked = ロック complete = [lightgray]達成済み: requirement.wave = {1} でウェーブ {0} に到達 requirement.core = {0} の敵のコアを破壊 -requirement.unlock = ロック解除 {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = 再開:\n[lightgray]{0} bestwave = [lightgray]最高ウェーブ: {0} launch = < 発射 > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = 禁止ブロック addall = すべて追加 +launch.destination = Destination: {0} configure.invalid = 値は 0 から {0} の間でなければなりません。 zone.unlocked = [lightgray]{0} がアンロックされました. zone.requirement.complete = ウェーブ {0} を達成:\n{1} の開放条件を達成しました。 @@ -496,6 +508,20 @@ error.io = ネットワークエラーです。 error.any = 不明なネットワークエラーです。 error.bloom = ブルームの初期化に失敗しました。\n恐らくあなたのデバイスではブルームがサポートされていません。 +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = グラフィック settings.cleardata = データを削除... settings.clear.confirm = データを削除してもよろしいですか?\nこれを元に戻すことはできません! settings.clearall.confirm = [scarlet]警告![]\nこれはすべてのデータが削除されます。これにはセーブデータ、マップ、アンロック、キーバインドが含まれます。\n「ok」 を押すと、すべてのデータが削除され、自動的に終了します。 +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< ポーズ > clear = 消去 banned = [scarlet]使用禁止 @@ -557,8 +585,11 @@ blocks.itemsmoved = 輸送速度 blocks.launchtime = 発射の待機時間 blocks.shootrange = 範囲 blocks.size = 大きさ +blocks.displaysize = Display Size blocks.liquidcapacity = 液体容量 blocks.powerrange = 電力範囲 +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = 最大接続数 blocks.poweruse = 電力使用量 blocks.powerdamage = 電力/ダメージ @@ -574,11 +605,14 @@ blocks.boosteffect = ブースト効果 blocks.maxunits = 最大ユニット数 blocks.health = 耐久値 blocks.buildtime = 建設時間 +blocks.maxconsecutive = Max Consecutive blocks.buildcost = 建設費用 blocks.inaccuracy = 誤差 blocks.shots = ショット blocks.reload = リロード速度 blocks.ammo = 弾薬 +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = より高性能なドリルを使用してください bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = 液体 unit.powerunits = 電力 unit.degrees = 度 unit.seconds = 秒 +unit.minutes = mins unit.persecond = /秒 +unit.perminute = /min unit.timesspeed = 倍の速度 unit.percent = % +unit.shieldhealth = shield health unit.items = アイテム unit.thousands = k unit.millions = mil +unit.billions = b category.general = 一般 category.power = 電力 category.liquids = 液体 @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = 攻撃 command.rally = 結集 command.retreat = 後退 +command.idle = Idle placement.blockselectkeys = \n[lightgray]キー: [{0}, keybind.respawn.name = リスポーン keybind.control.name = ユニットをコントロール @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = ブロックの状態表示の切り替え keybind.move_x.name = 左右移動 keybind.move_y.name = 上下移動 keybind.mouse_move.name = マウスを追う +keybind.pan.name = Pan View keybind.boost.name = ブースト keybind.schematic_select.name = 地域の選択 keybind.schematic_menu.name = 設計図メニュー @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = 斜め設置 keybind.pick.name = ブロックの選択 keybind.break_block.name = ブロックの破壊 keybind.deselect.name = 選択解除 +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = ショット keybind.zoom.name = ズーム keybind.menu.name = メニュー @@ -782,6 +825,7 @@ rules.reactorexplosions = リアクターの爆発 rules.wavetimer = ウェーブの自動進行 rules.waves = ウェーブ rules.attack = アタックモード +rules.buildai = AI Building rules.enemyCheat = 敵(赤チーム)の資源の無限化 rules.blockhealthmultiplier = ブロックの体力倍率 rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = ユニット rules.title.experimental = 実験的なゲームプレイ rules.title.environment = Environment rules.lighting = 霧 +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = 霧の色 -rules.solarpowermultiplier = 太陽光効率 +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = アイテム content.liquid.name = 液体 @@ -830,9 +878,11 @@ liquid.water.name = 水 liquid.slag.name = スラグ liquid.oil.name = 石油 liquid.cryofluid.name = 冷却水 + item.explosiveness = [lightgray]爆発性: {0}% item.flammability = [lightgray]可燃性: {0}% item.radioactivity = [lightgray]放射能: {0}% + unit.health = [lightgray]耐久値: {0} unit.speed = [lightgray]速度: {0} unit.weapon = [lightgray]武器: {0} @@ -856,6 +906,7 @@ unit.crawler.name = クローラー unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = 崖 block.sand-boulder.name = 巨大な礫 block.grass.name = 草 block.slag.name = スラグ block.salt.name = 岩塩氷河 -block.saltrocks.name = 岩塩 +block.salt-wall.name = Salt Wall block.pebbles.name = 小石 block.tendrils.name = つる -block.sandrocks.name = 砂岩 +block.sand-wall.name = Sand Wall block.spore-pine.name = 胞子の松の木 -block.sporerocks.name = 胞子の岩 -block.rock.name = 岩 -block.snowrock.name = 雪の積もった岩 +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = 松の木 block.shale.name = 泥板岩 block.shale-boulder.name = 泥板岩の丸石 block.moss.name = コケ block.shrubs.name = 低木 block.spore-moss.name = 胞子のコケ -block.shalerocks.name = 泥板岩の岩 +block.shale-wall.name = Shale Wall block.scrap-wall.name = スクラップの壁 block.scrap-wall-large.name = 大きなスクラップの壁 block.scrap-wall-huge.name = とても大きなスクラップの壁 @@ -919,13 +979,17 @@ block.craters.name = クレーター block.sand-water.name = 濁った水 block.darksand-water.name = 黒い砂で濁った水 block.char.name = 焦げ跡 -block.holostone.name = ホロストーン +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = 雪氷 -block.rocks.name = 岩 -block.icerocks.name = 氷岩 -block.snowrocks.name = 雪の積もった岩 -block.dunerocks.name = 砂丘の岩 +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = 松の木 +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = 白い枯れた樹木 block.white-tree.name = 白い樹木 block.spore-cluster.name = 胞子の房 @@ -941,10 +1005,9 @@ block.dark-panel-4.name = ダークパネル 4 block.dark-panel-5.name = ダークパネル 5 block.dark-panel-6.name = ダークパネル 6 block.dark-metal.name = ダークメタル -block.ignarock.name = イグナロック +block.basalt.name = Basalt block.hotrock.name = ホットロック block.magmarock.name = マグマの岩 -block.cliffs.name = 崖 block.copper-wall.name = 銅の壁 block.copper-wall-large.name = 巨大な銅の壁 block.titanium-wall.name = チタンの壁 @@ -993,7 +1056,7 @@ block.diode.name = バッテリーダイオード block.battery.name = バッテリー block.battery-large.name = 大型バッテリー block.combustion-generator.name = 火力発電機 -block.turbine-generator.name = タービン発電機 +block.steam-generator.name = タービン発電機 block.differential-generator.name = 差動発電機 block.impact-reactor.name = インパクトリアクター block.mechanical-drill.name = 機械ドリル @@ -1055,6 +1118,7 @@ block.container.name = コンテナー block.launch-pad.name = 発射台 block.launch-pad-large.name = 大型発射台 block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = ブルー team.crux.name = レッド team.sharded.name = オレンジ @@ -1192,7 +1265,7 @@ block.battery.description = 余分な電力の充電して、貯めておくこ block.battery-large.description = 通常のバッテリーよりもたくさんの電力を溜めておくことができます。 block.combustion-generator.description = 石油や可燃性の物質を燃やして発電します。 block.thermal-generator.description = 溶岩から大量の電力を発電します。 -block.turbine-generator.description = 水を使って火力発電機より効率的に発電します。 +block.steam-generator.description = 水を使って火力発電機より効率的に発電します。 block.differential-generator.description = 大量の電力を生成します。冷却水と燃焼したピラタイトの温度差を利用します。 block.rtg-generator.description = トリウムリアクターよりも発電量は少ないですが、冷却を必要としない放射性同位体熱発電機(RTG)です。 block.solar-panel.description = 太陽光から少量の電力を発電します。 diff --git a/core/assets/bundles/bundle_ko.properties b/core/assets/bundles/bundle_ko.properties index cedeaaf039..f0b2e73317 100644 --- a/core/assets/bundles/bundle_ko.properties +++ b/core/assets/bundles/bundle_ko.properties @@ -20,6 +20,8 @@ gameover = 게임 오버 gameover.pvp = [accent]{0}[] 팀이 승리했습니다! highscore = [accent]새로운 최고 점수! copied = 복사됨. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = 소리 load.map = 맵 @@ -63,8 +65,7 @@ stat.delivered = 얻은 자원: stat.playtime = 플레이 시간: [accent] {0} stat.rank = 최종 순위: [accent]{0} -launcheditems = [accent]보유 자원 -launchinfo = [출격되지 않음][[출격]파랑색으로 표시된 자원들을 얻습니다. +globalitems = [accent]Global Items map.delete = 정말로 "[accent]{0}[]" 맵을 삭제하시겠습니까? level.highscore = 최고 점수: [accent]{0} level.select = 맵 선택 @@ -114,6 +115,7 @@ mod.disable = 비활성화 mod.content = 콘텐츠: mod.delete.error = 모드를 삭제할 수 없습니다. 파일이 사용 중일 수 있습니다. mod.requiresversion = [scarlet]필요한 최소 게임 버전: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]누락된 요구 모드: {0} mod.erroredcontent = [scarlet]콘텐츠 오류 mod.errors = 콘텐츠를 로드하는 동안 오류가 발생함. @@ -126,7 +128,7 @@ mod.import = 모드 가져오기 mod.import.file = 파일 가져오기 mod.import.github = Github 에서 모드 가져오기 mod.jarwarn = [scarlet]JAR 모드는 안전하지 않습니다.[]\n신뢰할 수 있는 소스에서 얻은 모드만을 사용해야 합니다! -mod.item.remove = 이 아이템은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요. +mod.item.remove = 이 자원은[accent] '{0}' 모드의 일부입니다. 이를 제거하려면 해당 모드를 제거하세요. mod.remove.confirm = 이 모드가 삭제될 것입니다. mod.author = [lightgray]제작자:[] {0} mod.missing = 이 저장 파일에는 최근에 업데이트되었거나 더 이상 설치되지 않은 모드가 포함되어 있습니다. 저장 파일이 손상될 수 있습니다. 정말로 불러 오시겠습니까?\n[lighthray]모드들:\n{0} @@ -137,6 +139,8 @@ mod.scripts.disable = 이 기기는 스크립트가 있는 모드를 지원하 about.button = 정보 name = 이름: noname = 먼저 [accent]플레이어 이름[]을 설정하세요. +planetmap = Planet Map +launchcore = Launch Core filename = 파일 이름: unlocked = 새로운 콘텐츠가 해금되었습니다! completed = [accent]완료됨 @@ -144,6 +148,7 @@ techtree = 연구 기록 research.list = [lightgray]연구: research = 연구 researched = [lightgray]{0} 연구 완료. +research.progress = {0}% complete players = {0} 플레이어들 players.single = {0} 플레이어 players.search = 검색 @@ -340,6 +345,11 @@ waves.load = 클립보드에서 불러오기 waves.invalid = 클립보드에 잘못된 웨이브 데이터가 있습니다. waves.copied = 웨이브 복사됨 waves.none = 적 웨이브가 설정되지 않았습니다.\n비어있을 시 자동으로 기본 적 웨이브로 설정됩니다. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]<기본값> details = 설명 edit = 편집 @@ -459,7 +469,8 @@ locked = 잠김 complete = [lightgray]해금 조건 : requirement.wave = {1}지역에서 {0}웨이브 달성 requirement.core = {0}지역에서 적 코어를 파괴 -requirement.unlock = {0}지역 해금 +requirement.research = Research {0} +requirement.capture = Capture {0} resume = 지역 재개:\n[lightgray]{0} bestwave = [lightgray]최고 웨이브: {0} launch = < 출격 > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = 금지된 블록들 addall = 모두 추가 +launch.destination = Destination: {0} configure.invalid = 해당 값은 0에서 {0} 사이의 숫자여야 합니다. zone.unlocked = [lightgray]{0} 해금됨. zone.requirement.complete = {0}에 대한 요구 사항 충족:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = 네트워크 I/O 오류. error.any = 알 수 없는 네트워크 오류. error.bloom = 블룸 그래픽 효과를 적용하지 못했습니다.\n당신의 기기가 이 기능을 지원하지 않는 것일 수도 있습니다. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = 전초기지 sector.craters.name = 크레이터 sector.frozenForest.name = 얼어붙은 숲 @@ -532,6 +558,8 @@ settings.graphics = 그래픽 settings.cleardata = 게임 데이터 초기화... settings.clear.confirm = 정말로 이 데이터를 지우시겠습니까?\n완료된 작업은 취소할 수 없습니다! settings.clearall.confirm = [scarlet]경고![]\n이 작업은 저장된 맵, 맵파일, 잠금 해제된 목록과 키 매핑, 그리고 모든 데이터를 삭제합니다.\n확인 버튼을 다시 눌러 모든 데이터를 삭제하고 게임에서 나갑니다. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< 일시정지 > clear = 초기화 banned = [scarlet]차단됨 @@ -541,7 +569,7 @@ no = 아니오 info.title = 정보 error.title = [scarlet]오류가 발생했습니다. error.crashtitle = 오류가 발생했습니다 -unit.nobuild = [scarlet]유닛을 만들 수 없습니다 +unit.nobuild = [scarlet]이 유닛은 건설할 수 없습니다. blocks.input = 입력 blocks.output = 출력 blocks.booster = 가속 @@ -554,11 +582,14 @@ blocks.damage = 공격력 blocks.targetsair = 공중 공격 blocks.targetsground = 지상 공격 blocks.itemsmoved = 이동 속도 -blocks.launchtime = 출격 사이의 시간 +blocks.launchtime = 출격 간격 blocks.shootrange = 사거리 blocks.size = 크기 +blocks.displaysize = Display Size blocks.liquidcapacity = 액체 용량 blocks.powerrange = 전력 범위 +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = 최대 연결 수 blocks.poweruse = 전력 사용 blocks.powerdamage = 전력/데미지 @@ -574,13 +605,16 @@ blocks.boosteffect = 가속 효과 blocks.maxunits = 최대 활성 유닛수 blocks.health = 체력 blocks.buildtime = 건설 시간 +blocks.maxconsecutive = Max Consecutive blocks.buildcost = 건설 재료 blocks.inaccuracy = 오차각 blocks.shots = 공격 속도 blocks.reload = 발/초 blocks.ammo = 탄약 +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time -bar.drilltierreq = 더 좋은 드릴이 요구됨 +bar.drilltierreq = 더 좋은 드릴이 필요 bar.noresources = 자원 부족 bar.corereq = 코어 기지 필요 bar.drillspeed = 드릴 속도: {0}/s @@ -593,7 +627,7 @@ bar.poweroutput = 전력 출력: {0} bar.items = 자원량: {0} bar.capacity = 용량: {0} bar.unitcap = {0} {1}/{2} -bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] +bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[장비를 정지합니다] bar.liquid = 액체 bar.heat = 발열 bar.power = 전력 @@ -607,7 +641,7 @@ bullet.incendiary = [stat]방화 bullet.homing = [stat]유도 bullet.shock = [stat]전격 bullet.frag = [stat]파편 -bullet.knockback = [stat]{0}[lightgray] 밀어내기 +bullet.knockback = [stat]{0}[lightgray] 밀침 bullet.freezing = [stat]빙결 bullet.tarred = [stat]타르 bullet.multiplier = [stat]{0}[lightgray]x 탄약 배수 @@ -621,19 +655,23 @@ unit.liquidunits = 액체 unit.powerunits = 전력 unit.degrees = 도 unit.seconds = 초 +unit.minutes = mins unit.persecond = /초 +unit.perminute = /min unit.timesspeed = x 배 unit.percent = % +unit.shieldhealth = shield health unit.items = 자원 unit.thousands = 천 unit.millions = 백만 +unit.billions = b category.general = 일반 category.power = 전력 category.liquids = 액체 -category.items = 아이템 +category.items = 자원 category.crafting = 입력/출력 category.shooting = 사격 -category.optional = 보조 아이템 +category.optional = 보조 자원 setting.landscape.name = 가로화면 잠금 setting.shadows.name = 그림자 setting.blockreplace.name = 자동 블록 제안 @@ -679,7 +717,7 @@ setting.blockselectkeys.name = 블록 선택 키 표시 setting.vsync.name = 수직 동기화 setting.pixelate.name = 픽셀화 setting.minimap.name = 미니맵 표시 -setting.coreitems.name = 코어에 있는 아이템 표시 +setting.coreitems.name = 코어에 있는 자원 표시 setting.position.name = 플레이어 위치 표시 setting.musicvol.name = 음악 크기 setting.atmosphere.name = 행성 배경화면 표시 @@ -699,7 +737,7 @@ public.confirm = 게임을 모두에게 공개하시겠습니까?\n[accent]모 public.beta = 베타 버전의 게임은 공개 서버를 만들 수 없습니다. uiscale.reset = UI 스케일이 변경되었습니다.\n"확인"버튼을 눌러 저장하세요.\n[accent] {0}[][scarlet]초 후에 예전 설정으로 되돌리고 게임을 종료합니다... uiscale.cancel = 취소 후 나가기 -setting.bloom.name = 블룸 +setting.bloom.name = 화려한 효과 keybind.title = 조작키 설정 keybinds.mobile = [scarlet]대부분의 키 맵핑은 모바일에서 작동하지 않습니다. 기본 이동만 지원됩니다. category.general.name = 일반 @@ -709,6 +747,7 @@ category.blocks.name = 블록 선택 command.attack = 공격 command.rally = 순찰 command.retreat = 후퇴 +command.idle = Idle placement.blockselectkeys = \n[lightgray]키: [{0}, keybind.respawn.name = 리스폰 keybind.control.name = 유닛 제어 @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = 블록 상태 토글 keybind.move_x.name = X축 이동 keybind.move_y.name = Y축 이동 keybind.mouse_move.name = 커서를 따라서 이동 +keybind.pan.name = Pan View keybind.boost.name = 부스트 keybind.schematic_select.name = 영역 설정 keybind.schematic_menu.name = 설계도 메뉴 @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = 대각선 설치 keybind.pick.name = 블록 선택 keybind.break_block.name = 블록 파괴 keybind.deselect.name = 선택해제 +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = 사격 keybind.zoom.name = 확대 keybind.menu.name = 메뉴 @@ -782,6 +825,7 @@ rules.reactorexplosions = 원자로 폭발 rules.wavetimer = 웨이브 시간 rules.waves = 웨이브 rules.attack = 공격 모드 +rules.buildai = AI Building rules.enemyCheat = 무한 AI (빨간팀) 자원 rules.blockhealthmultiplier = 블록 체력 배수 rules.blockdamagemultiplier = 블록 공격력 배수 @@ -803,10 +847,14 @@ rules.title.unit = 유닛 rules.title.experimental = 실험적인 기능 rules.title.environment = 환경 rules.lighting = 조명 -rules.ambientlight = 주변 조명 -rules.solarpowermultiplier = 태양광 발전 배수 +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage +rules.ambientlight = 자연 조명 +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: -content.item.name = 아이템 +content.item.name = 자원 content.liquid.name = 액체 content.unit.name = 유닛 content.block.name = 블록 @@ -820,78 +868,90 @@ item.silicon.name = 실리콘 item.plastanium.name = 플라스터늄 item.phase-fabric.name = 메타 item.surge-alloy.name = 설금 -item.spore-pod.name = 포자 포드 +item.spore-pod.name = 포자 버섯 item.sand.name = 모래 -item.blast-compound.name = 화합물 +item.blast-compound.name = 폭발물 item.pyratite.name = 파이라타이트 -item.metaglass.name = 금속유리 +item.metaglass.name = 강화 유리 item.scrap.name = 고철 liquid.water.name = 물 liquid.slag.name = 광재 liquid.oil.name = 기름 -liquid.cryofluid.name = 냉각 +liquid.cryofluid.name = 냉각수 + item.explosiveness = [lightgray]폭발성: {0} item.flammability = [lightgray]인화성: {0} item.radioactivity = [lightgray]방사능: {0} + unit.health = [lightgray]체력: {0} unit.speed = [lightgray]속도: {0} unit.weapon = [lightgray]무기: {0} -unit.itemcapacity = [lightgray]아이템 수용량: {0} +unit.itemcapacity = [lightgray]자원 수용량: {0} unit.minespeed = [lightgray]채광 속도: {0}% unit.minepower = [lightgray]채광 레벨: {0} unit.ability = [lightgray]능력: {0} unit.buildspeed = [lightgray]건설 속도: {0}% -liquid.heatcapacity = [lightgray]발열 용량: {0} +liquid.heatcapacity = [lightgray]비열: {0} liquid.viscosity = [lightgray]점도: {0} liquid.temperature = [lightgray]온도: {0} -unit.dagger.name = Dagger -unit.mace.name = Mace -unit.fortress.name = Fortress -unit.nova.name = Nova -unit.pulsar.name = Pulsar -unit.quasar.name = Quasar -unit.crawler.name = Crawler -unit.atrax.name = Atrax -unit.spiroct.name = Spiroct -unit.arkyid.name = Arkyid -unit.flare.name = Flare -unit.horizon.name = Horizon -unit.zenith.name = Zenith -unit.antumbra.name = Antumbra -unit.eclipse.name = Eclipse -unit.mono.name = Mono -unit.poly.name = Poly -unit.mega.name = Mega -unit.risso.name = Risso -unit.minke.name = Minke -unit.bryde.name = Bryde -unit.alpha.name = Alpha -unit.beta.name = Beta -unit.gamma.name = Gamma +unit.dagger.name = 대거 +unit.mace.name = 메이스 +unit.fortress.name = 포트리스 +unit.nova.name = 노바 +unit.pulsar.name = 펄서 +unit.quasar.name = 퀘이사 +unit.crawler.name = 크롤러 +unit.atrax.name = 아트락스 +unit.spiroct.name = 스피록트 +unit.arkyid.name = 아키드 +unit.toxopid.name = Toxopid +unit.flare.name = 플레어 +unit.horizon.name = 호라이즌 +unit.zenith.name = 제니스 +unit.antumbra.name = 안텀브라 +unit.eclipse.name = 이클립스 +unit.mono.name = 모노 +unit.poly.name = 폴리 +unit.mega.name = 메가 +unit.quad.name = Quad +unit.oct.name = Oct +unit.risso.name = 리소 +unit.minke.name = 민케 +unit.bryde.name = 브리드 +unit.sei.name = 세이 +unit.omura.name = 오무라 +unit.alpha.name = 알파 +unit.beta.name = 베타 +unit.gamma.name = 감마 +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus -block.parallax.name = Parallax +block.resupply-point.name = Resupply Point +block.parallax.name = 시차 block.cliff.name = 낭떠러지 block.sand-boulder.name = 사암 block.grass.name = 잔디 block.slag.name = 광재 block.salt.name = 소금 -block.saltrocks.name = 소금 바위 +block.salt-wall.name = 소금 벽 block.pebbles.name = 조약돌 block.tendrils.name = 덩굴 -block.sandrocks.name = 모래 바위 +block.sand-wall.name = 모래 벽 block.spore-pine.name = 포자 덮인 소나무 -block.sporerocks.name = 포자 바위 -block.rock.name = 돌 -block.snowrock.name = 눈덩이 +block.spore-wall.name = 포자 벽 +block.boulder.name = 돌 +block.snow-boulder.name = 눈덩이 block.snow-pine.name = 눈 덮인 소나무 block.shale.name = 이판암 block.shale-boulder.name = 둥근 이판암 block.moss.name = 이끼 block.shrubs.name = 관목 block.spore-moss.name = 포자 이끼 -block.shalerocks.name = 이판암 바위 +block.shale-wall.name = 이판암 벽 block.scrap-wall.name = 조각벽 block.scrap-wall-large.name = 대형 조각벽 block.scrap-wall-huge.name = 거대한 조각 벽 @@ -919,13 +979,17 @@ block.craters.name = 구덩이 block.sand-water.name = 젖은 모래 block.darksand-water.name = 젖은 검은 모래 block.char.name = 숯 -block.holostone.name = 홀로스톤 +block.dacite.name = 데이사이트 +block.dacite-wall.name = 데이사이트 벽 block.ice-snow.name = 얼음눈 -block.rocks.name = 돌 -block.icerocks.name = 얼음바위 -block.snowrocks.name = 눈바위 -block.dunerocks.name = 모래돌 +block.stone-wall.name = 돌 벽 +block.ice-wall.name = 얼음 벽 +block.snow-wall.name = 눈 벽 +block.dune-wall.name = 모래 벽 block.pine.name = 소나무 +block.dirt.name = 흙 +block.dirt-wall.name = 흙 벽 +block.mud.name = 진흙 block.white-tree-dead.name = 죽은 하얀나무 block.white-tree.name = 하얀 나무 block.spore-cluster.name = 포자낭 @@ -941,10 +1005,9 @@ block.dark-panel-4.name = 어두운 패널 4 block.dark-panel-5.name = 어두운 패널 5 block.dark-panel-6.name = 어두운 패널 6 block.dark-metal.name = 어두운 금속제 -block.ignarock.name = 얼은 바위 +block.basalt.name = 현무암 block.hotrock.name = 뜨거운 바위 block.magmarock.name = 용암 바위 -block.cliffs.name = 절벽 block.copper-wall.name = 구리 벽 block.copper-wall-large.name = 대형 구리 벽 block.titanium-wall.name = 티타늄 벽 @@ -956,7 +1019,7 @@ block.phase-wall-large.name = 대형 메타 벽 block.thorium-wall.name = 토륨 벽 block.thorium-wall-large.name = 대형 토륨 벽 block.door.name = 문 -block.door-large.name = 대형문 +block.door-large.name = 대형 문 block.duo.name = 듀오 block.scorch.name = 스코치 block.scatter.name = 스캐터 @@ -966,7 +1029,7 @@ block.conveyor.name = 컨베이어 block.titanium-conveyor.name = 티타늄 컨베이어 block.plastanium-conveyor.name = 플라스터늄 컨베이어 block.armored-conveyor.name = 장갑 컨베이어 -block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 아이템을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 아이템을 받을 수 없습니다. +block.armored-conveyor.description = 티타늄 컨베이어와 같은 속도로 자원을 운송하지만, 더 높은 방어력을 가지고 있습니다. 다른 컨베이어 벨트 이외 측면에서는 자원을 받을 수 없습니다. block.junction.name = 교차기 block.router.name = 분배기 block.distributor.name = 대형 분배기 @@ -975,12 +1038,12 @@ block.inverted-sorter.name = 반전 필터 block.message.name = 메모 블록 block.illuminator.name = 조명 block.illuminator.description = 작고, 간단하고, 설정 가능한 광원입니다. 작동하려면 전력이 필요합니다. -block.overflow-gate.name = 오버플로 게이트 -block.underflow-gate.name = 언더플로 게이트 +block.overflow-gate.name = 포화 필터 +block.underflow-gate.name = 불포화 필터 block.silicon-smelter.name = 실리콘 제련소 block.phase-weaver.name = 메타 합성기 block.pulverizer.name = 분쇄기 -block.cryofluidmixer.name = 냉각 유체 제조기 +block.cryofluidmixer.name = 냉각수 제조기 block.melter.name = 융해기 block.incinerator.name = 소각로 block.spore-press.name = 포자 압축기 @@ -993,14 +1056,14 @@ block.diode.name = 배터리 다이오드 block.battery.name = 배터리 block.battery-large.name = 대형 배터리 block.combustion-generator.name = 연소 발전기 -block.turbine-generator.name = 증기 발전기 +block.steam-generator.name = 증기 발전기 block.differential-generator.name = 차동 발잔기 -block.impact-reactor.name = 임팩트 원자로 +block.impact-reactor.name = 핵융합 원자로 block.mechanical-drill.name = 기계식 드릴 block.pneumatic-drill.name = 공압 드릴 block.laser-drill.name = 레이저 드릴 block.water-extractor.name = 물 추출기 -block.cultivator.name = 제초기 +block.cultivator.name = 온실 block.conduit.name = 파이프 block.mechanical-pump.name = 기계식 펌프 block.item-source.name = 자원 공급기 @@ -1011,15 +1074,15 @@ block.power-void.name = 방전장치 block.power-source.name = 전력 공급기 block.unloader.name = 언로더 block.vault.name = 창고 -block.wave.name = 웨이브 +block.wave.name = 파도 block.swarmer.name = 스워머 block.salvo.name = 살보 block.ripple.name = 립플 block.phase-conveyor.name = 메타 컨베이어 block.bridge-conveyor.name = 다리 컨베이어 block.plastanium-compressor.name = 플라스터늄 압축기 -block.pyratite-mixer.name = 라타이트 혼합기 -block.blast-mixer.name = 화합물 혼합기 +block.pyratite-mixer.name = 파이라타이트 혼합기 +block.blast-mixer.name = 폭발물 혼합기 block.solar-panel.name = 태양 전지판 block.solar-panel-large.name = 대형 태양 전지판 block.oil-extractor.name = 석유 추출기 @@ -1039,7 +1102,7 @@ block.thermal-pump.name = 화력 펌프 block.thermal-generator.name = 화력 생성기 block.alloy-smelter.name = 설금 제련소 block.mender.name = 멘더 -block.mend-projector.name = 대형 수리 프로젝터 +block.mend-projector.name = 수리 프로젝터 block.surge-wall.name = 설금 벽 block.surge-wall-large.name = 큰 설금 벽 block.cyclone.name = 사이클론 @@ -1055,18 +1118,28 @@ block.container.name = 컨테이너 block.launch-pad.name = 출격 패드 block.launch-pad-large.name = 대형 출격 패드 block.segment.name = 세그먼트 +block.command-center.name = Command Center block.ground-factory.name = 지상 공장 block.air-factory.name = 항공 공장 -block.naval-factory.name = 해군 공장 +block.naval-factory.name = 해양 공장 block.additive-reconstructor.name = 첨가물 재구성기 block.multiplicative-reconstructor.name = 다중 재구성기 block.exponential-reconstructor.name = 지수 재구성기 block.tetrative-reconstructor.name = 정서 재구성기 -block.payload-conveyor.name = 매스 컨베이어 +block.payload-conveyor.name = 화물 컨베이어 block.payload-router.name = 화물 분배기 -block.disassembler.name = 분해기 +block.disassembler.name = 가속 분해기 block.silicon-crucible.name = 실리콘 도가니 -block.large-overdrive-projector.name = 대형 과부하 프로젝터 +block.overdrive-dome.name = 대형 과부하 프로젝터 + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = 파랑색 팀 team.crux.name = 빨강색 팀 team.sharded.name = 주황색 팀 @@ -1081,25 +1154,25 @@ tutorial.intro.mobile = [scarlet]Mindustry 튜토리얼[]을 시작하겠습니 tutorial.drill = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 바로 아래에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n마우스 오른쪽 버튼으로 취소가 가능합니다. tutorial.drill.mobile = 수동으로 채광하는 것은 효율이 낮습니다.\n[accent]드릴[]은 자동으로 드릴 밑에 있는 광물들을 채광합니다.\n드릴 카테고리의 기계식 드릴을 선택하여 구리 광맥위에 설치하세요.\n취소 버튼을 눌러 건축하기 전의 설계를 취소할 수 있습니다. tutorial.blockinfo = 각 블록마다 다른 특성을 가지고 있으며, 각 드릴은 특정 광석만 채굴할 수 있습니다.\n블록의 정보와 특성을 확인하려면, [accent]건설 메뉴에서 "?" 버튼을 선택하세요.[]\n\n[accent]지금 기계식 드릴의 정보를 보세요. -tutorial.conveyor = [accent]컨베이어[]는 아이템을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]마우스를 길게 눌러 경로에 놓습니다.\n대각선으로 배치할 경로를 선택하는 동안 [accent]CTRL[] 키를 누른 상태로 유지하세요.\n스크롤 휠을 사용하여 블록을 배치하기 전에 블록을 회전시킬 수 있습니다.\n[accent]선 도구를 사용하여 컨베이어 2개를 놓은 다음, 아이템을 코어로 넣으세요. -tutorial.conveyor.mobile = [accent]컨베이어[]는 아이템을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]몇 초 동안 손가락을 누른 상태에서 드래그 하여 경로를 그립니다.\n\n[accent]선 도구로 컨베이어 2개를 놓은 다음 아이템을 코어에 넣으세요. -tutorial.turret = 아이템이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 아이템이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 아이템(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\n기지 근처에 [accent]듀오 포탑[]을 건설하세요. +tutorial.conveyor = [accent]컨베이어[]는 자원을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]마우스를 길게 눌러 경로에 놓습니다.\n대각선으로 배치할 경로를 선택하는 동안 [accent]CTRL[] 키를 누른 상태로 유지하세요.\n스크롤 휠을 사용하여 블록을 배치하기 전에 블록을 회전시킬 수 있습니다.\n[accent]선 도구를 사용하여 컨베이어 2개를 놓은 다음, 자원을 코어로 넣으세요. +tutorial.conveyor.mobile = [accent]컨베이어[]는 자원을 코어로 운반하는데 사용됩니다.\n드릴에서 코어까지 컨베이어 경로를 만드세요.\n[accent]몇 초 동안 손가락을 누른 상태에서 드래그 하여 경로를 그립니다.\n\n[accent]선 도구로 컨베이어 2개를 놓은 다음 자원을 코어에 넣으세요. +tutorial.turret = 자원이 코어에 들어간 후에는 건물을 건설하는데 사용할 수 있습니다.\n모든 자원이 건물에 사용될 수 있는 것은 아닙니다.\n건물에 사용되지 않는 자원(예: [accent]석탄[] 또는 [accent]광재[])은 코어에 넣을 수 없습니다.\n[lightgray]적[]을 격추하기 위해 방어 건물을 세워야 합니다.\n기지 근처에 [accent]듀오 포탑[]을 건설하세요. tutorial.drillturret = 듀오 포탑은 사격하는데 [accent]구리 탄약[]이 필요합니다.\n포탑 근처에 드릴을 설치하세요.\n구리를 공급하기 위해 컨베이어를 포탑으로 가도록 건설하세요.\n\n[accnet]탄약 운반: 0/1 tutorial.pause = 전투 중에는 게임을 [accent]일시정지[] 할 수 있습니다.\n일시정지 되는 동안 건설을 대기시킬 수 있습니다.\n\n[accent]일시정지하려면 스페이스 키를 누르세요. tutorial.pause.mobile = 싱글 플레이에서는 게임을 [accent]일시정지[]할 수 있습니다.\n일시정지하면 교전과 더불어 건설까지 일시정지됩니다.\n\n[accent]일시정지하려면 왼쪽 상단에 있는 이 버튼을 누르세요. tutorial.unpause = 이제 스페이스를 누르면 일시정지가 해제됩니다. tutorial.unpause.mobile = 이제 다시 누르면 일시정지가 해제됩니다. tutorial.breaking = 블록은 종종 파괴 되어야 합니다.\n선택한 모든 블록을 파괴하려면 [accent]마우스 오른쪽 클릭을 길게 누르세요[].\n\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각벽을 파괴하세요. -tutorial.breaking.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블럭을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요. -tutorial.withdraw = 경우에 따라 블록에서 아이템을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]아이템이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]아이템[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요. -tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 아이템을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[]. +tutorial.breaking.mobile = 블록은 종종 파괴 되어야 합니다.\n[accent]삭제 모드[]를 선택한 다음 블록을 탭 하여 파괴할 수 있습니다.\n[accnet]몇 초 동안 손가락을 누르고 원하는 방향으로 드래그[]하여 범위 안에있는 블록을 파괴하세요.\n그리고 체크 표시 버튼을 눌러 삭제 작업을 할 수 있습니다.\n[accent]영역 선택을 사용하여 코어 왼쪽의 모든 조각 벽을 파괴하세요. +tutorial.withdraw = 경우에 따라 블록에서 자원을 직접 가져와야 합니다.\n이 작업을 하려면 [accent]자원이 있는 블록[]을 탭한 다음, 인벤토리에서 [accent]자원[]을 탭하세요.\n[accent]누른 상태를 유지[]하면 여러개를 꺼낼 수 있습니다.\n\n[accent]코어에서 구리를 빼내세요. +tutorial.deposit = 기체에서 목적지 블록으로 드래그하여 자원을 블록에 넣으세요.\n\n[accent]구리를 다시 코어에 넣으세요[]. tutorial.waves = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. [accent]클릭[]하여 사격할 수 있습니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요. tutorial.waves.mobile = [lightgray]적[]이 다가옵니다.\n2 웨이브로부터 코어를 방어하세요. 당신의 기체는 자동으로 적을 향해 사격합니다.\n더 많은 포탑과 드릴을 건설하고 구리를 더 모으세요. tutorial.launch = 특정 웨이브에 도달하면 [accent]코어로 출격[] 을 할 수 있습니다.\n\n이렇게 얻은 자원을 사용하여 새로운 기술을 연구 할 수 있습니다.\n\n[accent]출격 버튼을 누르세요. item.copper.description = 가장 기본적인 건설 재료. 모든 유형의 블록에서 광범위하게 사용됩니다. item.lead.description = 기본 초반 재료. 전자 및 액체 수송 블록에서 광범위하게 사용되는 자원입니다. -item.metaglass.description = 초강력 유리 화합물. 액체 분배 및 저장에 광범위하게 사용됩니다. +item.metaglass.description = 초강력 방탄 유리. 액체 분배 및 저장에 광범위하게 사용됩니다. item.graphite.description = 탄약 및 전기 부품에 사용되는 무기질 탄소. item.sand.description = 제련에서 합금 또는 플럭스에서 광범위하게 사용되는 일반적인 재료. item.coal.description = 화석화된 식물 물질. 씨앗이 나오기 훨씬 전에 형성되었습니다. 연료 및 자원 생산에 광범위하게 사용됩니다. @@ -1110,15 +1183,15 @@ item.silicon.description = 매우 유용한 반도체. 복잡한 전자 장치 item.plastanium.description = 고급 기체 및 파편화 탄약에 사용되는 가볍고 연성이 있는 재료입니다. item.phase-fabric.description = 최첨단 전자 제품과 자기수리 기술에 사용되는 거의 무중력에 가까운 물질입니다. item.surge-alloy.description = 독특한 전기적 특성을 가진 고급 합금. -item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 합성 포자 포드. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다. -item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 포드 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다. +item.spore-pod.description = 산업 목적을 위해 대기 농도에서 합성된 포자 버섯. 석유, 폭발물 및 연료로 전환하는 데 사용됩니다. +item.blast-compound.description = 폭탄과 폭발물에 사용되는 불안정한 화합물. 포자 버섯 및 기타 휘발성 물질로 합성할 수 있습니다. 연료로 사용하지 않는 것이 좋습니다. item.pyratite.description = 소이 무기에서 사용되는 매우 높은 가연성 물질. liquid.water.description = 가장 유용한 액체. 냉각기 및 폐기물 처리에 일반적으로 사용됩니다. liquid.slag.description = 다양한 종류의 금속들이 함께 섞여 녹아있습니다. 분리기를 이용해 다른 광물들로 분리하거나 탄약으로 사용해 적 부대를 향해 살포할 수 있습니다. liquid.oil.description = 고급 재료 생산에 사용되는 액체. 석탄으로 전환하거나 무기로 뿌려서 불을 지를 수 있습니다. liquid.cryofluid.description = 물과 티타늄으로 만든 비 부식성 액체. 열 용량이 매우 높으며 냉각수로 광범위하게 사용됩니다. -block.message.description = 메세지를 남깁니다. 같은 팀 간의 소통에 사용됩니다. +block.message.description = 메시지를 남깁니다. 같은 팀 간의 소통에 사용됩니다. block.graphite-press.description = 석탄 덩어리를 순수한 흑연으로 압축합니다. block.multi-press.description = 흑연 압축기의 강화 버전. 석탄을 빠르고 효율적으로 처리하기 위해 물과 전력을 사용합니다. block.silicon-smelter.description = 순수한 석탄과 모래로 실리콘을 생산합니다. @@ -1127,18 +1200,18 @@ block.plastanium-compressor.description = 석유와 티타늄으로 플라스터 block.phase-weaver.description = 방사성 토륨과 모래에서 메타를 합성합니다. 작동하려면 엄청난 양의 전력이 필요합니다. block.alloy-smelter.description = 티타늄, 납, 실리콘, 구리를 결합하여 설금을 생산합니다. block.cryofluidmixer.description = 물과 미세 티타늄 분말을 냉각수로 혼합합니다. 토륨 원자로 사용에 필수적입니다. -block.blast-mixer.description = 포자 클러스터를 파이라타이트와 분쇄하고 혼합하여 화합물을 만듭니다. +block.blast-mixer.description = 포자 클러스터를 파이라타이트와 분쇄하고 혼합하여 폭발물을 만듭니다. block.pyratite-mixer.description = 석탄, 납, 모래를 가연성이 높은 파이라타이트로 만듭니다. block.melter.description = 웨이브 포탑에서 추가 처리 또는 사용을 위해 고철을 광재로 녹입니다. block.separator.description = 광재를 미네랄 성분으로 분리합니다. 그리고 냉각된 결과를 출력합니다. -block.spore-press.description = 포자 포드를 극압으로 압축하여 기름을 합성합니다. +block.spore-press.description = 포자 버섯을 극압으로 압축하여 기름을 합성합니다. block.pulverizer.description = 고철을 뭉개서 고운 모래로 만듭니다. block.coal-centrifuge.description = 기름에서 석탄 덩어리를 추출합니다. -block.incinerator.description = 넘치는 아이템이나 액체를 증발시킵니다. +block.incinerator.description = 넘치는 자원이나 액체를 증발시킵니다. block.power-void.description = 입력된 모든 전력을 무효화합니다. 샌드박스 전용. block.power-source.description = 무한한 전력을 공급해주는 블록입니다. 샌드박스 전용. -block.item-source.description = 아이템을 무한대로 출력합니다. 샌드박스 전용. -block.item-void.description = 모든 아이템을 파괴합니다. 샌드박스 전용. +block.item-source.description = 자원을 무한대로 출력합니다. 샌드박스 전용. +block.item-void.description = 모든 자원을 파괴합니다. 샌드박스 전용. block.liquid-source.description = 액체를 무한히 출력합니다. 샌드박스 전용. block.liquid-void.description = 액체를 제거합니다. 샌드박스 전용. block.copper-wall.description = 저렴한 수비 블록.\n처음 몇 웨이브에서 코어와 포탑을 보호하는데 유용합니다. @@ -1162,17 +1235,17 @@ block.force-projector.description = 건물과 내부의 유닛을 공격으로 block.shock-mine.description = 지뢰를 밟고 있는 적에게 피해를 입힙니다. 적에게는 거의 보이지 않습니다. block.conveyor.description = 기본 자원 수송 레일. 자원을 배치된 방향을 따라 이동시켜 자동으로 건물에 넣어줍니다. 회전식. block.titanium-conveyor.description = 고급 자원 수송 레일. 기본 컨베이어보다 자원을 더 빨리 이동시킵니다. -block.plastanium-conveyor.description = 아이템을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 아이템을 받고 앞쪽에 세 방향으로 내보냅니다. +block.plastanium-conveyor.description = 자원을 일괄적으로 운송시킵니다. 컨베이에 뒤에서 자원을 받고 앞쪽에 세 방향으로 내보냅니다. block.junction.description = 2개의 컨베이어 벨트를 교차시키는 다리 역할을 합니다. 서로 다른 재료를 다른 장소로 운반하는 두 개의 다른 컨베이어의 상황에서 유용합니다. block.bridge-conveyor.description = 고급 자원 운송 블록. 지형이나 건물을 넘어 최대 3개 타일을 건너뛰고 자원을 운송할 수 있습니다. -block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 아이템을 순간이동 시킵니다. -block.sorter.description = 아이템을 정렬합니다. 아이템이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다. -block.inverted-sorter.description = 표준 분류기와 같은 아이템을 처리하지만, 대신 선택된 아이템을 측면으로 출력합니다. -block.router.description = 아이템을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오. -block.distributor.description = 고급 분배기. 아이템을 최대 7개의 다른 방향으로 동일하게 분할합니다. +block.phase-conveyor.description = 고급 자원 운송 블록. 전력을 사용하여 여러 타일을 통해 연결된 컨베이어로 자원을 순간이동 시킵니다. +block.sorter.description = 자원을 정렬합니다. 자원이 선택과 일치하면 앞방향으로 통과하며, 그렇지 않을 경우 왼쪽과 오른쪽으로 출력됩니다. +block.inverted-sorter.description = 표준 분류기와 같은 자원을 처리하지만, 대신 선택된 자원을 측면으로 출력합니다. +block.router.description = 자원을 받아서 최대 3개의 다른 방향으로 동일하게 출력합니다. 하나의 소스에서 여러 대상으로 재료를 분할하는 데 유용합니다.\n\n[scarlet]공장에서 생산된 재료는 출력에 의해 막히게 되므로, 절대로 공장 옆에서 사용하지 마십시오. +block.distributor.description = 고급 분배기. 자원을 최대 7개의 다른 방향으로 동일하게 분할합니다. block.overflow-gate.description = 전면 경로가 차단 된 경우에만 왼쪽과 오른쪽으로 출력됩니다. block.underflow-gate.description = 오버플로 게이트의 반대. 왼쪽 및 오른쪽 경로가 차단되면 전면으로 출력됩니다. -block.mass-driver.description = 최고의 아이템 운송 블록. 여러 아이템을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다. +block.mass-driver.description = 최고의 자원 운송 블록. 여러 자원을 모아서 장거리에 걸쳐 다른 매스 드라이버에게 발사합니다. 작동하려면 전원이 필요합니다. block.mechanical-pump.description = 느린 속도로 액체를 퍼올리지만, 전력를 사용하지 않는 펌프입니다. block.rotary-pump.description = 고급 펌프. 더 많은 액체를 퍼올리지만, 전력이 필요합니다. block.thermal-pump.description = 가장 강력한 펌프. @@ -1192,27 +1265,27 @@ block.battery.description = 에너지가 넘쳐날 때 완충재로 전력을 block.battery-large.description = 일반 배터리보다 훨씬 더 많은 전력을 저장합니다. block.combustion-generator.description = 석탄과 같은 가연성 물질을 연소시켜 전력을 생산합니다. block.thermal-generator.description = 열이 있는 곳에 설치하면 전력이 생성됩니다. -block.turbine-generator.description = 고급 연소 발전기. 더 효율적이지만 증기를 생성하기 위해 물이 필요합니다. +block.steam-generator.description = 고급 연소 발전기. 더 효율적이지만 증기를 생성하기 위해 물이 필요합니다. block.differential-generator.description = 많은 양의 전력을 생성합니다. 냉각수와 불타는 파이라타이트의 온도 차이를 이용합니다. -block.rtg-generator.description = 간단하고 안정적인 발전기. 붕괴하는 방사성 화합물의 열을 이용하여 느린 속도로 전력을 생성합니다. +block.rtg-generator.description = 간단하고 안정적인 발전기. 붕괴하는 방사성 물질의 열을 이용하여 느린 속도로 전력을 생성합니다. block.solar-panel.description = 태양으로부터 소량의 전력을 생성합니다. block.solar-panel-large.description = 표준 태양 전지판보다 훨씬 더 효율적인 버전. block.thorium-reactor.description = 토륨으로부터 상당한 양의 전력을 생산합니다. 지속적인 냉각이 필요하며, 충분한 양의 냉각수가 공급되지 않으면 크게 폭발합니다. 전력 출력은 토륨의 양에 따라 달라집니다. block.impact-reactor.description = 최고 효율로 대량의 전력을 생산할 수 있는 고급 발전기. 프로세스를 시작하려면 상당한 전력 공급이 필요합니다. -block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 아이템을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다. +block.mechanical-drill.description = 가격이 싼 드릴. 적절한 타일에 설치하면 자원을 천천히 느린 속도로 출력합니다. 기본 자원만 채굴할 수 있습니다. block.pneumatic-drill.description = 티타늄을 채광할 수 있는 향상된 드릴. 기계식 드릴보다 더 빠른 속도로 채굴합니다. block.laser-drill.description = 레이저 기술을 통해 더욱 빠르게 드릴링 할 수 있지만 전력이 필요합니다. 토륨 채굴 가능. block.blast-drill.description = 최상위 드릴. 많은 양의 전력이 필요합니다. block.water-extractor.description = 지하수를 추출합니다. 지표수가 없는 곳에서 사용합니다. -block.cultivator.description = 대기 중의 작은 농도의 포자를 배양 가능한 포드로 배양합니다. +block.cultivator.description = 대기 중의 작은 농도의 포자를 산업용 버섯으로 배양합니다. block.oil-extractor.description = 석유를 추출하기 위해 많은 양의 전력과 모래 및 물을 사용합니다. block.core-shard.description = 코어 캡슐의 첫 번째 형태. 파괴되면 해당 지역과의 모든 연결이 끊어집니다. 이런 일이 일어나지 않도록 하십시오. block.core-foundation.description = 코어의 두 번째 버전. 더 나은 방어력과 자원을 저장합니다. block.core-nucleus.description = 코어 캡슐의 세 번째이자 마지막 형태입니다. 방어력이 매우 높고 대량의 자원을 저장할 수 있습니다. -block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 아이템을 빼낼 수 있습니다. -block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 아이템을 빼낼 수 있습니다. -block.unloader.description = 근처의 비 수송 블록에서 아이템을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다. -block.launch-pad.description = 코어 출격 없이도 아이템을 묶어 출격시킬 수 있습니다. +block.vault.description = 각 유형의 많은 양의 자원을 저장합니다. 언로더 블록을 사용하여 창고에서 자원을 빼낼 수 있습니다. +block.container.description = 각 유형의 소량의 자원을 저장합니다. 언로더 블록을 사용하여 컨테이너에서 자원을 빼낼 수 있습니다. +block.unloader.description = 근처의 비 수송 블록에서 자원을 빼냅니다. 눌러서 빼낼 자원을 변경할 수 있십니다. +block.launch-pad.description = 코어 출격 없이도 자원을 묶어 출격시킬 수 있습니다. block.launch-pad-large.description = 출격 패드의 개선된 버전. 더 많은 자원을 저장하며 더 자주 출격합니다. block.duo.description = 작고 저렴한 포탑. 지상 유닛에 유용합니다. block.scatter.description = 필수 대공 포탑. 적군에게 납 덩어리, 고철, 또는 강화 유리 조각 덩어리를 뿌립니다. @@ -1228,5 +1301,5 @@ block.ripple.description = 매우 강력한 포병 포탑. 원거리에 있는 block.cyclone.description = 대공 및 대지 포탑. 근처 유닛에게 폭발성 덩어리를 발사합니다. block.spectre.description = 거대한 이중 배럴 대포. 공중 및 지상 목표물에 큰 관통 철갑탄을 발사합니다. block.meltdown.description = 거대한 레이저 대포. 근처의 적에게 지속적인 레이버 빔을 충전하여 발사합니다. 냉각수가 있어야 작동합니다. -block.repair-point.description = 주변에서 가장 가까운 유닛들을 지속적으로 치료합니다. +block.repair-point.description = 주변에서 가장 가까운 유닛을 지속적으로 치료합니다. block.segment.description = 날아오는 발사체를 요격합니다. 레이저는 목표 대상이 아닙니다. diff --git a/core/assets/bundles/bundle_lt.properties b/core/assets/bundles/bundle_lt.properties index 8316b54c06..ca4ffed5ba 100644 --- a/core/assets/bundles/bundle_lt.properties +++ b/core/assets/bundles/bundle_lt.properties @@ -20,6 +20,8 @@ gameover = Žaidimas Baigtas gameover.pvp = [accent] {0}[] komanda laimėjo! highscore = [accent]Naujas rekordas! copied = Nukopijuota. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Garsai load.map = Žemėlapiai @@ -63,8 +65,7 @@ stat.delivered = Paleisti resursai: stat.playtime = Žaidimo trukmė:[accent] {0} stat.rank = Finalinis laipsnis: [accent]{0} -launcheditems = [accent]Paleisti resursai -launchinfo = [unlaunched][[PALEISKITE] savo branduolį norint gauti resursus, kurie yra paryškinti mėlynai. +globalitems = [accent]Global Items map.delete = Ar esate tikri, jog norite ištrinti žemėlapį "[accent]{0}[]"? level.highscore = Rekordas: [accent]{0} level.select = Lygio pasirinkimas @@ -114,6 +115,7 @@ mod.disable = Išjungti mod.content = Tūrinys: mod.delete.error = Negalima ištrinti modifikacijos. Failas gali būti naudojamas. mod.requiresversion = [scarlet]Žemiausia privaloma žaidimo versija: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Trūkstamos priklausomybės: {0} mod.erroredcontent = [scarlet]Turinio klaidos. mod.errors = Įvyko klaida kraunant turinį. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Apie name = Vardas: noname = Pirma pasirinkite[accent] žaidėjo vardą[]. +planetmap = Planet Map +launchcore = Launch Core filename = Failo pavadinimas: unlocked = Atrakintas naujas turinys! completed = [accent]Išrasta @@ -144,6 +148,7 @@ techtree = Technologijų Medis research.list = [lightgray]Išradimai: research = Išrasti researched = [lightgray]{0} išrasta. +research.progress = {0}% complete players = {0} žaidėjai players.single = {0} žaidėjas players.search = ieškoti @@ -340,6 +345,11 @@ waves.load = Užkrauti iš iškarpinės waves.invalid = Klaidingos bangos iš iškarpinės. waves.copied = Bangos nukopijuotos. waves.none = Nėra nustatyta jokių priešų.\nĮsiminkite, jog tušti bangų maketai bus pakeisti numatytuoju maketu. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detaliau... edit = Redaguoti... @@ -459,7 +469,8 @@ locked = Užrakinta complete = [lightgray]Įvykdyta: requirement.wave = Pasiekite {0} zonoje {1} requirement.core = Sunaikinkite priešų branduolį zonoje {0} -requirement.unlock = Atrakinti {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Pratęsti zoną:\n[lightgray]{0} bestwave = [lightgray]Bangos rekordas: {0} launch = < PALEISTI > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Uždrausti blokai addall = Pridėti visus +launch.destination = Destination: {0} configure.invalid = Kiekis turi būti numeris tarp 0 ir {0}. zone.unlocked = [lightgray]{0} atrakinta. zone.requirement.complete = Rekalavimai {0} įvykdyti:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = Tinklo I/O klaida. error.any = Nžinoma tinklo klaida. error.bloom = Nepavyko inicijuoti spindėjimo.\nJūsų įrenginys gali nepalaikyti šios funkcijos. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafikos settings.cleardata = Išvalyti žaidimo duomenis... settings.clear.confirm = Ar tikrai norite ištrinti šiuos duomenis?\nTai negali būti atkurta! settings.clearall.confirm = [scarlet]ĮSPĖJIMAS![]\nTai ištrins visus duomenis, įskaitant išsaugojimus, žemėlapius, atrakinimus ir mygtukų pakeitimus.\nVos paspaudus 'gerai' žaidimas ištrins visus duomenis ir išsijungs. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Sustabdyta > clear = Išvalyti banned = [scarlet]Užblokuota @@ -557,8 +585,11 @@ blocks.itemsmoved = Judėjimo Greitis blocks.launchtime = Laikas Tarp Paleidimų blocks.shootrange = Atstumas blocks.size = Dydis +blocks.displaysize = Display Size blocks.liquidcapacity = Skysčių Talpumas blocks.powerrange = Energijos Skleidimo Atstumas +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Maks. Jungčių Kiekis blocks.poweruse = Energijos Suvartojimas blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Pastiprinimo Efektas blocks.maxunits = Maks. Aktyvių Vienetų Kiekis blocks.health = Gyvybės blocks.buildtime = Statymo Laikas +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Statymo Kaina blocks.inaccuracy = Netikslumas blocks.shots = Šūviai blocks.reload = Šūviai per sekundę blocks.ammo = Šoviniai +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Privalomas Geresnis Grąžtas bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = skysčio vienetai unit.powerunits = energijos vienetai unit.degrees = laipsnių unit.seconds = sekundės +unit.minutes = mins unit.persecond = /sek. +unit.perminute = /min unit.timesspeed = x greičio unit.percent = % +unit.shieldhealth = shield health unit.items = daiktai unit.thousands = k unit.millions = mil +unit.billions = b category.general = Bendra category.power = Energija category.liquids = Skysčiai @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Pulti command.rally = Susitelkti command.retreat = Atsitraukti +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Įjungti/Išjungti Blokų Statusus keybind.move_x.name = Judėjimas X ašimi keybind.move_y.name = Judėjimas Y ašimi keybind.mouse_move.name = Sekti Pelę +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Pasirinkite Regioną keybind.schematic_menu.name = Schemų Meniu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Įstrižas Padėjimas keybind.pick.name = Pasirinkti Bloką keybind.break_block.name = Išgriauti Bloką keybind.deselect.name = Panaikinti Pasirinkimą +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Šauti keybind.zoom.name = Keisti Vaizdo Mastelį keybind.menu.name = Meniu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reaktorių Sprogimai rules.wavetimer = Bangų Laikmatis rules.waves = Bangos rules.attack = Puolimo Režimas +rules.buildai = AI Building rules.enemyCheat = Neriboti Kompiuterio (Raudonosios Komandos) Resursai rules.blockhealthmultiplier = Blokų Gyvybių Daugiklis rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Vienetai rules.title.experimental = Eksperimentinis rules.title.environment = Environment rules.lighting = Apšvietimas +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Aplinkos Šviesa -rules.solarpowermultiplier = Saulės Energijos Daugiklis +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Daiktai content.liquid.name = Skysčiai @@ -830,9 +878,11 @@ liquid.water.name = Vanduo liquid.slag.name = Šlakas liquid.oil.name = Nafta liquid.cryofluid.name = Krio Skystis + item.explosiveness = [lightgray]Sprogstamumas: {0}% item.flammability = [lightgray]Degumas: {0}% item.radioactivity = [lightgray]Radioaktyvumas: {0}% + unit.health = [lightgray]Gyvybės: {0} unit.speed = [lightgray]Greitis: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Smėlio Riedulys block.grass.name = Žolė block.slag.name = Slag block.salt.name = Druska -block.saltrocks.name = Druskos Akmenys +block.salt-wall.name = Salt Wall block.pebbles.name = Akmenukai block.tendrils.name = Tendrilės -block.sandrocks.name = Smėlėtos Uolienos +block.sand-wall.name = Sand Wall block.spore-pine.name = Sporinė Pušis -block.sporerocks.name = Sporinės Uolienos -block.rock.name = Uolienos -block.snowrock.name = Sniego Uolienos +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snieginė Pušis block.shale.name = Skalūnas block.shale-boulder.name = Skalūno Riedulys block.moss.name = Samanos block.shrubs.name = Krūmai block.spore-moss.name = Sporų Samanos -block.shalerocks.name = Skalūno Uolienos +block.shale-wall.name = Shale Wall block.scrap-wall.name = Laužo Siena block.scrap-wall-large.name = Didelė Laužo Siena block.scrap-wall-huge.name = Didžiulė Laužo Siena @@ -919,13 +979,17 @@ block.craters.name = Krateriai block.sand-water.name = Smėlio vanduo block.darksand-water.name = Tamsaus Smėlio Vanduo block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ledinis Sniegas -block.rocks.name = Uolienos -block.icerocks.name = Ledo Uolienos -block.snowrocks.name = Sniego Uolienos -block.dunerocks.name = Kopų Uolienos +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pušis +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Baltas Medis, Miręs block.white-tree.name = Baltas Medis block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Tamsioji Plokštė 4 block.dark-panel-5.name = Tamsioji Plokštė 5 block.dark-panel-6.name = Tamsioji Plokštė 6 block.dark-metal.name = Tamsusis Metalas -block.ignarock.name = Igna Uoliena +block.basalt.name = Basalt block.hotrock.name = Karštoji Uoliena block.magmarock.name = Magmos Uoliena -block.cliffs.name = Uolos block.copper-wall.name = Vario Siena block.copper-wall-large.name = Didelė Vario Siena block.titanium-wall.name = Titano Siena @@ -993,7 +1056,7 @@ block.diode.name = Baterijos Diodas block.battery.name = Baterija block.battery-large.name = Didelė Baterija block.combustion-generator.name = Vidaus Degimo Generatorius -block.turbine-generator.name = Garų Generatorius +block.steam-generator.name = Garų Generatorius block.differential-generator.name = Diferencialinis Generatorius block.impact-reactor.name = Smūginis Reaktorius block.mechanical-drill.name = Mechaninis Grąžtas @@ -1055,6 +1118,7 @@ block.container.name = Talpykla block.launch-pad.name = Paleidimo Aikštelė block.launch-pad-large.name = Didelė Paleidimo Aikštelė block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = mėlyna team.crux.name = raudona team.sharded.name = oranžinė @@ -1192,7 +1265,7 @@ block.battery.description = Laiko enegiją kaip buferis, kai reikalinga papildom block.battery-large.description = Laiko daugiau energijos negu paprasta baterija. block.combustion-generator.description = Gamina energiją degindamas degias medžiagas kaip anglis. block.thermal-generator.description = Gamina energiją, kai pastatytas karštose vietose. -block.turbine-generator.description = Pažangesnis vidaus degimo generatorius. Efektyvesnis, bet papildomai reikalauja vandens sukurti garams. +block.steam-generator.description = Pažangesnis vidaus degimo generatorius. Efektyvesnis, bet papildomai reikalauja vandens sukurti garams. block.differential-generator.description = Gamina didelį kiekį energijos. Pasitelkia temperatūrų skirtumą tarp krio skysčio ir degančio piratito. block.rtg-generator.description = Paprastas, patikimas generatorius. Naudoja yrančių junginių karštį energijos gamybai. block.solar-panel.description = Suteikia mažą kiekį energijos iš saulės. diff --git a/core/assets/bundles/bundle_nl.properties b/core/assets/bundles/bundle_nl.properties index 88fba3f8f5..55b1b765f0 100644 --- a/core/assets/bundles/bundle_nl.properties +++ b/core/assets/bundles/bundle_nl.properties @@ -20,6 +20,8 @@ gameover = Spel afgelopen gameover.pvp = het[accent] {0}[] team heeft gewonnen! highscore = [accent]Nieuw topscore! copied = Gekopieerd. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Geluid load.map = Kaarten @@ -63,8 +65,7 @@ stat.delivered = Middelen Gelanceerd: stat.playtime = Time Played:[accent] {0} stat.rank = Eindrang: [accent]{0} -launcheditems = [accent]Gelanceerde items -launchinfo = [unlaunched][[LANCEER] je core om de in blauw gekleurde items te krijgen. +globalitems = [accent]Global Items map.delete = Weet je zeker dat je de map wilt verwijderen? "[accent]{0}[]"? level.highscore = Topscore: [accent]{0} level.select = Selecteer Level @@ -114,6 +115,7 @@ mod.disable = Deactiveer mod.content = Content: mod.delete.error = Mod verwijderen mislukt. Bestand mogelijk in gebruik. mod.requiresversion = [scarlet]Vereist minimaal mindustry versie: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missende benodigdheden: {0} mod.erroredcontent = [scarlet]Inhoud Fouten mod.errors = Er hebben zich fouten voordaan tijdens het laden van de inhoud. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Over name = Naam: noname = Maak eerst een[accent] Speler naam[]. +planetmap = Planet Map +launchcore = Launch Core filename = Bestandsnaam: unlocked = Nieuwe inhoud ontgrendeld! completed = [accent]Voltooid @@ -144,6 +148,7 @@ techtree = Tech boom research.list = [lightgray]Onderzoek: research = Onderzoek researched = [lightgray]{0} Onderzocht. +research.progress = {0}% complete players = {0} Spelers online players.single = {0} Speler online players.search = search @@ -340,6 +345,11 @@ waves.load = Laad van klembord waves.invalid = Ongeldige rondes in klenbord. waves.copied = Rondes Gekopiëerd. waves.none = Geen vijanden ingesteld.\nLege rondes worden automatisch gevuld met de standaard waardes. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Bewerk... @@ -459,7 +469,8 @@ locked = Op slot complete = [lightgray]Voltooid: requirement.wave = Berijk ronde {0} in {1} requirement.core = Vernietig vijandige core in {0} -requirement.unlock = Ontgrendel: {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Hervat zone:\n[lightgray]{0} bestwave = [lightgray]Beste ronde: {0} launch = < LANCEER > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Verboden Blokken addall = Voeg Alles Toe +launch.destination = Destination: {0} configure.invalid = Hoeveelheid moet een getal zijn tussen 0 en {0}. zone.unlocked = [lightgray]{0} vrijgespeeld. zone.requirement.complete = Ronde {0} berijkt:\n{1} zone vrijgespeeld. @@ -496,6 +508,20 @@ error.io = Netwerk I/O fout. error.any = Onbekende netwerk fout. error.bloom = Bloom aanzetten mislukt.\nJe apparaat ondersteunt het waarschijnlijk niet. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafisch settings.cleardata = Wis Game Data... settings.clear.confirm = Weet je zeker dat je deze data wilt verwijderen?\nDit is niet terug te draaien! settings.clearall.confirm = [scarlet]WAARSCHUWING![]\nDit verwijderd alle data, inclusief saves, kaarten, technologie en bedienings-instellingen.\nAls je op doorgaat wist het spel al je data en stopt automatisch. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Gepauzeerd > clear = Wis banned = [scarlet]Verbannen @@ -557,8 +585,11 @@ blocks.itemsmoved = Beweegingssnelheid blocks.launchtime = Tijd tussen lanceringen blocks.shootrange = Bereik blocks.size = Formaat +blocks.displaysize = Display Size blocks.liquidcapacity = Vloeistofcapaciteit blocks.powerrange = Stroombereik +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Maximale Hoeveelheid Connecties blocks.poweruse = Stroomverbruik blocks.powerdamage = Stroom/Schade @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Maximaal Actieve Units blocks.health = Levenspunten blocks.buildtime = Bouwtijd +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Bouwkosten blocks.inaccuracy = Onnauwkeurigheid blocks.shots = Shoten blocks.reload = Schoten/Seconde blocks.ammo = Ammunitie +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Betere miner nodig bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = vloeistofeenheid unit.powerunits = stroomeenheid unit.degrees = graden unit.seconds = secondes +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x snelheid unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil +unit.billions = b category.general = Algemeen category.power = Stroom category.liquids = Vloeisof @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Val aan command.rally = Groepeer command.retreat = Terugtrekken +command.idle = Idle placement.blockselectkeys = \n[lightgray]Toets: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Beweeg x keybind.move_y.name = Beweeg y keybind.mouse_move.name = Volg Muis +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Selecteer gebied keybind.schematic_menu.name = Ontwerp Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Plaats Diagonaal keybind.pick.name = Kies Blok keybind.break_block.name = Breek Blok keybind.deselect.name = Deselecteer +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Schiet keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Ontploffende Reactors rules.wavetimer = Ronde timer rules.waves = Rondes rules.attack = Aanval modus +rules.buildai = AI Building rules.enemyCheat = Oneindige AI grondstoffen rules.blockhealthmultiplier = Blok Health Vermenigvulder rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimenteel rules.title.environment = Environment rules.lighting = Belichting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Mist -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Vloeisof @@ -830,9 +878,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Olie liquid.cryofluid.name = Koelvloeistof + item.explosiveness = [lightgray]Explosivieit: {0}% item.flammability = [lightgray]Vlambaarheid: {0}% item.radioactivity = [lightgray]Radioactiviteit: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Snelheid: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Kruiper unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Zandkei block.grass.name = Gras block.slag.name = Slag block.salt.name = Zout -block.saltrocks.name = Zoutsteen +block.salt-wall.name = Salt Wall block.pebbles.name = Steentjes block.tendrils.name = Tendrils -block.sandrocks.name = Zandsteen +block.sand-wall.name = Sand Wall block.spore-pine.name = Sporenden -block.sporerocks.name = Schimmelsteen -block.rock.name = Steen -block.snowrock.name = Sneeuwsteen +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Sneeuwden block.shale.name = Schalie block.shale-boulder.name = Schalie Kei block.moss.name = Mos block.shrubs.name = Bosje block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Steens +block.shale-wall.name = Shale Wall block.scrap-wall.name = Oud ijzeren m block.scrap-wall-large.name = Large Scrap Muur block.scrap-wall-huge.name = Huge Scrap Muur @@ -919,13 +979,17 @@ block.craters.name = Krarters block.sand-water.name = Zand water block.darksand-water.name = Donker Zand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ice Snow -block.rocks.name = Stenen -block.icerocks.name = Ijs Stenen -block.snowrocks.name = Snow Steens -block.dunerocks.name = Dune Steens +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Den +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Witte Boom Dood block.white-tree.name = Witte Boom block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Donker Paneel 4 block.dark-panel-5.name = Donker Paneel 5 block.dark-panel-6.name = Donker Paneel 6 block.dark-metal.name = Donker Metaal -block.ignarock.name = Igna Steen +block.basalt.name = Basalt block.hotrock.name = Lava Steen block.magmarock.name = Magma Steen -block.cliffs.name = Rotswand block.copper-wall.name = Koperen Muur block.copper-wall-large.name = Grote Koperen Muur block.titanium-wall.name = Titanium Muur @@ -993,7 +1056,7 @@ block.diode.name = Batterij Diode block.battery.name = Batterij block.battery-large.name = Grote Batterij block.combustion-generator.name = Fossiele Generator -block.turbine-generator.name = Turbine Generator +block.steam-generator.name = Turbine Generator block.differential-generator.name = Verschiltemperatuurgenerator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanische Boor @@ -1055,6 +1118,7 @@ block.container.name = Doos block.launch-pad.name = Lanceerplatform block.launch-pad-large.name = Groot Lanceerplatform block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blauw team.crux.name = rood team.sharded.name = oranje @@ -1192,7 +1265,7 @@ block.battery.description = Stores power whenever there is an abundance and prov block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.steam-generator.description = More efficient than a combustion generator, but requires additional water. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.solar-panel.description = Genereert een klein beetje zonne-energie. diff --git a/core/assets/bundles/bundle_nl_BE.properties b/core/assets/bundles/bundle_nl_BE.properties index e643b1d553..e7c574de34 100644 --- a/core/assets/bundles/bundle_nl_BE.properties +++ b/core/assets/bundles/bundle_nl_BE.properties @@ -20,6 +20,8 @@ gameover = Game Over gameover.pvp = Het[accent] {0}[] team heeft gewonnen! highscore = [accent]Nieuw record! copied = Gekopieerd. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Geluiden load.map = Kaarten @@ -63,8 +65,7 @@ stat.delivered = Gronstoffen meegenomen: stat.playtime = Time Played:[accent] {0} stat.rank = Eindresultaat: [accent]{0} -launcheditems = [accent]Meegenomen grondstoffen -launchinfo = [unlaunched][[LAUNCH] je kern om de met blauw aangeduide voorwerpen te verkrijgen. +globalitems = [accent]Global Items map.delete = Ben je zeker dat je de kaart "[accent]{0}[]" wilt verwijderen? level.highscore = Beste score: [accent]{0} level.select = Selecteer level @@ -114,6 +115,7 @@ mod.disable = Schakel uit mod.content = Content: mod.delete.error = Kan mod niet verwijderen. Bestand is mogelijk in gebruik. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Over name = Naam: noname = Kies eerst[accent] een naam[]. +planetmap = Planet Map +launchcore = Launch Core filename = Bestandsnaam: unlocked = Ontgrendeld! completed = [accent]Voltooid @@ -144,6 +148,7 @@ techtree = Technische vooruitgang research.list = [lightgray]Onderzoek: research = Onderzoek researched = [lightgray]{0} onderzocht. +research.progress = {0}% complete players = {0} spelers online players.single = {0} speler online players.search = search @@ -340,6 +345,11 @@ waves.load = Load from Clipboard waves.invalid = Invalid waves in clipboard. waves.copied = Waves copied. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Edit... @@ -459,7 +469,8 @@ locked = Locked complete = [lightgray]Reach: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} launch = < LAUNCH > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Graphics settings.cleardata = Clear Game Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Paused > clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Size +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Health blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = Inaccuracy blocks.shots = Shots blocks.reload = Shots/Second blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = degrees unit.seconds = seconds +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = items unit.thousands = k unit.millions = mil +unit.billions = b category.general = General category.power = Power category.liquids = Liquids @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move x keybind.move_y.name = Move y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Items content.liquid.name = Liquids @@ -830,9 +878,11 @@ liquid.water.name = Water liquid.slag.name = Slag liquid.oil.name = Oil liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Speed: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -919,13 +979,17 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Dark Panel 4 block.dark-panel-5.name = Dark Panel 5 block.dark-panel-6.name = Dark Panel 6 block.dark-metal.name = Dark Metal -block.ignarock.name = Igna Rock +block.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = Copper Wall block.copper-wall-large.name = Large Copper Wall block.titanium-wall.name = Titanium Wall @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Battery block.battery-large.name = Large Battery block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Turbine Generator +block.steam-generator.name = Turbine Generator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mechanical Drill @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blue team.crux.name = red team.sharded.name = orange @@ -1192,7 +1265,7 @@ block.battery.description = Stores power whenever there is an abundance and prov block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.steam-generator.description = More efficient than a combustion generator, but requires additional water. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_pl.properties b/core/assets/bundles/bundle_pl.properties index a8d15895b9..8ed68e8273 100644 --- a/core/assets/bundles/bundle_pl.properties +++ b/core/assets/bundles/bundle_pl.properties @@ -20,6 +20,8 @@ gameover = Koniec Gry gameover.pvp = Zwyciężyła drużyna [accent]{0}[]! highscore = [accent] Nowy rekord! copied = Skopiowano. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Dźwięki load.map = Mapy @@ -63,8 +65,7 @@ stat.delivered = Surowce wystrzelone: stat.playtime = Czas Gry:[accent] {0} stat.rank = Ocena: [accent]{0} -launcheditems = [accent]Wystrzelone przedmioty -launchinfo = [unlaunched][[WYSTRZEL] rdzeń aby uzyskać przedmioty oznaczone na niebiesko. +globalitems = [accent]Global Items map.delete = Jesteś pewny, że chcesz usunąć "[accent]{0}[]"? level.highscore = Rekord: [accent]{0} level.select = Wybrany poziom @@ -114,6 +115,7 @@ mod.disable = Wyłącz mod.content = Content: mod.delete.error = Nie udało się usunąć moda. Plik może być w użyciu. mod.requiresversion = [scarlet]Wymaga gry w wersji co najmniej: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Brakujące zależności: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Wystąpił błąd podczas ładowania treści. @@ -137,6 +139,8 @@ mod.scripts.disable = Twoje urządzenie nie wspiera modów ze skryptami. Musisz about.button = O Grze name = Nazwa: noname = Najpierw wybierz[accent] nazwę gracza[]. +planetmap = Planet Map +launchcore = Launch Core filename = Nazwa Pliku: unlocked = Odblokowano nową zawartość! completed = [accent]Ukończony @@ -144,6 +148,7 @@ techtree = Drzewo Technologiczne research.list = [lightgray]Badania: research = Badaj researched = [lightgray]{0} zbadane. +research.progress = {0}% complete players = {0} graczy players.single = {0} gracz players.search = search @@ -340,6 +345,11 @@ waves.load = Załaduj Ze Schowka waves.invalid = Nieprawidłowe fale w schowku. waves.copied = Fale zostały skopiowane. waves.none = Brak zdefiniowanych wrogów.\nPamiętaj, że puste układy fal zostaną automatycznie zastąpione układem domyślnym. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detale... edit = Edytuj... @@ -459,7 +469,8 @@ locked = Zablokowane complete = [lightgray]Ukończone: requirement.wave = Osiągnij falę {0} w {1} requirement.core = Zniszcz Rdzeń wroga w {0} -requirement.unlock = Odblokuj {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Kontynuuj Strefę:\n[lightgray]{0} bestwave = [lightgray]Najwyższa fala: {0} launch = < WYSTRZEL > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Zabronione bloki addall = Dodaj wszystkie +launch.destination = Destination: {0} configure.invalid = Ilość musi być liczbą pomiędzy 0 a {0}. zone.unlocked = [lightgray]Strefa {0} odblokowana. zone.requirement.complete = Fala {0} osiągnięta:\n{1} Wymagania strefy zostały spełnione. @@ -496,6 +508,20 @@ error.io = Błąd sieciowy I/O. error.any = Nieznany błąd sieci. error.bloom = Nie udało się załadować bloom.\nTwoje urządzenie może nie wspierać tej funkcji. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Punkt Zerowy sector.craters.name = Kratery sector.frozenForest.name = Zamrożony Las @@ -510,7 +536,6 @@ sector.fungalPass.name = Grzybowa Przełęcz sector.groundZero.description = Optymalna lokalizacja, aby rozpocząć jeszcze raz. Niskie zagrożenie. Niewiele zasobów.\nZbierz jak najwięcej miedzi i ołowiu, tyle ile jest możliwe.\nPrzejdź do następnej strefy jak najszybciej. sector.frozenForest.description = Nawet tutaj, bliżej gór, zarodniki rozprzestrzeniły się. Niskie temperatury nie mogą ich zatrzymać na zawsze.\n\nRozpocznij przedsięwzięcie od władzy. Buduj generatory spalinowe. Naucz się korzystać z naprawiaczy. -sector.desertWastes.description = Te pustkowia są rozległe, nieprzewidywalne, i znajdują się na nich opuszczone struktury.\nWęgiel jest obecny w tym regionie. Użyj go do produkcji energii, lub do stworzenia grafitu.\n\n[lightgray]Miejsce lądowania nie jest pewne. sector.saltFlats.description = Na obrzeżach pustyni spoczywają Solne Równiny. Można tu znaleźć niewiele surowców.\n\nWrogowie zbudowali tu bazę składującą surowce. Zniszcz ich rdżeń. Zniszcz wszystko co stanie ci na drodze. sector.craters.description = W tym kraterze zebrała się woda. Pozostałość dawnych wojen. Odzyskaj ten teren. Wykop piasek. Wytop metaszkło. Pompuj wodę do działek obronnych i wierteł by je schłodzić sector.ruinousShores.description = Za pustkowiami ciągnie się linia brzegowa. Kiedyś znajdowała się tu przybrzeżna linia obronna. Niewiele z niej zostało. Ostały się tylko podstawowe struktury obronne, z reszty został tylko złom.\nKontynuuj eksploracje. Odkryj pozostawioną tu technologię. @@ -533,6 +558,8 @@ settings.graphics = Grafika settings.cleardata = Wyczyść Dane Gry... settings.clear.confirm = Czy jesteś pewien że chcesz usunąć te dane?\nPo tym nie ma powrotu! settings.clearall.confirm = [scarlet]UWAGA![]\nTo wykasuje wszystkie dane, włącznie z zapisanymi grami i mapami, ustawienami, i znanymi technologiami.\nKiedy naciśniesz 'ok', gra usunie wszystkie swoje dane i automatycznie wyłączy się. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Wstrzymano > clear = Wyczyść banned = [scarlet]Zbanowano @@ -558,8 +585,11 @@ blocks.itemsmoved = Prędkość poruszania się blocks.launchtime = Czas pomiędzy wystrzeleniami blocks.shootrange = Zasięg blocks.size = Rozmiar +blocks.displaysize = Display Size blocks.liquidcapacity = Pojemność cieczy blocks.powerrange = Zakres mocy +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Maksymalna ilość połączeń blocks.poweruse = Zużycie prądu blocks.powerdamage = Moc/Zniszczenia @@ -575,11 +605,14 @@ blocks.boosteffect = Efekt wzmocnienia blocks.maxunits = Maksymalna ilość jednostek blocks.health = Zdrowie blocks.buildtime = Czas budowy +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Koszt budowy blocks.inaccuracy = Niecelność blocks.shots = Strzały blocks.reload = Strzałów/sekundę blocks.ammo = Amunicja +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Wymagane Lepsze Wiertło bar.noresources = Missing Resources @@ -622,12 +655,16 @@ unit.liquidunits = jednostek płynu unit.powerunits = jednostek prądu unit.degrees = stopnie unit.seconds = sekundy +unit.minutes = mins unit.persecond = /sekundę +unit.perminute = /min unit.timesspeed = x prędkość unit.percent = % +unit.shieldhealth = shield health unit.items = przedmioty unit.thousands = tys. unit.millions = mln +unit.billions = b category.general = Główne category.power = Prąd category.liquids = Płyny @@ -710,6 +747,7 @@ category.blocks.name = Block Select command.attack = Atakuj command.rally = Zbierz command.retreat = Wycofaj +command.idle = Idle placement.blockselectkeys = \n[lightgray]Klawisz: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -722,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Poruszanie w poziomie keybind.move_y.name = Poruszanie w pionie keybind.mouse_move.name = Podążaj Za Myszą +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Wybierz region keybind.schematic_menu.name = Menu schematów @@ -749,6 +788,9 @@ keybind.diagonal_placement.name = Budowa po skosie keybind.pick.name = Wybierz Blok keybind.break_block.name = Zniszcz Blok keybind.deselect.name = Odznacz +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Strzelanie keybind.zoom.name = Przybliżanie keybind.menu.name = Menu @@ -783,6 +825,7 @@ rules.reactorexplosions = Eksplozje reaktorów rules.wavetimer = Zegar fal rules.waves = Fale rules.attack = Tryb ataku +rules.buildai = AI Building rules.enemyCheat = Nieskończone zasoby komputera-przeciwnika (czerwonego zespołu) rules.blockhealthmultiplier = Mnożnik życia bloków rules.blockdamagemultiplier = Block Damage Multiplier @@ -804,8 +847,12 @@ rules.title.unit = Jednostki rules.title.experimental = Eksperymentalne rules.title.environment = Environment rules.lighting = Oświetlenie +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Otaczające Światło -rules.solarpowermultiplier = Mnożnik Energii Słonecznej +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Przedmioty content.liquid.name = Płyny @@ -831,9 +878,11 @@ liquid.water.name = Woda liquid.slag.name = Żużel liquid.oil.name = Ropa liquid.cryofluid.name = Lodociecz + item.explosiveness = [lightgray]Wybuchowość: {0} item.flammability = [lightgray]Palność: {0} item.radioactivity = [lightgray]Promieniotwórczość: {0} + unit.health = [lightgray]Zdrowie: {0} unit.speed = [lightgray]Prędkość: {0} unit.weapon = [lightgray]Broń: {0} @@ -857,6 +906,7 @@ unit.crawler.name = Pełzak unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Błysk unit.horizon.name = Horyzont unit.zenith.name = Zenit @@ -865,34 +915,43 @@ unit.eclipse.name = Zaćmienie unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Klif block.sand-boulder.name = Piaskowy Głaz block.grass.name = Trawa block.slag.name = Żużel block.salt.name = Sól -block.saltrocks.name = Skały Solne +block.salt-wall.name = Salt Wall block.pebbles.name = Kamyki block.tendrils.name = Wić -block.sandrocks.name = Skały Piaskowe +block.sand-wall.name = Sand Wall block.spore-pine.name = Sosna Zarodnikowa -block.sporerocks.name = Skała Zarodnikowa -block.rock.name = Skały -block.snowrock.name = Skały śnieżne +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Sosna śniegowa block.shale.name = Łupek block.shale-boulder.name = Głaz Łupkowy block.moss.name = Mech block.shrubs.name = Krzewy block.spore-moss.name = Mech Zarodnikowy -block.shalerocks.name = Skały Łupkowe +block.shale-wall.name = Shale Wall block.scrap-wall.name = Ściana ze Złomu block.scrap-wall-large.name = Duża Ściana ze Złomu block.scrap-wall-huge.name = Ogromna Ściana ze Złomu @@ -920,13 +979,17 @@ block.craters.name = Kratery block.sand-water.name = Woda z Piaskiem block.darksand-water.name = Woda z Ciemnym Piaskiem block.char.name = Popiół -block.holostone.name = Błyszczący kamień +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Lodowy Śnieg -block.rocks.name = Skały -block.icerocks.name = Lodowe skały -block.snowrocks.name = Śnieżne Skały -block.dunerocks.name = Skały wydmowe +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Sosna +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Białe Drzewo Martwe block.white-tree.name = Białe Drzewo block.spore-cluster.name = Skupisko Zarodników @@ -942,10 +1005,9 @@ block.dark-panel-4.name = Ciemny Panel 4 block.dark-panel-5.name = Ciemny Panel 5 block.dark-panel-6.name = Ciemny Panel 6 block.dark-metal.name = Ciemny Metal -block.ignarock.name = Skała Wulkaniczna +block.basalt.name = Basalt block.hotrock.name = Gorący Kamień block.magmarock.name = Skała magmowa -block.cliffs.name = Klify block.copper-wall.name = Miedziana Ściana block.copper-wall-large.name = Duża Miedziana Ściana block.titanium-wall.name = Tytanowa Ściana @@ -994,7 +1056,7 @@ block.diode.name = Dioda baterii block.battery.name = Bateria block.battery-large.name = Duża Bateria block.combustion-generator.name = Generator Spalinowy -block.turbine-generator.name = Generator Parowy +block.steam-generator.name = Generator Parowy block.differential-generator.name = Generator Różnicowy block.impact-reactor.name = Reaktor Uderzeniowy block.mechanical-drill.name = Wiertło Mechaniczne @@ -1056,6 +1118,7 @@ block.container.name = Kontener block.launch-pad.name = Wyrzutnia block.launch-pad-large.name = Duża Wyrzutnia block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Fabryka Naziemna block.air-factory.name = Fabryka Powietrzna block.naval-factory.name = Fabryka Morska @@ -1068,6 +1131,15 @@ block.payload-router.name = Rozdzielacz Ładunku block.disassembler.name = Dezasembler block.silicon-crucible.name = Silicon Crucible block.overdrive-dome.name = Kopuła Pola Overdrive + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = niebieski team.crux.name = czerwony team.sharded.name = żółty @@ -1193,7 +1265,7 @@ block.battery.description = Przechowuje energię przy nadwyżce produkcji oraz d block.battery-large.description = Przechowuje o wiele wiecej prądu niż standardowa bateria. block.combustion-generator.description = Wytwarza energię poprzez spalanie łatwopalnych materiałów. block.thermal-generator.description = Generuje prąd kiedy jest postawiony na źródłach ciepła. -block.turbine-generator.description = Zaawansowana wersja Generatora Spalinowego. Jest wydajniejszy niż Generator Spalinowy, ale wymaga wody do generowania pary. +block.steam-generator.description = Zaawansowana wersja Generatora Spalinowego. Jest wydajniejszy niż Generator Spalinowy, ale wymaga wody do generowania pary. block.differential-generator.description = Generuje duże ilości prądu. Wykorzystuje różnice temperatur pomiędzy Lodocieczą a spalanym Piratianem. block.rtg-generator.description = Prosty, niezawodny generator. Wykorzystuje ciepło powstałe z rozpadu izotopów promieniotwórczych. Nie wymaga chłodzenia, ale produkuje mniej energii od reaktora torowego. block.solar-panel.description = Wytwarza małe ilości prądu wykorzystując energię słoneczną. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index 64d54a3d5d..b7490dd8f2 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -20,6 +20,8 @@ gameover = O núcleo foi destruído. gameover.pvp = O time[accent] {0}[] ganhou! highscore = [accent]Novo recorde! copied = Copiado +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sons load.map = Mapas @@ -63,8 +65,7 @@ stat.delivered = Recursos lançados: stat.playtime = Tempo jogado:[accent] {0} stat.rank = Classificação final: [accent]{0} -launcheditems = [accent]Itens lançados -launchinfo = [unlaunched][[LANCE] seu núcleo para obter os itens indicados em azul. +globalitems = [accent]Global Items map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? level.highscore = Melhor\npontuação: [accent] {0} level.select = Seleção de fase @@ -114,6 +115,7 @@ mod.disable = Desati-\nvar mod.content = Content: mod.delete.error = Incapaz de deletar o mod. O arquivo talvez esteja em uso. mod.requiresversion = [scarlet]Requer no mínimo versão [accent]{0} [scarlet]do jogo. +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Dependências ausentes: {0} mod.erroredcontent = [scarlet]Erros no conteúdo mod.errors = Ocorreram erros ao carregar o conteúdo. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Sobre name = Nome: noname = Escolha[accent] um nome[] primeiro. +planetmap = Planet Map +launchcore = Launch Core filename = Nome do arquivo: unlocked = Novo bloco desbloqueado! completed = [accent]Completado @@ -144,6 +148,7 @@ techtree = Árvore Tecnológica research.list = [lightgray]Pesquise: research = Pesquisar researched = [lightgray]{0} Pesquisado. +research.progress = {0}% complete players = {0} Jogadores ativos players.single = {0} Jogador ativo players.search = Procurar @@ -340,6 +345,11 @@ waves.load = Carregar da área de transferência waves.invalid = Hordas inválidas na área de transferência. waves.copied = Hordas copiadas. waves.none = Sem hordas definidas.\nNote que layouts vazios de hordas serão automaticamente substituídos pelo layout padrão. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detalhes... edit = Editar... @@ -459,7 +469,8 @@ locked = Trancado complete = [lightgray]Completo: requirement.wave = Alcançar a Horda {0} em {1} requirement.core = Destruir o núcleo inimigo em {0} -requirement.unlock = Desbloquear {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resumir Zona:\n[lightgray]{0} bestwave = [lightgray]Melhor: {0} launch = Lançar @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Blocos Banidos addall = Adicionar Todos +launch.destination = Destination: {0} configure.invalid = A quantidade deve ser um número entre 0 e {0}. zone.unlocked = [lightgray]{0} Desbloqueado. zone.requirement.complete = Horda {0} alcançada:\n{1} Requerimentos da zona alcançada. @@ -496,6 +508,20 @@ error.io = Erro I/O de internet. error.any = Erro de rede desconhecido. error.bloom = Falha ao inicializar bloom.\nSeu dispositivo talvez não o suporte. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Gráficos settings.cleardata = Apagar dados settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito! settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar todo os arquivos, incluindo jogos salvos, mapas, teclas personalizadas e desbloqueados.\nQuando apertar 'ok' todos os arquivos serão apagados e o jogo irá sair automaticamente. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = Pausado clear = Limpo banned = [scarlet]BANIDO @@ -557,8 +585,11 @@ blocks.itemsmoved = Velocidade de movimento blocks.launchtime = Tempo entre Disparos. blocks.shootrange = Alcance blocks.size = Tamanho +blocks.displaysize = Display Size blocks.liquidcapacity = Capacidade de Líquido blocks.powerrange = Alcance da Energia +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Conexões Máximas blocks.poweruse = Uso de energia blocks.powerdamage = Dano/Poder @@ -574,11 +605,14 @@ blocks.boosteffect = Efeito do Impulso blocks.maxunits = Máximo de unidades ativas blocks.health = Saúde blocks.buildtime = Tempo de construção +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Custo de construção blocks.inaccuracy = Imprecisão blocks.shots = Tiros blocks.reload = Tiros por segundo blocks.ammo = Munição +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Broca melhor necessária. bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = unidades de liquido unit.powerunits = unidades de energia unit.degrees = Graus unit.seconds = segundos +unit.minutes = mins unit.persecond = por segundo +unit.perminute = /min unit.timesspeed = x Velocidade unit.percent = % +unit.shieldhealth = shield health unit.items = itens unit.thousands = k unit.millions = m +unit.billions = b category.general = Geral category.power = Energia category.liquids = Líquidos @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Atacar command.rally = Reunir command.retreat = Recuar +command.idle = Idle placement.blockselectkeys = \n[lightgray]Tecla: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Mover no eixo x keybind.move_y.name = Mover no eixo Y keybind.mouse_move.name = Seguir Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Selecionar região keybind.schematic_menu.name = Menu de Esquemas @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Colocação diagonal keybind.pick.name = Pegar bloco keybind.break_block.name = Quebrar bloco keybind.deselect.name = Desselecionar +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Atirar keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reatores explodem rules.wavetimer = Tempo de horda rules.waves = Hordas rules.attack = Modo de ataque +rules.buildai = AI Building rules.enemyCheat = Recursos de IA Infinitos rules.blockhealthmultiplier = Multiplicador de vida do bloco rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unidades rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Iluminação +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Luz ambiente -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Itens content.liquid.name = Líquidos @@ -830,9 +878,11 @@ liquid.water.name = Água liquid.slag.name = Escória liquid.oil.name = Petróleo liquid.cryofluid.name = Fluído Criogênico + item.explosiveness = [lightgray]Explosibilidade: {0} item.flammability = [lightgray]Inflamabilidade: {0} item.radioactivity = [lightgray]Radioatividade: {0} + unit.health = [lightgray]Vida: {0} unit.speed = [lightgray]Velocidade: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Rastejante unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Pedregulho de areia block.grass.name = Grama block.slag.name = Slag block.salt.name = Sal -block.saltrocks.name = Pedras De Sal +block.salt-wall.name = Salt Wall block.pebbles.name = Pedrinhas block.tendrils.name = Gavinhas -block.sandrocks.name = Pedras de areia +block.sand-wall.name = Sand Wall block.spore-pine.name = Pinheiro de esporo -block.sporerocks.name = Pedras de esporo -block.rock.name = Rocha -block.snowrock.name = Rocha com neve +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pinheiro com neve block.shale.name = Xisto block.shale-boulder.name = Pedra de Xisto block.moss.name = Musgo block.shrubs.name = Arbusto block.spore-moss.name = Musgo de Esporos -block.shalerocks.name = Rochas de Xisto +block.shale-wall.name = Shale Wall block.scrap-wall.name = Muro de sucata block.scrap-wall-large.name = Muro grande de sucata block.scrap-wall-huge.name = Muro enorme de sucata @@ -919,13 +979,17 @@ block.craters.name = Crateras block.sand-water.name = Água sobre areia block.darksand-water.name = Água sobre areia escura block.char.name = Char -block.holostone.name = Pedra holo +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Gelo de neve -block.rocks.name = Rochas -block.icerocks.name = Rochas de gelo -block.snowrocks.name = Rochas de neve -block.dunerocks.name = Rochas da duna +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pinheiro +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Árvore branca morta block.white-tree.name = Árvore branca block.spore-cluster.name = Aglomerado de esporos @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Painel escuro 4 block.dark-panel-5.name = Painel escuro 5 block.dark-panel-6.name = Painel escuro 6 block.dark-metal.name = Metal escuro -block.ignarock.name = Rocha ígnea +block.basalt.name = Basalt block.hotrock.name = Rocha quente block.magmarock.name = Rocha de magma -block.cliffs.name = Colinas block.copper-wall.name = Muro de Cobre block.copper-wall-large.name = Muralha de Cobre block.titanium-wall.name = Muro de Titânio @@ -993,7 +1056,7 @@ block.diode.name = Diodo block.battery.name = Bateria block.battery-large.name = Bateria grande block.combustion-generator.name = Gerador à combustão -block.turbine-generator.name = Gerador à vapor +block.steam-generator.name = Gerador à vapor block.differential-generator.name = Gerador diferencial block.impact-reactor.name = Reator De impacto block.mechanical-drill.name = Broca Mecânica @@ -1055,6 +1118,7 @@ block.container.name = Contâiner block.launch-pad.name = Plataforma de lançamento block.launch-pad-large.name = Plataforma de lançamento grande block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Azul team.crux.name = Vermelho team.sharded.name = Fragmentado @@ -1192,7 +1265,7 @@ block.battery.description = Armazena energia em tempos de energia excedente. Lib block.battery-large.description = Guarda muito mais energia que uma bateria comum. block.combustion-generator.description = Gera energia queimando materiais inflamáveis, como carvão. block.thermal-generator.description = Gera energia quando colocado em lugares quentes. -block.turbine-generator.description = Mais eficiente que o gerador à combustão, mas requer água adicional para a geração de vapor. +block.steam-generator.description = Mais eficiente que o gerador à combustão, mas requer água adicional para a geração de vapor. block.differential-generator.description = Gera grandes quantidades de energia. Utiliza a diferença de temperatura entre o Fluido Criogênico e a Piratita. block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos que não precisa de refriamento mas dá muito menos energia que o reator de tório. block.solar-panel.description = Gera pequenas quantidades de energia do sol. diff --git a/core/assets/bundles/bundle_pt_PT.properties b/core/assets/bundles/bundle_pt_PT.properties index c665535ba8..903b761736 100644 --- a/core/assets/bundles/bundle_pt_PT.properties +++ b/core/assets/bundles/bundle_pt_PT.properties @@ -20,6 +20,8 @@ gameover = O núcleo foi destruído. gameover.pvp = O time[accent] {0}[] ganhou! highscore = [accent]Novo recorde! copied = Copiado. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sons load.map = Mapas @@ -63,8 +65,7 @@ stat.delivered = Recursos lançados: stat.playtime = Tempo jogado:[accent] {0} stat.rank = Rank Final: [accent]{0} -launcheditems = [accent]Itens lançados -launchinfo = [unlaunched][[LAUNCH] seu núcleo para obter os itens indicados em azul. +globalitems = [accent]Global Items map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? level.highscore = Melhor\npontuação: [accent] {0} level.select = Seleção de Fase @@ -114,6 +115,7 @@ mod.disable = Desativar mod.content = Content: mod.delete.error = Incapaz de apagar o mod. Ficheiro já em uso. mod.requiresversion = [scarlet]Requer versão minima de jogo: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Dependências ausentes: {0} mod.erroredcontent = [scarlet]Erros de conteudo mod.errors = Ocorreram erros ao carregar o conteúdo. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Sobre name = Nome: noname = Escolha[accent] um nome[] primeiro. +planetmap = Planet Map +launchcore = Launch Core filename = Nome do ficheiro: unlocked = Novo bloco Desbloqueado! completed = [accent]Completado @@ -144,6 +148,7 @@ techtree = Árvore de tecnologia research.list = [lightgray]Pesquise: research = Pesquisa researched = [lightgray]{0} pesquisado. +research.progress = {0}% complete players = {0} Jogadores Ativos players.single = {0} Jogador Ativo players.search = search @@ -340,6 +345,11 @@ waves.load = Carregar da área de transferência waves.invalid = Hordas inválidas na área de transferência. waves.copied = Hordas copiadas. waves.none = Sem hordas definidas.\nNote que layouts vazios de hordas serão automaticamente substituídos pelo layout padrão. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detalhes... edit = Editar... @@ -459,7 +469,8 @@ locked = Trancado complete = [lightgray]Completo: requirement.wave = Ronda alcançada {0} / {1} requirement.core = Destruir Núcleo Inimigo em {0} -requirement.unlock = Destrava {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resumir Zona:\n[lightgray]{0} bestwave = [lightgray]Melhor: {0} launch = Lançar @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Blocos banidos addall = Adiciona tudo +launch.destination = Destination: {0} configure.invalid = A quantidade deve ser um número entre 0 e {0}. zone.unlocked = [lightgray]{0} Desbloqueado. zone.requirement.complete = Horda {0} alcançada:\n{1} Requerimentos da zona alcançada. @@ -496,6 +508,20 @@ error.io = Erro I/O de internet. error.any = Erro de rede desconhecido. error.bloom = Falha ao inicializar bloom.\nSeu aparelho talvez não o suporte. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Gráficos settings.cleardata = Apagar dados... settings.clear.confirm = Certeza que quer limpar a os dados?\nOque é feito não pode ser desfeito! settings.clearall.confirm = [scarlet]Aviso![]\nIsso vai limpar toda a data, Incluindo saves, mapas, Keybinds e desbloqueados.\nQuando apertar 'ok' Vai apagar toda a data e sair automaticamente. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = Pausado clear = Limpar banned = [scarlet]Banido @@ -557,8 +585,11 @@ blocks.itemsmoved = Velocidade de movimento blocks.launchtime = Tempo entre tiros blocks.shootrange = Alcance blocks.size = Tamanho +blocks.displaysize = Display Size blocks.liquidcapacity = Capacidade de Líquido blocks.powerrange = Alcance da Energia +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Uso de energia blocks.powerdamage = Dano/Poder @@ -574,11 +605,14 @@ blocks.boosteffect = Efeito do Boost blocks.maxunits = Máximo de unidades ativas blocks.health = Saúde blocks.buildtime = Tempo de construção +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Custo de construção blocks.inaccuracy = Imprecisão blocks.shots = Tiros blocks.reload = Tiros por segundo blocks.ammo = Munição +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Broca melhor necessária. bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = Unidades de liquido unit.powerunits = Unidades de energia unit.degrees = Graus unit.seconds = segundos +unit.minutes = mins unit.persecond = por segundo +unit.perminute = /min unit.timesspeed = x Velocidade unit.percent = % +unit.shieldhealth = shield health unit.items = itens unit.thousands = k unit.millions = mil +unit.billions = b category.general = Geral category.power = Poder category.liquids = Líquidos @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Atacar command.rally = Reunir command.retreat = Recuar +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = mover_x keybind.move_y.name = mover_y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Selecionar região keybind.schematic_menu.name = Menu esquemático @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Colocação diagonal keybind.pick.name = Pegar bloco keybind.break_block.name = Quebrar bloco keybind.deselect.name = Deselecionar +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Atirar keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Tempo de horda rules.waves = Hordas rules.attack = Modo de ataque +rules.buildai = AI Building rules.enemyCheat = Recursos de IA Infinitos rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Unidades rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Itens content.liquid.name = Liquidos @@ -830,9 +878,11 @@ liquid.water.name = Água liquid.slag.name = Escória liquid.oil.name = Petróleo liquid.cryofluid.name = Crio Fluido + item.explosiveness = [lightgray]Explosibilidade: {0} item.flammability = [lightgray]Inflamabilidade: {0} item.radioactivity = [lightgray]Radioatividade: {0} + unit.health = [lightgray]Vida: {0} unit.speed = [lightgray]Velocidade: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Pedregulho de areia block.grass.name = Grama block.slag.name = Slag block.salt.name = Sal -block.saltrocks.name = Pedras De Sal +block.salt-wall.name = Salt Wall block.pebbles.name = Pedrinhas block.tendrils.name = Gavinhas -block.sandrocks.name = Pedras de areia +block.sand-wall.name = Sand Wall block.spore-pine.name = Pinheiro de esporo -block.sporerocks.name = Pedras de esporo -block.rock.name = Rocha -block.snowrock.name = Rocha com neve +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Pinheiro com neve block.shale.name = Xisto block.shale-boulder.name = Pedra de xisto block.moss.name = Musgo block.shrubs.name = Arbusto block.spore-moss.name = Musgo de esporos -block.shalerocks.name = Rohas de xisto +block.shale-wall.name = Shale Wall block.scrap-wall.name = Muro de sucata block.scrap-wall-large.name = Muro grande de sucata block.scrap-wall-huge.name = Muro enorme de sucata @@ -919,13 +979,17 @@ block.craters.name = Crateras block.sand-water.name = Água sobre areia block.darksand-water.name = Água sobre areia escura block.char.name = Char -block.holostone.name = Pedra holo +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Gelo de neve -block.rocks.name = Rochas -block.icerocks.name = Rochas de gelo -block.snowrocks.name = Rochas de neve -block.dunerocks.name = Rochas da duna +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pinheiro +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Árvore branca morta block.white-tree.name = Árvore branca block.spore-cluster.name = Aglomerado de esporos @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Painel escuro 4 block.dark-panel-5.name = Painel escuro 5 block.dark-panel-6.name = Painel escuro 6 block.dark-metal.name = Metal escuro -block.ignarock.name = Rocha ígnea +block.basalt.name = Basalt block.hotrock.name = Rocha quente block.magmarock.name = Rocha de magma -block.cliffs.name = Colinas block.copper-wall.name = Parede de Cobre block.copper-wall-large.name = Parede de Cobre Grande block.titanium-wall.name = Parede de titânio @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Bateria block.battery-large.name = Bateria Grande block.combustion-generator.name = Gerador a combustão -block.turbine-generator.name = Gerador de Turbina +block.steam-generator.name = Gerador de Turbina block.differential-generator.name = Gerador diferencial block.impact-reactor.name = Reator De Impacto block.mechanical-drill.name = Broca Mecânica @@ -1055,6 +1118,7 @@ block.container.name = Contâiner block.launch-pad.name = Plataforma de lançamento block.launch-pad-large.name = Plataforma de lançamento grande block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = Azul team.crux.name = Vermelho team.sharded.name = orange @@ -1192,7 +1265,7 @@ block.battery.description = Armazena energia em tempos de energia excedente. Lib block.battery-large.description = Guarda muito mais energia que uma beteria comum. block.combustion-generator.description = Gera energia usando combustível ou petróleo. block.thermal-generator.description = Gera uma quantidade grande de energia usando lava. -block.turbine-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. +block.steam-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = Um Gerador termoelétrico de radioisótopos Que não precisa de refriamento Mas da muito menos energia que o reator de torio. block.solar-panel.description = Gera pequenas quantidades de energia do sol. diff --git a/core/assets/bundles/bundle_ro.properties b/core/assets/bundles/bundle_ro.properties new file mode 100644 index 0000000000..0a3e005854 --- /dev/null +++ b/core/assets/bundles/bundle_ro.properties @@ -0,0 +1,1305 @@ +credits.text = Creat de [royal]Anuken[] - [sky]anukendev@gmail.com[] +credits = Credite +contributors = Traducători și contributori +discord = Intrați pe serverul de Discord al Mindustry! +link.discord.description = Chatul oficial de pe Discord al Mindustry +link.reddit.description = Subredditul Mindustry +link.github.description = Codul sursă al jocului +link.changelog.description = Lista schimbărilor din update +link.dev-builds.description = Builduri instabile ale dezvoltatorului +link.trello.description = Pagina oficială de Trello pentru funcțiile planificate +link.itch.io.description = Pagina itch.io cu descărcările pentru PC +link.google-play.description = Google Play +link.f-droid.description = Catalogul F-Droid +link.wiki.description = Wikiul oficial al Mindustry +link.suggestions.description = Sugerează noi funcții +linkfail = Linkul nu a putut fi deschis!\nAdresa URL a fost copiată. +screenshot = Captură de ecran salvată la {0} +screenshot.invalid = Harta e prea mare. Se poate să nu existe suficientă memorie pentru captura de ecran. +gameover = Jocul s-a încheiat +gameover.pvp = Echipa [accent] {0}[] este câștigătoare! +highscore = [accent]Scor maxim nou! +copied = Copiat. +indev.popup = [accent]v6[] este momentan în [accent]alpha[].\n[lightgray]Asta înseamnă că:[]\n[scarlet]- Campania este complet neterminată[]\n- Majoritatea [scarlet]AI-ului unităților[] nu funcționează bine\n- Multe unități sunt neterminate\n- Modul campanie nu este terminat \n- Tot ce vedeți se poate schimba sau poate fi eliminat.\n\nPentru a raporta buguri și crashuri intrați pe [accent]Github[]. +indev.notready = Această secțiune a jocului nu este gata încă. + +load.sound = Sunete +load.map = Hărți +load.image = Imagini +load.content = Conținut +load.system = Sistem +load.mod = Moduri +load.scripts = Scripturi + +be.update = Un nou build Bleeding Edge este disponibil: +be.update.confirm = Îl descarci și repornești acum? +be.updating = Se face update... +be.ignore = Ignoră +be.noupdates = Niciun update disponibil. +be.check = Verifică updateurile + +schematic = Schemă +schematic.add = Salvează Schema... +schematics = Scheme +schematic.replace = O schemă cu acel nume există deja. O înlocuiți? +schematic.exists = O schemă cu acel nume există deja. +schematic.import = Importă Schema... +schematic.exportfile = Exportă Fișier +schematic.importfile = Importă Fișier +schematic.browseworkshop = Intră pe Workshop +schematic.copy = Copiază în Clipboard +schematic.copy.import = Importă din Clipboard +schematic.shareworkshop = Partajează pe Workshop +schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Întoarce Schemă +schematic.saved = Schemă salvată. +schematic.delete.confirm = Schema această va fi ștearsă permanent. +schematic.rename = Redenumește Schema +schematic.info = {0}x{1}, {2} blocuri + +stat.wave = Valuri Învinse:[accent] {0} +stat.enemiesDestroyed = Inamici Distruși:[accent] {0} +stat.built = Structuri Construite:[accent] {0} +stat.destroyed = Structuri Distruse:[accent] {0} +stat.deconstructed = Structuri Deconstruite:[accent] {0} +stat.delivered = Resurse Lansate: +stat.playtime = Timp Joc:[accent] {0} +stat.rank = Rang Final: [accent]{0} + +globalitems = [accent]Materiale Globale +map.delete = Sigur vrei să ștergi harta "[accent]{0}[]"? +level.highscore = Scor Maxim: [accent]{0} +level.select = Selectează Nivelul +level.mode = Mod de Joc: +coreattack = < Nucleul este atacat! > +nearpoint = [[ [scarlet]PLEACĂ DE LA PUNCTUL DE LANSARE IMEDIAT[] ]\nanihilare imminentă +database = Datele Nucleului +savegame = Salvează Jocul +loadgame = Încarcă Jocul +joingame = Intră în Joc +customgame = Personalizat +newgame = Joc Nou +none = +minimap = Minihartă +position = Poziție +close = Închide +website = Site +quit = Abandonează +save.quit = Salvează și Închide +maps = Hărți +maps.browse = Selectează Hărți +continue = Continuă +maps.none = [lightgray]Nu s-au găsit hărți! +invalid = Invalid +pickcolor = Alege Culoarea +preparingconfig = Se Pregătește Configurația +preparingcontent = Se Pregătește Conținutul +uploadingcontent = Se Încarcă Conținutul +uploadingpreviewfile = Se Încarcă Previzualizarea Fișierului +committingchanges = Se Încarcă Schimbările +done = Gata +feature.unsupported = Dispozitivul tău nu suportă această funcție. + +mods.alphainfo = Modurile sunt încă în alpha și[scarlet] pot avea multe buguri[].\nRaportați orice probleme apărute pe Githubul Mindustry sau pe Discord. +mods.alpha = [accent](Alpha) +mods = Moduri +mods.none = [lightgray]Nu s-au găsit moduri! +mods.guide = Ghid de Modding +mods.report = Raportează Bug +mods.openfolder = Deschide Folder +mods.reload = Reîncarcă +mods.reloadexit = Jocul se va opri ca să reîncarce modurile. +mod.display = [gray]Mod:[orange] {0} +mod.enabled = [lightgray]Activat +mod.disabled = [scarlet]Dezactivat +mod.disable = Dezactivează +mod.content = Conținut: +mod.delete.error = Nu s-a putut șterge modul. Fișierul ar putea fi în uz. +mod.requiresversion = [scarlet]Ai nevoie de versiunea de joc minimă: [accent]{0} +mod.outdated = [scarlet]Nu este compatibil cu V6 (no minGameVersion: 105) +mod.missingdependencies = [scarlet]Dependențe Lipsă: {0} +mod.erroredcontent = [scarlet]Erori de Conținut +mod.errors = Au apărut erori la încărcarea conținutului. +mod.noerrorplay = [scarlet]Modurile tale au erori.[] Dezactivează modurile afectate sau repară erorile înainte să joci. +mod.nowdisabled = [scarlet]Modul '{0}' are dependențe lipsă:[accent] {1}\n[lightgray]Mai întâi trebuie să descarci aceste moduri.\nAcest mod va fi dezactivat automat. +mod.enable = Activează +mod.requiresrestart = Jocul se va închide acum pt a aplica modificările modurilor. +mod.reloadrequired = [scarlet]E Nevoie de o Repornire +mod.import = Importă Mod +mod.import.file = Importă Fișier +mod.import.github = Importă din GitHub +mod.jarwarn = [scarlet]Modurile în format JAR nu sunt sigure.[]\nAi grijă să importezi acest mod dintr-o sursă de încredere! +mod.item.remove = Acest obiect este parte din modul [accent] '{0}'[]. Ca să îl poți elimina, dezinstalează acel mod. +mod.remove.confirm = Acest mod va fi șters. +mod.author = [lightgray]Autor:[] {0} +mod.missing = Această salvare conține moduri cărora le-ai făcut update recent sau nu mai sunt instalate. Fișierul poate fi corupt. Sigur vrei să îl încarci?\n[lightgray]Moduri:\n{0} +mod.preview.missing = Înainte să publici acest mod pe Workshop, trebuie să adaugi o imagine pt previzualizare.\nPune o imagine numită[accent] preview.png[] în folderul modului și încearcă din nou. +mod.folder.missing = Doar modurile din câmpul folder pot fi publicate pe Workshop.\nPt a converti orice mod într-un folder, dezarhivează zipul într-un folder și șterge vechiul zip, apoi repornește jocul sau reîncărcă-ți modurile. +mod.scripts.disable = Dispozitivul tău nu suportă moduri cu scripturi. Trebuie să dezactivezi aceste moduri ca să joci jocul. + +about.button = Despre +name = Nume: +noname = Mai întâi alege un [accent] nume de jucător[]. +planetmap = Harta Planetei +launchcore = Lansează Nucleu +filename = Nume Fișier: +unlocked = Nou conținut deblocat! +completed = [accent]Finalizat +techtree = Tehnologie +research.list = [lightgray]Cercetare: +research = Cercetează +researched = [lightgray]{0} cercetat. +research.progress = {0}% finalizat +players = {0} jucători +players.single = {0} jucător +players.search = caută +players.notfound = [gray]niciun jucător găsit +server.closing = [accent]Se închide serverul... +server.kicked.kick = S-ar putea să fi fost dat afară de pe server! +server.kicked.whitelist = Nu ești în lista albă a serverului. +server.kicked.serverClose = Server închis. +server.kicked.vote = Ai fost dat afară de către ceilalți jucători. La revedere. +server.kicked.clientOutdated = Client învechit! Fă-ți update la joc! +server.kicked.serverOutdated = Server învechit! Roagă gazda să facă update! +server.kicked.banned = Ești interzis pe acest server. +server.kicked.typeMismatch = Acest server nu este compatibil cu tipul tău de build. +server.kicked.playerLimit = Serverul acesta e plin. Așteaptă pt un loc liber. +server.kicked.recentKick = Ai fost dat afară recent.\nAșteaptă înainte de a te reconecta. +server.kicked.nameInUse = Cineva cu același nume\neste deja pe server. +server.kicked.nameEmpty = Numele ales este invalid. +server.kicked.idInUse = Ești deja pe acest server! Nu poți conecta două conturi. +server.kicked.customClient = Acest server nu suportă builduri personalizate. Descarcă o versiune oficială. +server.kicked.gameover = Joc încheiat! +server.kicked.serverRestarting = Acest server se repornește. +server.versions = Versiunea ta:[accent] {0}[]versiunea serverului:[accent] {1}[] +host.info = Butonul [accent]găzduiește[] va găzdui un server pe portul [scarlet]6567[]. \nOrice persoană de pe același port [lightgray]wifi sau rețea locală[] ar trebui să-ți vadă serverul în lista lor de servere.\n\nDacă vrei ca lumea să se poată conecta de oriunde cu IP-ul, este nevoie de [accent]port forwarding[].\n\n[lightgray]Notă: Dacă cineva are probleme în a se conecta la jocul tău LAN, verifică dacă ai lăsat Mindustry să acceseze rețeaua locală în setările de firewall. De menționat este faptul că uneori rețelele publice nu permit descoperirea serverului. +join.info = Aici poți scrie un [accent]IP de server[] pt a te conecta, a descoperi [accent]rețeaua locală[] sau serverele [accent]globale[] pt a te conecta la ele.\nAtât multiplayerul LAN cât și cel WAN este suportat.\n\n[lightgray]Dacă vrei să te conectezi la cineva cu IP-ul, trebuie să ceri gazdei IP-ul său, care poate fi găsit căutând pe Google "my ip' de pe dispozitivul lor. +hostserver = Găzduiește Joc Multiplayer +invitefriends = Invită Prieteni +hostserver.mobile = Găzduiește Joc +host = Găzduiește +hosting = [accent]Se deschide serverul... +hosts.refresh = Reîncarcă +hosts.discovering = Se caută jocur LAN +hosts.discovering.any = Se caută jocuri +server.refreshing = Se reîncarcă serverul +hosts.none = [lightgray]Nu s-au găsit jocuri locale! +host.invalid = [scarlet]Nu s-a putut face conectarea la gazdă! + +servers.local = Servere Locale +servers.remote = Servere de la Distanță +servers.global = Servere ale Comunității + +trace = Urmărește Jucător +trace.playername = Nume jucător: [accent]{0} +trace.ip = IP: [accent]{0} +trace.id = ID unic: [accent]{0} +trace.mobile = Client Mobil: [accent]{0} +trace.modclient = Client Personalizat: [accent]{0} +invalidid = ID client invalid! Raportează bugul. +server.bans = Interziși +server.bans.none = Nu s-au găsit jucători intreziși! +server.admins = Admini +server.admins.none = Nu s-au găsit admini! +server.add = Adăugă server +server.delete = Sigur vrei să ștergi acest server? +server.edit = Editează Server +server.outdated = [scarlet]Server Învechit![] +server.outdated.client = [scarlet]Client Învechit![] +server.version = [gray]v{0} {1} +server.custombuild = [accent]Build Personalizat +confirmban = Sigur vrei să interzici jucătorul "{0}[white]"? +confirmkick = Sigur vrei să-l dai afară pe "{0}[white]"? +confirmvotekick = Sigur vrei să-l dai afară pe "{0}[white]"? +confirmunban = Sigur vrei ca acest jucător să nu mai fie interzis? +confirmadmin = Sigur vrei să-l faci pe "{0}[white]" un admin? +confirmunadmin = Sigur vrei ca "{0}[white]" să nu mai fie un admin? +joingame.title = Alătură-te Jocului +joingame.ip = Adresă: +disconnect = Deconectat. +disconnect.error = Eroare de conexiune. +disconnect.closed = Conexiune închisă. +disconnect.timeout = Întârzie să răspundă. +disconnect.data = Nu s-au putut încărca datele lumii! +cantconnect = Nu te-ai putut alătura jocului ([accent]{0}[]). +connecting = [accent]Conectare... +connecting.data = [accent]Se încarcă datele hărții... +server.port = Port: +server.addressinuse = Adresa este deja în uz! +server.invalidport = Număr de port invalid! +server.error = [scarlet]Eroare la găzduirea serverului. +save.new = Nouă Salvare +save.overwrite = Sigur vrei să scrii peste \nacest slot de salvare? +overwrite = Scrie Peste +save.none = Nu s-au găsit salvări! +savefail = Salvarea jocului a eșuat! +save.delete.confirm = Sigur vrei să ștergi această salvare? +save.delete = Șterge +save.export = Exportă Salvarea +save.import.invalid = [accent]Salvarea aceasta e invalidă! +save.import.fail = [scarlet]Importul salvării a eșuat: [accent]{0} +save.export.fail = [scarlet]Exportul salvării a eșuat: [accent]{0} +save.import = Importă Salvarea +save.newslot = Numele Salvării: +save.rename = Redenumire +save.rename.text = Noul nume: +selectslot = Selectează o salvare. +slot = [accent]Slotul {0} +editmessage = Editează Mesaj +save.corrupted = Fișier salvare corupt sau invalid! +empty = +on = Pornit +off = Oprit +save.autosave = Autosalvare: {0} +save.map = Hartă: {0} +save.wave = Valul {0} +save.mode = Mod de Joc: {0} +save.date = Ultima Salvare: {0} +save.playtime = Timp în Joc: {0} +warning = Atenție +confirm = Confirmă +delete = Șterge +view.workshop = Vezi în Workshop +workshop.listing = Editează Listarea din Workshop +ok = OK +open = Deschide +customize = Personalizează Regulile +cancel = Anulare +openlink = Deschidr Linkul +copylink = Copiază Linkul +back = Înapoi +data.export = Exportă Date +data.import = Importă Date +data.openfolder = Deschide Folderul cu Date +data.exported = Date exportate. +data.invalid = Aceste date de joc nu sunt valide. +data.import.confirm = Importul de date externe va suprascrie[scarlet] toate[] datele tale de joc curente.\n[accent]Acest proces este ireversibil![]\n\nOdată ce datele sunt importate, jocul tău se va opri imediat. +quit.confirm = Sigur vrei să abandonezi? +quit.confirm.tutorial = Sigur știi ce faci?\nTutorialul poate fi reluat în[accent] Setări->Joc->Reia Tutorialul.[] +loading = [accent]Se încarcă... +reloading = [accent]Se Reincarcă Modurile... +saving = [accent]Se salvează... +respawn = [accent][[{0}][] ca să te refaci în nucleu +cancelbuilding = [accent][[{0}][] pt a curăța planul +selectschematic = [accent][[{0}][] pt selectare+copiere +pausebuilding = [accent][[{0}][] pt a face o pauză de la construit +resumebuilding = [scarlet][[{0}][] pt a continua construitul +wave = [accent]Valul {0} +wave.waiting = [lightgray]Val în {0} +wave.waveInProgress = [lightgray]Val în desfășurare +waiting = [lightgray]În așteptare... +waiting.players = Se așteaptă jucătorii... +wave.enemies = [lightgray]Mai sunt {0} inamici +wave.enemy = [lightgray]Mai e {0} inamic +loadimage = Încarcă Imagine +saveimage = Salvează Imagine +unknown = Necunoscut +custom = Personalizată +builtin = Prestabilită +map.delete.confirm = Ești sigur că vrei să ștergi această hartă? Acțiunea este ireversibilă! +map.random = [accent]Hartă Aleatorie +map.nospawn = Harta asta nu are niciun nucleu în care vor apărea jucătorii! Adaugă un nucleu[accent] portocaliu[] acestei hărți în editor. +map.nospawn.pvp = Această hartă nu are niciun nucleu inamic în care să apară jucătorii! Adaugă nuclee[scarlet] care nu sunt portocalii[] acestei hărți în editor. +map.nospawn.attack = Această hartă nu are niciun nucleu inamic pe care să îl atace jucătorii! Adaugă un nucleu[scarlet] roșu[] acestei hărți în editor. +map.invalid = Eroare la încărcarea hărții: fișier corupt sau invalid. +workshop.update = Fă Update la Item +workshop.error = Eroare la preluarea detaliilor din Workshop: {0} +map.publish.confirm = Sigur vrei să publici această hartă?\n\n[lightgray] Asigură-te că ești de acord cu Termenii și Condițiile Workshop mai întâi, sau hărțile tale nu vor fi publicate! +workshop.menu = Selectează ce ai vrea să faci cu acest item. +workshop.info = Informații despre Item +changelog = Schimbări (opțional): +eula = Steam EULA (Termeni și Condiții) +missing = Acest item a fost șters sau mutat.\n[lightgray]Listarea de pe Workshop a fost automat dezlegată. +publishing = [accent]Se Publică... +publish.confirm = Sigur vrei să publici asta?\n\n[lightgray]Asigură-te că ai verificat Termenii și Condițiile Workshop mai întâi, sau itemurile tale nu vor apărea! +publish.error = Eroare la publicarea itemului: {0} +steam.error = Inițializarea serviciilor Steam a eșuat.\nEroare: {0} + +editor.brush = Pensulă +editor.openin = Deschide în Editor +editor.oregen = Generarea Minereurilor +editor.oregen.info = Generarea Minereurilor: +editor.mapinfo = Informații Hartă +editor.author = Autor: +editor.description = Descriere: +editor.nodescription = O hartă trebuie să aibă o descriere care să conțină măcar 4 caractere înainte să fie publicată. +editor.waves = Valuri: +editor.rules = Reguli: +editor.generation = Generare: +editor.ingame = Editează în Joc +editor.publish.workshop = Publică pe Workshop +editor.newmap = Hartă Nouă +workshop = Workshop +waves.title = Valuri +waves.remove = Elimină +waves.never = +waves.every = la fiecare +waves.waves = val(uri) +waves.perspawn = per apariție +waves.shields = scuturi/val +waves.to = până la +waves.guardian = Gardian +waves.preview = Previzualizare +waves.edit = Editează... +waves.copy = Copiază în Clipboard +waves.load = Încarcă din Clipboard +waves.invalid = Valuri invalide în clipboard. +waves.copied = Valuri copiate. +waves.none = Niciun inamic definit.\nDe reținut că o listă de valuri goală va fi înlocuită automat cu lista de valuri prestabilită. + +wavemode.counts = numere +wavemode.totals = totaluri +wavemode.health = viață + +editor.default = [lightgray] +details = Detalii... +edit = Editare... +editor.name = Nume: +editor.spawn = Adaugă Unitate +editor.removeunit = Înlătură Unitate +editor.teams = Echipe +editor.errorload = Eroare la încărcarea fișierului. +editor.errorsave = Eroare la salvarea fișierului. +editor.errorimage = Aceasta este o imagine, nu o hartă.\n\nDacă vrei să imporți o hartă din versiunile 3.5/build 40, folosește butonul 'Importă Hartă Veche' din editor. +editor.errorlegacy = Hartă aceasta este prea veche, și folosește un format învechit care nu mai este suportat. +editor.errornot = Acesta nu este un fișier cu o hartă. +editor.errorheader = Acest fișier de hartă este invalid sau corupf. +editor.errorname = Harta nu are un nume definit. Încerci cumva să încarci un fișier cu o salvare de joc? +editor.update = Update +editor.randomize = Aleatoriu +editor.apply = Aplică +editor.generate = Generează +editor.resize = Schimbă Dimensiune +editor.loadmap = Încarcă Harta +editor.savemap = Salvează Harta +editor.saved = Salvat! +editor.save.noname = Hartă ta nu are un nume! Setează unul în meniul 'Informații despre hartă'. +editor.save.overwrite = Hartă ta suprascrie o hartă prestabilită! Alege un nume diferit în meniul 'Informații despre hartă'. +editor.import.exists = [scarlet]Nu s-a putut importa:[] o hartă prestabilită numită '{0}' deja există! +editor.import = Importă... +editor.importmap = Importă Hartă +editor.importmap.description = Importă o hartă deja existentă +editor.importfile = Importă Fișier +editor.importfile.description = Importă un fișier hartă extern +editor.importimage = Importă Hartă Veche (Imagine) +editor.importimage.description = Importă o hartă imagine externă +editor.export = Exportă... +editor.exportfile = Exportă Fișier +editor.exportfile.description = Exportă un fișier hartă +editor.exportimage = Exportă o Hartă Imagine +editor.exportimage.description = Exportă o hartă imagine conținând doar teren de bază +editor.loadimage = Importă Hartă Imagine +editor.saveimage = Exportă Hartă Imagine +editor.unsaved = Sigur vrei să ieși?\n[scarlet]Orice schimbări nesalvate vor fi pierdute. +editor.resizemap = Schimbă Dimensiunea Hărții +editor.mapname = Nume Hartă: +editor.overwrite = [accent]Atenție! \nAceastă hartă va suprascrie o hartă existentă. +editor.overwrite.confirm = [scarlet]Atenție![] o hartă cu acest nume există deja. Sigur vrei să o suprascrii?\n"[accent]{0}[]" +editor.exists = Există deja o hartă cu același nume. +editor.selectmap = Selectează o hartă de încărcat: + +toolmode.replace = Înlocuiește +toolmode.replace.description = Desenează doar pe blocurile solide. +toolmode.replaceall = Înlocuiește-le pe toate +toolmode.replaceall.description = Înlocuiește toate blocurile solide de pe hartă. +toolmode.orthogonal = Ortogonal +toolmode.orthogonal.description = Desenează doar linii ortogonale. +toolmode.square = Pătrat +toolmode.square.description = Pensulă pătrată. +toolmode.eraseores = Șterge Minereurile +toolmode.eraseores.description = Șterge doar minereurile. +toolmode.fillteams = Umplere Echipe +toolmode.fillteams.description = Umple hartă cu echipe în loc de blocuri. +toolmode.drawteams = Desenează Echipe +toolmode.drawteams.description = Desenează echipe în loc de blocuri. + +filters.empty = [lightgray]Fără filtre! Adaugă unul folosind butonul de mai jos. +filter.distort = Distorsionare +filter.noise = Zgomot Vizual +filter.enemyspawn = Selectare Punct de Lansare Inamic +filter.corespawn = Selectare Nucleu +filter.median = Mediană +filter.oremedian = Mediană Minereu +filter.blend = Amestecare +filter.defaultores = Miercuri Prestabilite +filter.ore = Minereu +filter.rivernoise = Zgomot Vizual Râuri +filter.mirror = Oglindă +filter.clear = Curăță +filter.option.ignore = Ignoră +filter.scatter = Împrăștie +filter.terrain = Teren +filter.option.scale = Scară +filter.option.chance = Șansă +filter.option.mag = Magnitudine +filter.option.threshold = Cantitate +filter.option.circle-scale = Scară circulară +filter.option.octaves = Octave +filter.option.falloff = Cădere +filter.option.angle = Unghi +filter.option.amount = Cantitate +filter.option.block = Bloc +filter.option.floor = Podea +filter.option.flooronto = Podea țintă +filter.option.wall = Perete +filter.option.ore = Minereu +filter.option.floor2 = Podea Secundară +filter.option.threshold2 = Cantitate Secundară +filter.option.radius = Rază +filter.option.percentile = Procent + +width = Lățime: +height = Înălțime: +menu = Meniu +play = Joacă +campaign = Campanie +load = Încarcă +save = Salvează +fps = FPS: {0} +ping = Ping: {0}ms +language.restart = Vă rugăm să reporniți jocul pentru că setările de limbă să aibă efect. +settings = Setări +tutorial = Tutorial +tutorial.retake = Reia Tutorial +editor = Editor +mapeditor = Editor Hărți + +abandon = Abandonează +abandon.text = Zona aceasta și toate resursele ei vor fi cedate inamicului. +locked = Blocat +complete = [lightgray]Finalizat: +requirement.wave = Ajungi la valul {0} în {1} +requirement.core = Distruge Nucleu Inamic în{0} +requirement.research = Cercetează {0} +requirement.capture = Capturează {0} +resume = Revin la Zonă:\n[lightgray]{0} +bestwave = [lightgray]Cel Mai Bun Val: {0} +launch = < LANSARE > +launch.text = Lansează +launch.title = Lansare Finalizată +launch.next = [lightgray]următoarea ocazie la valul {0} +launch.unable2 = [scarlet]Imposibil de LANSAT.[] +launch.confirm = Asta va lansa toate resursele din nucleu.\nNu te vei mai putea întoarce la această bază. +launch.skip.confirm = Dacă sari acum, Nu vei mai putea lansa decât valurile viitoare. +uncover = Descoperă +configure = Configurează Încărcarea +loadout = Încărcare +resources = Resurse +bannedblocks = Blocuri Interzise +addall = Adaugă-le pe toate +launch.destination = Destination: {0} +configure.invalid = Cantitatea trebuie să fie un număr între 0 și {0}. +zone.unlocked = [lightgray]{0} deblocat(ă). +zone.requirement.complete = Cerințele pt {0} finalizate:[lightgray]\n{1} +zone.resources = [lightgray]Resurse Detectate: +zone.objective = [lightgray]Obiectiv: [accent]{0} +zone.objective.survival = Supraviețuiește +zone.objective.attack = Distruge Nucleul Inamic +add = Adaugă... +boss.health = Viața Gardianului + +connectfail = [scarlet]Eroare de conexiune:\n\n[accent]{0} +error.unreachable = Nu s-a putut ajunge la server.\nesigur adresa e scrisă corect? +error.invalidaddress = Adresă invalidă. +error.timedout = Răspuns întârziat!\nAsigură-te că gazda are port forwarding activat, și că adresa este corectă! +error.mismatch = Eroare de pachet:\nPosibil ca versiunea de client/server să nu se potrivească.\nAsigură-te că tu și gazda aveți ultima versiune de Mindustry! +error.alreadyconnected = Deja conectat. +error.mapnotfound = Fișierul hărții nu a fost găsit! +error.io = Eroare de rețea I/O. +error.any = Eroare de rețea necunoscută. +error.bloom = Inițializarea strălucirii a eșuat.\nS-ar putea ca dispozitivul tău să nu suporte funcția. + +weather.rain.name = Ploaie +weather.snow.name = Ninsoare +weather.sandstorm.name = Furtună de nisip +weather.sporestorm.name = Furtună de spori + +sectors.unexplored = [lightgray]Neexplorat +sectors.resources = Resurse: +sectors.production = Producție: +sectors.stored = Stocat: +sectors.resume = Revino +sectors.launch = Lansare +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + +sector.groundZero.name = Ground Zero +sector.craters.name = The Craters +sector.frozenForest.name = Frozen Forest +sector.ruinousShores.name = Ruinous Shores +sector.stainedMountains.name = Stained Mountains +sector.desolateRift.name = Desolate Rift +sector.nuclearComplex.name = Nuclear Production Complex +sector.overgrowth.name = Overgrowth +sector.tarFields.name = Tar Fields +sector.saltFlats.name = Salt Flats +sector.fungalPass.name = Fungal Pass + +sector.groundZero.description = Locația optimă pt a începe încă odată. Risc de inamici scăzut. Puține resurse.\nAdună cât de mult plumb și cupru se poate.\nMergi mai departe. +sector.frozenForest.description = Chiar și aici, aproape de munți, sperii s-au împrăștiat. Temperaturile reci nu-i pot reține la infinit.\n\nÎncepe călătoria către electricitate. Construiește generatoare de combustie. Învață să folosești reparatoare. +sector.saltFlats.description = La periferia deșertului stau Salt Flats. Puține resurse pot fi găsite în această locație.\n\nInamicul a ridicat un complex-depozit aici. Distruge-le nucleul. Nu lăsa nimic în urmă. +sector.craters.description = Apa s-a acumulat în acest crater, rămășiță a vechilor războaie. Cucerește din nou zona. Adună nisip. Toarnă-l în metasticlă. Pompează apă pt a răci armele și burghiele. +sector.ruinousShores.description = După deșerturi vine țărmul. Odată, locația aceasta a avut un sistem de apărare de coastă. N-a rămas mult din el. Doar structurile de apărare cele mai de bază rămas în picioare, restul fiind redus la fier vechi.\nContinuă expansiunea în afară. Redescoperă tehnologia. +sector.stainedMountains.description = Mai înspre continent sunt munții, încă neatinși de spori.\nExtrage abundentele resurse de titan din zonă. Învață cum să-l folosești.\n\nPrezența inamicului e mai mare aici. Nu le da timp să-și trimită cele mai puternice unități. +sector.overgrowth.description = Zona asta e plină de buruieni, mai aproape de sursa sporilor.\nInamicul și-a stabilit un adăpost aici. Construiește unități Titan. Distruge-o. Cucerește din nou ce s-a pierdut. +sector.tarFields.description = O zonă aflată la periferia unei zone de producție petrolieră, între munți și deșert. Una din puținele zone cu resurse utilizabile de țiței.\nDeși abandonată, zona aceasta are niște forțe inamice periculoase înapropiere. Nu le subestima.\n\n[lightgray]Cercetează tehnologia de procesare a petrolului dacă se poate. +sector.desolateRift.description = O zonă extrem de periculoasă. Multe resurse, dar puțin spațiu. Mare risc de distrugere. Pleacă cât mai curând. Nu te lăsa păcălit de timpul mare dintre atacurile inamice. +sector.nuclearComplex.description = O fostă facilitate pt producerea și procesarea de torium, redusă la ruine.\n[lightgray]Cercetează toriul și multele sale utilizări.\n\nInamicul e prezent aici în mari numere, căutând constând atacatori. +sector.fungalPass.description = O zonă de tranziție dintre munții înalți și zonele joase, pline cu spori. O mică bază de recunoaștere a inamicului este localizată aici.\nDistruge-o.\nFolosește unități Dagger și Crawler. Distruge cele 2 nuclee. + +settings.language = Limbă +settings.data = Datele Jocului +settings.reset = Resetează +settings.rebind = Reatribuie +settings.resetKey = Resetează +settings.controls = Controale +settings.game = Joc +settings.sound = Sunet +settings.graphics = Grafică +settings.cleardata = Șterge Datele Jocului... +settings.clear.confirm = Sigur vrei să ștergi datele?\nCe e făcut nu poate fi desfăcut! +settings.clearall.confirm = [scarlet]Atenție![]\nAsta va șterge toate datele, inclusiv salvări, hărți, deblocări și atribuiri de controale.\nOdată ce apeși 'ok' jocul va șterge toate datele și se va închide automat. +settings.clearsaves.confirm = Sigur vrei să ștergi toate salvările? +settings.clearsaves = Șterge Salvările +paused = [accent]< Pauză > +clear = Curăță +banned = [scarlet]Interzis +unplaceable.sectorcaptured = [scarlet]Ai nevoie de un sector capturat +yes = Da +no = Nu +info.title = Info +error.title = [scarlet]A apărut o eroare. +error.crashtitle = A apărut o eroare. +unit.nobuild = [scarlet]Unitatea nu poate construi. +blocks.input = Necesită +blocks.output = Produce +blocks.booster = Booster +blocks.tiles = Teren Necesar +blocks.affinities = Efecte Teren +block.unknown = [lightgray]??? +blocks.powercapacity = Capacitate electrică +blocks.powershot = Electricitate/Glonț +blocks.damage = Forță +blocks.targetsair = Lovește Aeronave +blocks.targetsground = Lovește Artilerie +blocks.itemsmoved = Viteza de Mișcare a Materialelor +blocks.launchtime = Timp între Lansări +blocks.shootrange = Rază +blocks.size = Mărime +blocks.displaysize = Mărimea Monitorului Logic +blocks.liquidcapacity = Capacitate Lichid +blocks.powerrange = Raza Electrică +blocks.linkrange = Raza Legăturilor +blocks.instructions = Instrucțiuni +blocks.powerconnections = Maxim Conexiuni +blocks.poweruse = Consum Electricitate +blocks.powerdamage = Electricitate/Forța Glonțului +blocks.itemcapacity = Capacitate Materiale +blocks.basepowergeneration = Generare Electricitate (Bază) +blocks.productiontime = Timp Producție +blocks.repairtime = Durata Reparării Blocului +blocks.speedincrease = Creștere Viteză +blocks.range = Rază +blocks.drilltier = Minabile +blocks.drillspeed = Viteză Burghiu (Bază) +blocks.boosteffect = Efect de Boost +blocks.maxunits = Maxim Unități Active +blocks.health = Viață +blocks.buildtime = Timp Construcție +blocks.maxconsecutive = Maxim Consecutive +blocks.buildcost = Cost Construcție +blocks.inaccuracy = Inacuratețe +blocks.shots = Lovituri +blocks.reload = Lovituri/Secundă +blocks.ammo = Muniție +blocks.shieldhealth = Viața Scutului +blocks.cooldowntime = Timp de Reîncărcare + +bar.drilltierreq = Burghiu Mai Bun Necesar +bar.noresources = Resurse lipsă +bar.corereq = Plasare pe Nucleu Necesară +bar.drillspeed = Viteză Minare: {0}/s +bar.pumpspeed = Viteză Pompare: {0}/s +bar.efficiency = Eficiență: {0}% +bar.powerbalance = Electricitate: {0}/s +bar.powerstored = Stocată: {0}/{1} +bar.poweramount = Electricitate: {0} +bar.poweroutput = Electricitate Produsă: {0} +bar.items = Materiale: {0} +bar.capacity = Capacitate: {0} +bar.unitcap = {0} {1}/{2} +bar.limitreached = [scarlet] {0} / {1}[white] {2}\n[lightgray][[unit disabled] +bar.liquid = Lichid +bar.heat = Căldură +bar.power = Electricitate +bar.progress = Progres +bar.input = Necesită +bar.output = Produce + +bullet.damage = [stat]{0}[lightgray] forță +bullet.splashdamage = [stat]{0}[lightgray] forță explozivă ~[stat] {1}[lightgray] pătrate +bullet.incendiary = [stat]incendiar +bullet.homing = [stat]cu radar +bullet.shock = [stat]șoc +bullet.frag = [stat]fragil +bullet.knockback = [stat]{0} [lightgray]împingere +bullet.freezing = [stat]înghețat +bullet.tarred = [stat]lipicios +bullet.multiplier = [stat]{0}[lightgray]x multiplicator muniție +bullet.reload = [stat]{0}[lightgray]x lovituri + +unit.blocks = blocuri +unit.powersecond = electricitate/secundă +unit.liquidsecond = unități lichid/secundă +unit.itemssecond = materiale/secundă +unit.liquidunits = unități lichid +unit.powerunits = electricitate +unit.degrees = grade +unit.seconds = secunde +unit.minutes = min +unit.persecond = /sec +unit.perminute = /min +unit.timesspeed = x viteză +unit.percent = % +unit.shieldhealth = viața scutului +unit.items = materiale +unit.thousands = mii +unit.millions = mil +unit.billions = b +category.general = General +category.power = Electricitate +category.liquids = Lichide +category.items = Materiale +category.crafting = Necesită/Produce +category.shooting = Lovire +category.optional = Îmbunătățiri opționale +setting.landscape.name = Blochează Mod Peisaj +setting.shadows.name = Umbre +setting.blockreplace.name = Sugestii Plasare Automats +setting.linear.name = Filtrare Liniară +setting.hints.name = Indicii +setting.flow.name = Afișează Rata de Curgere a lichidelor +setting.buildautopause.name = Autopauză de la Construit +setting.mapcenter.name = Auto Centrează Harta La Jucător +setting.animatedwater.name = Fluide Animate +setting.animatedshields.name = Scuturi Animate +setting.antialias.name = Antialiasing[lightgray] (necesită repornire)[] +setting.playerindicators.name = Indicatori Jucător +setting.indicators.name = Indicatori Inamic +setting.autotarget.name = Auto-Țintire +setting.keyboard.name = Controale Mouse+Tastatură +setting.touchscreen.name = Controale Touchscreen +setting.fpscap.name = FPS Maxim +setting.fpscap.none = Niciuna +setting.fpscap.text = FPS (0) +setting.uiscale.name = Scară Interfață [lightgray] (repornirea necesară)[] +setting.swapdiagonal.name = Plasează Mereu Diagonal +setting.difficulty.training = Antrenament +setting.difficulty.easy = Ușor +setting.difficulty.normal = Normal +setting.difficulty.hard = Greu +setting.difficulty.insane = Nebunesc +setting.difficulty.name = Dificultate: +setting.screenshake.name = Agitare Ecran +setting.effects.name = Vezi Efectele +setting.destroyedblocks.name = Vezi Blocurile Distruse +setting.blockstatus.name = Vezi Statusul Blocului +setting.conveyorpathfinding.name = Găsirea Drumului la Plasarea Benzii +setting.sensitivity.name = Sensibilitatea Controlului +setting.saveinterval.name = Interval de Salvare +setting.seconds = {0} secunde +setting.blockselecttimeout.name = Selectarea Blocului a Întârziat +setting.milliseconds = {0} millisecunde +setting.fullscreen.name = Ecran Complet +setting.borderlesswindow.name = Fereastră Fără Margine[lightgray] (repornirea poate fi necesară) +setting.fps.name = Vezi FPS & Ping +setting.smoothcamera.name = Cameră Graduală +setting.blockselectkeys.name = Vezi Detalii Cheie cu Privire la Selectarea Blocurilor +setting.vsync.name = VSync +setting.pixelate.name = Pixelează +setting.minimap.name = Vezi Miniharta +setting.coreitems.name = Vezi Materialele din Nucleu (neterminat) +setting.position.name = Vezi Poziția Jucătorului +setting.musicvol.name = Volumul Muzicii +setting.atmosphere.name = Vezi Atmosfera Planetelor +setting.ambientvol.name = Volum Ambiental +setting.mutemusic.name = Muzica pe Mut +setting.sfxvol.name = Volum SFX +setting.mutesound.name = Sunetul pe Mut +setting.crashreport.name = Trimite Rapoarte de Crash anonime +setting.savecreate.name = Auto-Creează Salvări +setting.publichost.name = Vizibilitatea Jocurilor Publice +setting.playerlimit.name = Limita Jucătorilor +setting.chatopacity.name = Opacitate Chat +setting.lasersopacity.name = Opacitate Laser Electric +setting.bridgeopacity.name = Opacitate Poduri +setting.playerchat.name = Vezi Chat Temporar +public.confirm = Vrei să îți faci jocul public?\n[accent]Oricine va putea intra în jocurile tale.\n[lightgray]Asta se poate schimba mai târziu în Setări->Joc->Vizibilitatea Jocurilor Publice. +public.beta = De reținut că versiunile beta ale jocului nu poate face servere publice. +uiscale.reset = Scara interfeței a fost schimbată.\nApasă "OK" pt a confirma această scară.\n[scarlet]Revin setările și se iese în [accent] {0}[] secunde... +uiscale.cancel = Anulare și ieșire +setting.bloom.name = Strălucire +keybind.title = Reatribuie Taste +keybinds.mobile = [scarlet]Majoritatea tastelor atribuite aici nu funcționează pe mobil. Doar mișcările direcționale de bază sunt suportate. +category.general.name = General +category.view.name = Privire +category.multiplayer.name = Multiplayer +category.blocks.name = Selectare Bloc +command.attack = Atac +command.rally = Adunare +command.retreat = Retragere +command.idle = Inactiv +placement.blockselectkeys = \n[lightgray]Taste: [{0}, +keybind.respawn.name = Regenerare +keybind.control.name = Controlează Unități +keybind.clear_building.name = Șterge Clădirea +keybind.press = Apasă o tastă... +keybind.press.axis = Apasă o axă sau o tastă... +keybind.screenshot.name = Captură Hartă +keybind.toggle_power_lines.name = Oprește/Pornește Statusul Electricelor +keybind.toggle_block_status.name = Oprește/Pornește Statusul Blocurilor +keybind.move_x.name = Mergi pe X +keybind.move_y.name = Mergi pe Y +keybind.mouse_move.name = Urmărește Mouseul +keybind.pan.name = Mișcă Harta +keybind.boost.name = Boost +keybind.schematic_select.name = Selectează Regiunea +keybind.schematic_menu.name = Meniu Scheme +keybind.schematic_flip_x.name = Întoarce Schema X +keybind.schematic_flip_y.name = Întoarce Schema Y +keybind.category_prev.name = Categoria precedentă +keybind.category_next.name = Categoria următoare +keybind.block_select_left.name = Selectează Bloc Stânga +keybind.block_select_right.name = Selectează Bloc Dreapta +keybind.block_select_up.name = Selectează Bloc Sus +keybind.block_select_down.name = Selectează Bloc Jos +keybind.block_select_01.name = Categorie 1 +keybind.block_select_02.name = Categorie 2 +keybind.block_select_03.name = Categorie 3 +keybind.block_select_04.name = Categorie 4 +keybind.block_select_05.name = Categorie 5 +keybind.block_select_06.name = Categorie 6 +keybind.block_select_07.name = Categorie 7 +keybind.block_select_08.name = Categorie 8 +keybind.block_select_09.name = Categorie 9 +keybind.block_select_10.name = Categorie 10 +keybind.fullscreen.name = Ecran Complet +keybind.select.name = Selectează/Trage +keybind.diagonal_placement.name = Plasare Diagonală +keybind.pick.name = Ia Bloc +keybind.break_block.name = Distruge Bloc +keybind.deselect.name = Deselectează +keybind.pickupCargo.name = Ridică Încărcătura +keybind.dropCargo.name = Aruncă Încărcătura +keybind.command.name = Comandă Unitățile +keybind.shoot.name = Trage +keybind.zoom.name = Zoom +keybind.menu.name = Meniu +keybind.pause.name = Pauză +keybind.pause_building.name = Pauză/Reia Construit +keybind.minimap.name = Minihartă +keybind.chat.name = Chat +keybind.player_list.name = Listă Jucători +keybind.console.name = Consolă +keybind.rotate.name = Rotește +keybind.rotateplaced.name = Rotește Existent (Ține) +keybind.toggle_menus.name = Pornește/Oprește Meniuri +keybind.chat_history_prev.name = Previzualizare Istoric Chat +keybind.chat_history_next.name = Chat History Next +keybind.chat_scroll.name = Scroll Chat +keybind.drop_unit.name = Lasă Unitatea +keybind.zoom_minimap.name = Zoom Minihartă +mode.help.title = Descrierea modurilor +mode.survival.name = Supraviețuire +mode.survival.description = Modul normal. Resurse limitate și valuri automate.\n[gray]E nevoie de locuri de lansare a inamicilor pt a juca. +mode.sandbox.name = Sandbox +mode.sandbox.description = Resurse infinite și fără ceas pt valuri. +mode.editor.name = Editor +mode.pvp.name = PvP +mode.pvp.description = Luptă împotriva altor jucători local.\n[gray]E nevoie de 2 nuclee colorate diferit pe hartă pt a juca. +mode.attack.name = Atac +mode.attack.description = Distruge baza inamicului. \n[gray]E nevoie de un nucleu roșu pe hartă pt a juca. +mode.custom = Reguli Personalizate + +rules.infiniteresources = Resurse Infinite +rules.reactorexplosions = Explozia Reactoarelor +rules.wavetimer = Valuri pe Timp +rules.waves = Valuri +rules.attack = Modul Atac +rules.buildai = AI-ul Construiește +rules.enemyCheat = Resurse infinite pt AI (echipa roșie) +rules.blockhealthmultiplier = Multiplicatorul Vieții Blocurilor +rules.blockdamagemultiplier = Multiplicatorul Deteriorării Blocurilor +rules.unitbuildspeedmultiplier = Multiplicatorul Vitezei de Producere a Unităților +rules.unithealthmultiplier = Multiplicatorul Vieții Unităților +rules.unitdamagemultiplier = Multiplicatorul Deteriorării Unităților +rules.enemycorebuildradius = Interzisă Construirea în Jurul Nucleului Inamic:[lightgray] (pătrate) +rules.wavespacing = Spațiul Dintre Valuri:[lightgray] (sec) +rules.buildcostmultiplier = Multiplicatorul Costului Construcției +rules.buildspeedmultiplier = Multiplicatorul Vitezei de Construcție +rules.deconstructrefundmultiplier = Multiplicatorul Recompensei la Deconstrucție +rules.waitForWaveToEnd = Valurile Așteaptă Inamicii +rules.dropzoneradius = Raza Zonei de Lansare:[lightgray] (pătrate) +rules.unitammo = Unitățile Necesită Muniție +rules.title.waves = Valuri +rules.title.resourcesbuilding = Resurse și Construit +rules.title.enemy = Inamici +rules.title.unit = Unități +rules.title.experimental = Experimental +rules.title.environment = Mediu +rules.lighting = Luminozitate +rules.fire = Foc +rules.explosions = Explozia Deteriorează Blocul/Unitatea +rules.ambientlight = Ambient +rules.weather = Vreme +rules.weather.frequency = Frevență: +rules.weather.duration = Durată: + +content.item.name = Materiale +content.liquid.name = Lichide +content.unit.name = Unități +content.block.name = Blocuri +item.copper.name = Cupru +item.lead.name = Plumb +item.coal.name = Cărbune +item.graphite.name = Grafit +item.titanium.name = Titan +item.thorium.name = Toriu +item.silicon.name = Silicon +item.plastanium.name = Plastaniu +item.phase-fabric.name = Fibră-Fază +item.surge-alloy.name = Supra Aliaj +item.spore-pod.name = Păstaie de Spori +item.sand.name = Nisip +item.blast-compound.name = Compus Explozibil +item.pyratite.name = Piratită +item.metaglass.name = Metasticlă +item.scrap.name = Fier Vechi +liquid.water.name = Apă +liquid.slag.name = Zgură +liquid.oil.name = Petrol +liquid.cryofluid.name = Criofluid + +item.explosiveness = [lightgray]Explozivitate: {0}% +item.flammability = [lightgray]Inflamabilitate: {0}% +item.radioactivity = [lightgray]Radioactivitate: {0}% + +unit.health = [lightgray]Viață: {0} +unit.speed = [lightgray]Viteză: {0} +unit.weapon = [lightgray]Armă: {0} +unit.itemcapacity = [lightgray]Capacitatea de Material: {0} +unit.minespeed = [lightgray]Viteza de Minare: {0}% +unit.minepower = [lightgray]Puterea Minării: {0} +unit.ability = [lightgray]Abilitate: {0} +unit.buildspeed = [lightgray]Viteza de Construcție: {0}% + +liquid.heatcapacity = [lightgray]Capacitatea de Căldură: {0} +liquid.viscosity = [lightgray]Vâscozitatea: {0} +liquid.temperature = [lightgray]Temperatura: {0} + +unit.dagger.name = Dagger +unit.mace.name = Mace +unit.fortress.name = Fortress +unit.nova.name = Nova +unit.pulsar.name = Pulsar +unit.quasar.name = Quasar +unit.crawler.name = Crawler +unit.atrax.name = Atrax +unit.spiroct.name = Spiroct +unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid +unit.flare.name = Flare +unit.horizon.name = Horizon +unit.zenith.name = Zenith +unit.antumbra.name = Antumbra +unit.eclipse.name = Eclipse +unit.mono.name = Mono +unit.poly.name = Poly +unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct +unit.risso.name = Risso +unit.minke.name = Minke +unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura +unit.alpha.name = Alpha +unit.beta.name = Beta +unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus + +block.resupply-point.name = Punct de Realimentare +block.parallax.name = Parallax +block.cliff.name = Deal +block.sand-boulder.name = Bolovan de Nisip +block.grass.name = Iarbă +block.slag.name = Zgură +block.salt.name = Sare +block.salt-wall.name = Perete de Sare +block.pebbles.name = Pietricele +block.tendrils.name = Cârcei +block.sand-wall.name = Perete de Nisip +block.spore-pine.name = Pom de Spori +block.spore-wall.name = Perete de Spori +block.boulder.name = Bolovan +block.snow-boulder.name = Bolovan de Zăpadă +block.snow-pine.name = Pom de Gheață +block.shale.name = Șist +block.shale-boulder.name = Piatră de Șist +block.moss.name = Mușchi +block.shrubs.name = Tufișuri +block.spore-moss.name = Mușchi de Spori +block.shale-wall.name = Perete de Șist +block.scrap-wall.name = Perete de Fier Vechi +block.scrap-wall-large.name = Perete Mare de Fier Vechi +block.scrap-wall-huge.name = Perete Uriaș de Fier Vechi +block.scrap-wall-gigantic.name = Perete Gigantic de Fier Vechi +block.thruster.name = Propulsor +block.kiln.name = Cuptor +block.graphite-press.name = Presă de Grafit +block.multi-press.name = Multi-Presă +block.constructing = {0} [lightgray](În Construcție) +block.spawn.name = Punctul de Lansare Inamic +block.core-shard.name = Nucleu: Shard +block.core-foundation.name = Nucleu: Foundation +block.core-nucleus.name = Nucleu: Core +block.deepwater.name = Apă Adâncă +block.water.name = Apă +block.tainted-water.name = Apă Tulbure +block.darksand-tainted-water.name = Apă Tulbure cu Nisip Negru +block.tar.name = Păcură +block.stone.name = Piatră +block.sand.name = Nisip +block.darksand.name = Nisip Negru +block.ice.name = Gheață +block.snow.name = Zăpadă +block.craters.name = Cratere +block.sand-water.name = Apă cu Nisip +block.darksand-water.name = Apă cu Nisip Negru +block.char.name = Turbă +block.dacite.name = Dacit +block.dacite-wall.name = Perete de Dacit +block.ice-snow.name = Gheață Înzăpezită +block.stone-wall.name = Perete de Piatră +block.ice-wall.name = Perete de Gheață +block.snow-wall.name = Perete de Zăpadă +block.dune-wall.name = Perete Dună +block.pine.name = Pom +block.dirt.name = Pământ +block.dirt-wall.name = Perete de Pământ +block.mud.name = Noroi +block.white-tree-dead.name = Pom Alb Mort +block.white-tree.name = Pom Alb +block.spore-cluster.name = Grup de Spori +block.metal-floor.name = Podea de Metal 1 +block.metal-floor-2.name = Podea de Metal 2 +block.metal-floor-3.name = Podea de Metal 3 +block.metal-floor-5.name = Podea de Metal 4 +block.metal-floor-damaged.name = Podea de Metal Deteriorată +block.dark-panel-1.name = Panou Negru 1 +block.dark-panel-2.name = Panou Negru 2 +block.dark-panel-3.name = Panou Negru 3 +block.dark-panel-4.name = Panou Negru 4 +block.dark-panel-5.name = Panou Negru 5 +block.dark-panel-6.name = Panou Negru 6 +block.dark-metal.name = Metal Negru +block.basalt.name = Bazalt +block.hotrock.name = Piatră Caldă +block.magmarock.name = Piatră cu Magmă +block.copper-wall.name = Perete de Cupru +block.copper-wall-large.name = Perete Mare de Cupru +block.titanium-wall.name = Perete de Titan +block.titanium-wall-large.name = Perete Mare de Titan +block.plastanium-wall.name = Perete de Plastaniu +block.plastanium-wall-large.name = Perete Mare de Plastaniu +block.phase-wall.name = Perete de Fază +block.phase-wall-large.name = Perete Mare de Fază +block.thorium-wall.name = Perete de Toriu +block.thorium-wall-large.name = Perete Mare de Toriu +block.door.name = Ușă +block.door-large.name = Ușă Mare +block.duo.name = Duo +block.scorch.name = Scorch +block.scatter.name = Scatter +block.hail.name = Hail +block.lancer.name = Lancer +block.conveyor.name = Bandă +block.titanium-conveyor.name = Bandă de Titan +block.plastanium-conveyor.name = Bandă de Plastaniu +block.armored-conveyor.name = Bandă Armată +block.armored-conveyor.description = Cară materialele la aceeași viteză ca benzile de titan, dar posedă o armură. Nu acceptă materiale de pe lateral decât de la alte benzi armate. +block.junction.name = Intersecție +block.router.name = Router +block.distributor.name = Distributor +block.sorter.name = Sortator +block.inverted-sorter.name = Sortator Invers +block.message.name = Mesaj +block.illuminator.name = Iluminator +block.illuminator.description = O sursă de lumină mică, compactă, configurabilă. Necesită electricitate pt a funcționa. +block.overflow-gate.name = Poartă de Revărsare +block.underflow-gate.name = Poartă de Subversare +block.silicon-smelter.name = Topitor de Silicon +block.phase-weaver.name = Țesătorie de Fază +block.pulverizer.name = Pulverizator +block.cryofluidmixer.name = Mixer de Criofluid +block.melter.name = Topitor +block.incinerator.name = Incinerator +block.spore-press.name = Presă de Spori +block.separator.name = Separator +block.coal-centrifuge.name = Centifugă de Cărbune +block.power-node.name = Nod Electric +block.power-node-large.name = Nod Electric Mare +block.surge-tower.name = Turn de Supratensiune +block.diode.name = Diodă de Baterie +block.battery.name = Baterie +block.battery-large.name = Baterie Mare +block.combustion-generator.name = Generator pe Combustie +block.steam-generator.name = Generator pe Abur +block.differential-generator.name = Generator Diferențial +block.impact-reactor.name = Reactor de Impact +block.mechanical-drill.name = Burghiu Mecanic +block.pneumatic-drill.name = Burghiu Pneumatic +block.laser-drill.name = Burghiu cu Laser +block.water-extractor.name = Extractor de Apă +block.cultivator.name = Cultivator +block.conduit.name = Conductă +block.mechanical-pump.name = Pompă Mecanică +block.item-source.name = Sursă de Material +block.item-void.name = Portal de Material +block.liquid-source.name = Sursă de Lichid +block.liquid-void.name = Portal de Lichid +block.power-void.name = Consumator de Electricitate +block.power-source.name = Electricitate Infinită +block.unloader.name = Descărcător +block.vault.name = Seif +block.wave.name = Wave +block.swarmer.name = Swarmer +block.salvo.name = Salvo +block.ripple.name = Ripple +block.phase-conveyor.name = Bandă de Fază +block.bridge-conveyor.name = Pod de Bandă +block.plastanium-compressor.name = Compresor de Plastaniu +block.pyratite-mixer.name = Mixer de Piratită +block.blast-mixer.name = Mixer de Explozibil +block.solar-panel.name = Panou Solar +block.solar-panel-large.name = Panou Solar Mare +block.oil-extractor.name = Extractor de Petrol +block.repair-point.name = Punct de Reparare +block.pulse-conduit.name = Conductă cu Puls +block.plated-conduit.name = Conductă Armată +block.phase-conduit.name = Conductă de Fază +block.liquid-router.name = Router de Lichid +block.liquid-tank.name = Rezervor de Lichid +block.liquid-junction.name = Intersecție de Lichid +block.bridge-conduit.name = Pod de Conductă +block.rotary-pump.name = Pompă Rotativă +block.thorium-reactor.name = Reactor de Toriu +block.mass-driver.name = Distributor în Masă +block.blast-drill.name = Burghiu Tornadă +block.thermal-pump.name = Pompă Termală +block.thermal-generator.name = Generator Termal +block.alloy-smelter.name = Topitorie Aliaj +block.mender.name = Reparator +block.mend-projector.name = Proiector de Reparare +block.surge-wall.name = Perete de Aliaj +block.surge-wall-large.name = Perete Mare de Aliaj +block.cyclone.name = Ciclon +block.fuse.name = Fuse +block.shock-mine.name = Mină cu Șocuri +block.overdrive-projector.name = Proiector de Suprasolicitare +block.force-projector.name = Proiector de Forță +block.arc.name = Arc +block.rtg-generator.name = Generator RTG +block.spectre.name = Specter +block.meltdown.name = Meltdown +block.container.name = Container +block.launch-pad.name = Platformă de Lansare +block.launch-pad-large.name = Platformă de Lansare Mare +block.segment.name = Segment +block.command-center.name = Centru de Comandă +block.ground-factory.name = Fabrică Unități Artilerie +block.air-factory.name = Fabrică Unități Aeriene +block.naval-factory.name = Fabrică Unități Navale +block.additive-reconstructor.name = Reconstructor Aditiv +block.multiplicative-reconstructor.name = Reconstructor Multiplicativ +block.exponential-reconstructor.name = Reconstructor Exponențial +block.tetrative-reconstructor.name = Reconstructor Tetrativ +block.payload-conveyor.name = Bandă în Masă +block.payload-router.name = Router în Masă +block.disassembler.name = Dezasamblator +block.silicon-crucible.name = Creuzet de Silicon +block.overdrive-dome.name = Dom de Suprasolicitare + +block.switch.name = Întrerupător +block.micro-processor.name = Microprocesor +block.logic-processor.name = Procesor Logic +block.hyper-processor.name = Hyperprocesor +block.logic-display.name = Monitor Logic +block.large-logic-display.name = Monitor Logic Mare +block.memory-cell.name = Celulă de Memorie + +team.blue.name = albastră +team.crux.name = roșie +team.sharded.name = portocalie +team.orange.name = portocalie +team.derelict.name = abandon +team.green.name = verde +team.purple.name = mov + +tutorial.next = [lightgray] +tutorial.intro = Bun venit în[scarlet] Tutorialul Mindustry.[]\nFolosește[accent] [[WASD][] ca să te miști.\n[accent]Cu rotița[] poți face harta mai mare sau mai mică.\nÎncepe prin[accent] a mina cupru[]. Apropie-te de el, Apoi apasă pe un minereu de cupru de lângă nucleul tău.\n\n[accent]{0}/{1} cupru +tutorial.intro.mobile = Bun venit în[scarlet] Tutorialul Mindustry.[]\nGlisează pe ecran pt a te mișca.\n[accent]Trage cu 2 degete[] pt face harta mai mare sau mai mică.\nÎncepe prin[accent] a mina cupru[]. Apropie-te de el, Apoi apasă pe un minereu de cupru de lângă nucleul tău.\n\n[accent]{0}/{1} cupru +tutorial.drill = Mineritul manual este ineficient.\n[accent]Burghiele[] pot mina automat.\nDă click pe tabul burghie din colțul din dreapta-jos.\nSelectează[accent] burghiul mecanic[]. Plasează-l pe un minereu de cupru dând click.\nPoți selecta burghiul și apăsând [accent][[2][] apoi rapid [accent][[1][], indiferent de ce tab este deschis.\n[accent]Click-dreapta[] ca să te oprești din a construi. +tutorial.drill.mobile = Mineritul manual este ineficient.\n[accent]Burghiele[] pot mina automat.\nDă click pe tabul burghie din colțul din dreapta-jos.\nSelectează[accent] burghiul mecanic[]. Plasează-l pe un minereu de cupru dând click, apoi apasă pe[accent] bifa[] de mai jos pt a-ți confirma selecția.\nApasă pe[accent] butonul X[] pt a anula plasarea. +tutorial.blockinfo = Fiecare bloc are statistici diferite. Fiecare burghiu poate mina minereuri diferite.\nPt a verifica informațiile despre un bloc,[accent] dă click pe butonul "?" care apare când blocul este selectat din meniu.[]\n\n[accent]Accesează informații despre Burghiul Mecanic.[] +tutorial.conveyor = [accent]Benzile[] se folosesc pt a transporta materiale la nucleu.\nConstruiește o bandă rulantă de la burghiu către nucleu.\n[accent]Ține apăsat pe mouse pt a desena o linie.[]\nȚine[accent] CTRL[] în timp se plasezi o line pt a o plasa diagonal.\nFolosește rotița pt a roti blocurile înainte să le plasezi.\n[accent]Plasează 2 benzi, apoi livrează un material la nucleu. +tutorial.conveyor.mobile = [accent]Benzile[] se folosesc pt a transporta materiale la nucleu.\nConstruiește o bandă rulantă de la burghiu către nucleu.\n[accent] Construiește o linie ținând degetul pe ecran câteva secunde și apoi[] trage într-o direcție.\n\n[accent]Plasează 2 benzi, apoi livrează un material la nucleu. +tutorial.turret = Odată ce un material intră în nucleu, poate fi folosit pt a construi.\nDe reținut că nu toate materialele pot fi folosite pt construit.\nMaterialele care nu sunt folosite pt construit, cum ar fi[accent] cărbunele[] sau[accent] fierul vechi[], nu pot fi puse în nucleu.\nTrebuie să construiești structuri defensive ca să te aperi de[lightgray] inamici[].\nConstruiește [accent]o armă duo[] lângă baza ta. +tutorial.drillturret = Armele Duo au nevoie de[accent] muniție de cupru[] pt a trage.\nPlasează un burghiu lângă armă.\nConstruiește o bandă către armă pt a o alimenta cu muniție de cupru.\n\n[accent]Muniție livrată: 0/1 +tutorial.pause = În timpul luptei, poți[accent] da pauză la joc.[]\nPoți planifica construcții în timpul pauzei.\n\n[accent]Apasă pe space pt a da pauză. +tutorial.pause.mobile = În timpul luptei, poți[accent] da pauză la joc.[]\nPoți planifica construcții în timpul pauzei.\n\n[accent]Apasă butonul din colțul din stânga sus pt a da pauză. +tutorial.unpause = Acum apasă space din nou pt a continua. +tutorial.unpause.mobile = Acum apasă-l din nou pt a continua. +tutorial.breaking = Uneori, blocurile trebuie distruse.\n[accent]Ține apăsat pe click dreapta[] pt a distruge toate blocurile dintr-o selecție.[]\n\n[accent]Distruge toate blocurile de fier vechi din stânga nucleului. +tutorial.breaking.mobile = Uneori, blocurile trebuie distruse.\n[accent]Selectează modul deconstrucție[], aopi dă click pe un bloc pt a-l distruge.\nDistruge o zonă ținând apăsat cu degetul pt câteva secunde[] și apoi trăgând într-o direcție.\nApasă bifa de mai jos pt a confirma distrugerea.\n\n[accent]Distruge toate blocurile de fier vechi din stânga nucleului. +tutorial.withdraw = Câteodată a lua materiale direct din blocuri este necesar.\nPt a face asta, [accent]dă click pe un bloc[] cu materiale în el, apoi [accent]dă click pe materialul[] din inventar.\nMai multe materiale pot fi luate [accent]făcând click și ținând apăsat[].\n\n[accent]Ia niște cupru din nucleu.[] +tutorial.deposit = Depozitează materiale înapoi în blocuri trăgând din nava ta către blocul de destinație.\n\n[accent]Depozitează cuprul înapoi în nucleu.[] +tutorial.waves = [lightgray]Inamicul[] se apropie.\n\nApără nucleul timp de 2 valuri.[accent] Click[] pt a trage cu arma.\nConstruiește mai multe arme și burghie. Minează mai mult cupru. +tutorial.waves.mobile = [lightgray]Inamicul[] se apropie.\n\nApără nucleul timp de 2 valuri. Nava ta va trage automat către inamici.\nConstruiește mai multe arme și burghie. Minează mai mult cupru. +tutorial.launch = Odată ce ajungi la un anumit val, poți [accent]lansa nucleul[], lăsându-ți apărările în urmă și[accent] obținând toate resursele din nucleu.[]\nResursele obținute pot fi apoi folosite pt a cerceta noi tehnologii.\n\n[accent]Apasă butonul de lansare. + +item.copper.description = Materialul structural cel mai de bază. Folosit în mod extensiv în toate tipurile de blocuri. +item.lead.description = Un material de bază. Folosit în mod extensiv în electronice și blocuri transportoare de lichid. +item.metaglass.description = Un compus de sticlă super rezistent. Folosit în mod extensiv pt distribuirea și stocarea de lichide. +item.graphite.description = Carbon mineralizat, folosit pt muniție și componente electrice. +item.sand.description = Un material des întâlnit care se folosește extensiv în topitorii, în special pt aliaje. +item.coal.description = Materie vegetală fosilizată, formată cu mult înainte de evenimentul însămânțării. Folosit extensiv ca combustibil și pt producerea de resurse. +item.titanium.description = Un metal rar și super ușor folosit extensiv pt transportul lichidelor, burghie și aeronautică. +item.thorium.description = Un metal dens, radioactiv, folosit ca suport structural și combustibil nuclear. +item.scrap.description = Rămășițe ale structurilor și unităților vechi. Conține urme ale multor metale diferite. +item.silicon.description = Un semiconductor extrem de folositor. Aplicații în energia solară, electronice complexe și muniție cu radar. +item.plastanium.description = Un material ușor, flexibil folosit în aeronautica avansată și muniție fragilă. +item.phase-fabric.description = O substanță cu greutate aproape de 0 folosită în electronica avansată și tehnologia de autoreparare. +item.surge-alloy.description = Un aliaj avansat cu proprietăți electrice unice. +item.spore-pod.description = O păstaie de spori, sintetizați din concentrațiile atmosferice pt utilizări industriale. Folosit pt a fi convertit în petrol, explozibili și combustibil. +item.blast-compound.description = Un compus instabil folosit în bombe și explozibili. Sintetizat din păstăile de spori și alte materiale volatile. Folosirea ca combustibil nu e recomandată. +item.pyratite.description = O substanță extrem de inflamabilă folosită în armele incendiare. +liquid.water.description = Cel mai util lichid. Folosit deseori pt răcirea mașinăriilor și procesarea deșeurilor. +liquid.slag.description = Diferite tipuri de metal topit amestacate laolaltă. Poate fi separat în materialele constituente, sau pulverizat înspre unitățile inamice ca armă. +liquid.oil.description = Un lichid folosit în producerea de materiale avansate. Poate fi convertit în cărbune pt combustibil, sau pulverizat și ars ca armă. +liquid.cryofluid.description = Un lichid inert, non coroziv creat din apă și titan. Are o capacitate de absorbție a căldurii mare. Folosit în mod extensiv ca răcitor. + +block.message.description = Păstrează un mesaj. Folosit pt comunicarea dintre aliați. +block.graphite-press.description = Compresează bucăți de cărbune în plăci de grafit pur. +block.multi-press.description = O versiune mai bună a presei de grafit. Folosește apă și electricitate pt a procesa cărbunele rapid și eficient. +block.silicon-smelter.description = Transformă nisipul și cărbunele pur. Produce silicon. +block.kiln.description = Toarnă nisip și plumb în compusul numit metasticlă. Necesită puțină electricitate pt pornire. +block.plastanium-compressor.description = Produce plastaniu din petrol și titan. +block.phase-weaver.description = Sintetizează fibră-fază din toriu radioactiv și nisip. Necesită electricitate pt a funcționa. +block.alloy-smelter.description = Combină titan, plumb, silicon și cupru pt a produce supra aliaj. +block.cryofluidmixer.description = Amestecă apă și pudră fină de titan în criofluid. Esențial pt folosirea în reactoarele de toriu. +block.blast-mixer.description = Zdrobește și amestecă gramezi de spori cu piratită pt a produce un compus explozibil. +block.pyratite-mixer.description = Amestecă niște cărbune, plumb și nisip în inflamabila piratită. +block.melter.description = Topește fierul vechi în zgură pt procesare ulterioară sau folosire în armele Wave. +block.separator.description = Separă zgura în componentele sale minerale. Furnizează rezultatul răcit. +block.spore-press.description = Compresează păstăi de spori sub presiuni extreme pt a sintetiza petrol. +block.pulverizer.description = Zdrobește fierul vechi în nisip fin. +block.coal-centrifuge.description = Solidifică petrolul în bucăți de cărbune. +block.incinerator.description = Vaporizează orice exces de material sau lichid primește. +block.power-void.description = Consumă toată electricitatea primită. Doar în modul sandbox. +block.power-source.description = Generează electricitate infinită. Doar în modul sandbox. +block.item-source.description = Generează materiale la infinit. Doar în modul sandbox. +block.item-void.description = Distruge orice material. Doar în modul sandbox. +block.liquid-source.description = Generează lichide la infinit. Doar în modul sandbox. +block.liquid-void.description = Distruge orice lichid. Doar în modul sandbox. +block.copper-wall.description = Un perete defensiv ieftin.\nUtil pt a proteja nucleul și armele în primele valuri. +block.copper-wall-large.description = Un perete defensiv ieftin.\nUtil pt a proteja nucleul și armele în primele valuri.\nSe întinde pe mai multe pătrate. +block.titanium-wall.description = Un perete defensiv de rezistență moderată.\nFurnizează protecție moderată împotriva inamicilor. +block.titanium-wall-large.description = Un perete defensiv de rezistență moderată.\nFurnizează protecție moderată împotriva inamicilor. \nSe întinde pe mai multe pătrate. +block.plastanium-wall.description = Un tip special de perete care absoarbe laserele electrice și blochează conectarea automată a nodurilor electrice. +block.plastanium-wall-large.description = Un tip special de perete care absoarbe laserele electrice și blochează conectarea automată a nodurilor electrice.\nSe întinde pe mai multe pătrate. +block.thorium-wall.description = Un perete defenziv puternic. \nProtecție decentă împotriva inamicilor. +block.thorium-wall-large.description = Un perete defenziv puternic. \nProtecție decentă împotriva inamicilor.\nSe întinde pe mai multe pătrate. +block.phase-wall.description = Un perete învelit într-un material reflexiv special bazat pe fibra-fază. Reflectă majoritatea gloanțelor la impact. +block.phase-wall-large.description = Un perete învelit într-un material reflexiv special bazat pe fibra-fază. Reflectă majoritatea gloanțelor la impact.\nSe întinde pe mai multe pătrate. +block.surge-wall.description = Un perete defensiv extrem de durabil.\nStrânge electricitate statică la contactul cu gloanțele, lansând-o la întâmplare. +block.surge-wall-large.description = Un perete defensiv extrem de durabil.\nStrânge electricitate statică la contactul cu gloanțele, lansând-o la întâmplare.\nSe întinde pe mai multe pătrate. +block.door.description = O ușă mică. Poate fi deschisă sau închisă dând click. +block.door-large.description = O ușă mare. Poate fi deschisă sau închisă dând click.\nSe întinde pe mai multe pătrate. +block.mender.description = Repară periodic blocurile din vecinătate. Menține apărările în stare bună între valuri.\nPoate folosi silicon pt un boost al razei de acțiune și al eficienței. +block.mend-projector.description = O versiune mai bună a reparatorului. Repară periodic blocurile din vecinătate. \nPoate folosi fibră-fază pt un boost al razei de acțiune și al eficienței. +block.overdrive-projector.description = Grăbește blocurile din apropiere.\nPoate folosi fibră-fază pt un boost al razei de acțiune și al eficienței. +block.force-projector.description = Creează un câmp de forță hexagonal în jurul său, protejând blocurile și unitățile din interior de deteriorare.\nSe supraîncălzește dacă este prea deteriorat. Poate folosi răcitor pt a preveni supraîncălzirea pt a preveni supraîncălzirea. Fibra-fază poate fi folosită pt a crește mărimea scutului. +block.shock-mine.description = Rănește inamicii care calcă pe ea. Aproape invizibilă pt inamic. +block.conveyor.description = Bloc de transport al materialelor. Împinge materialele în față și le depozitează automat în blocuri. Poate fi rotită. +block.titanium-conveyor.description = Bloc avansat de transport al materialelor. Împinge materialele mai rapid decât blocurile standard. +block.plastanium-conveyor.description = Împingee grămezi de materiale.\nAcceptă materiale din spate, și le descarcă în 3 direcții în față.\nNecesită mai multe puncte de încărcare și descărcare pt a transporta nr maxim de materiale/secundă. +block.junction.description = Acționează ca un pod pt două benzi care se intersectează. Util în situații în care se intersectează 2 benzi cărând diverse materiale în diferite locații. +block.bridge-conveyor.description = Bloc avansat de transport al materialelor. Permite transportul materialelor peste orice teren sau clădire, până la 3 pătrate distanță. +block.phase-conveyor.description = Bloc avansat de transport al materialelor. Folosește electricitate pt a teleporta materialele la o altă bandă de fază peste mai multe pătrate. +block.sorter.description = Sortează materialele. Dacă un material se potrivește selecției, este lăsat să treacă. Altfel, materialul este transportat la stânga sau la dreapta. +block.inverted-sorter.description = Procesează materialele ca un sortator standard, dar materialele selectate sunt transportate la stânga sau la dreapta. +block.router.description = Acceptă materiale, apoi le distribuie în alte 3 direcții în mod egal. Util pt a împărți materialele de la o sursă către mai multe destinații.\n\n[scarlet]Nu folosi niciodată pt a introduce materiale în blocuri, căci vor fi blocate de produșii blocurilor.[] +block.distributor.description = Un router avansat. Împarte materialele în alte 7 direcții în mod egal. +block.overflow-gate.description = Transportă materialele doar la stânga și dreapta dacă drumul din față este blocat. +block.underflow-gate.description = Opusul porții de revărsare. Transportă materialele în față dacă benzile din stânga și dreapta sunt blocate. +block.mass-driver.description = Cel mai bun bloc de transport al materialelor. Adună mai multe materiale și apoi le lansează până la un alt distributor în masă pe o rază mare. Necesită electricitate pt a opera. +block.mechanical-pump.description = O pompă ieftină care pompează puțin, dar nu consumă electricitate. +block.rotary-pump.description = O pompă avansată. Pompează mai mult lichid dar consumă electricitate. +block.thermal-pump.description = Cea mai bună pompă. +block.conduit.description = Un bloc de transport al lichidelor. Împinge lichidele în față. Folosit cu pompe și alte conducte. +block.pulse-conduit.description = Un bloc avansat de transport al lichidelor. Transportă lichidele mai rapid și stochează mai mult decât conductele standard. +block.plated-conduit.description = Transportă lichidele lafel de rapid precum conductele cu puls, dar este mai rezistent. Nu acceptă fluide din lateral de la altceva în afară de conducte.\nCurge mai puțin. +block.liquid-router.description = Acceptă lichide dintr-o direcție și le distribuie în alte 3 direcții în mod egal. Poate stoca o anumită cantitate de lichid. Folositor pt a distribui lichidele dintr-o sursă către mai multe destinații. +block.liquid-tank.description = Stochează o mare cantitate de lichid. Util pt depozita lichide pt situațiile în care cererea de materiale nu e constantă sau ca extra securitate pt răcirea blocurilor vitale. +block.liquid-junction.description = Acționează ca un pod pt două conducte care se intersectează. Util în situația în care se intersectează 2 conducte diferite ce cară divesre lichide către diverse locații. +block.bridge-conduit.description = Un bloc avansat de transport al lichidelor. Permite transportul lichidelor peste orice tip teren sau bloc, până la 3 pătrate distanță. +block.phase-conduit.description = Un bloc avansat de transport al lichidelor. Folosește electricitate pt a teleporta lichidele către o altă conductă de fază la o mare distanță. +block.power-node.description = Transmite electricitate către nodurile conectate. Nodul primește electricitate din sau oferă electricitate oricăror blocuri adiacente. +block.power-node-large.description = Un nod electric avansat cu o rază mare. +block.surge-tower.description = Un nod electric cu o rază extrem de mare dar cu mai puține conexiuni disponibile. +block.diode.description = Energia din baterii poate trece prin acest bloc doar într-o direcție, dar doar dacă o parte are mai puțină energie stocată. +block.battery.description = Stochează electricitatea pt rezerve atunci când există un surplus în rețea. Oferă electricitate atunci când există un deficit. +block.battery-large.description = Stochează mai multă electricitate decât bateria standard. +block.combustion-generator.description = Generează electricitate arzând materiale inflamabile, precum cărbunele. +block.thermal-generator.description = Generează electricitate atunci când este plasat în locuri calde. +block.steam-generator.description = Un generator de combustie avansat. Mai eficient, dar necesită apă pt a genera abur. +block.differential-generator.description = Generează mari cantități de electricitate. Utilizează diferența de temperatură dintre criofluid și piratită arzând. +block.rtg-generator.description = Un generator simplu pe care te poți baza. Folosește căldura materialelor radioactive care se dezintegrează pt a produce încet electricitate. +block.solar-panel.description = Oferă o cantitate mică de energie solară. +block.solar-panel-large.description = O versiune cu mult mai eficientă a panoului solar standard. +block.thorium-reactor.description = Generează mari cantități de electricitate din toriu. Necesită răcire constantă. Explodează violent dacă i se oferă cantități insuficiente de răcitor. Electricitatea produsă depinde de cât de plin e, cu electricitatea de bază produsă la capacitate maximă. +block.impact-reactor.description = Un generator avansat, capabil să creeze cantități masive de electricitate la eficiență maximă. Are nevoie de o cantitate de electricitate pt a începe procesul. +block.mechanical-drill.description = Un burghiu ieftin. Odată plasat pe blocurile corezpunzătoare, minează încet materiale. Capabil să mineze materiale de bază. +block.pneumatic-drill.description = Un burghiu îmbunătățit, capabil să mineze titan. Minează mai rapid decât burghiul mecanic. +block.laser-drill.description = Poate mina mai rapid prin tehnologia bazată pe laser, dar necesită electricitate. Poate mina toriu. +block.blast-drill.description = Cel mai bun burghiu. Necesită cantități mari de electricitate. +block.water-extractor.description = Extrage apă din pământ. Folosit în locații unde apa de suprafață nu este disponibilă. +block.cultivator.description = Cultivă mici concentrații de spori din atmosferă în păstăi pregătite pt procesare industrială. +block.oil-extractor.description = Folosește mari cantități de electricitate, nisip și apă pt a extrage petrol. +block.core-shard.description = Prima versiune a capsulei nucleice. Odată distrusă, orice contact cu regiunea se pierde. Nu lăsa asta să se întâmple. +block.core-foundation.description = A doua versiune a nucleului. Mai bine armată. Stochează mai multe resurse. +block.core-nucleus.description = A treia și ultima versiune a capsulei nucleice. Extrem de bine armată. Stochează mari cantități de resurse. +block.vault.description = Stochează o mare cantitate de materiale de orice tip. Un bloc descărcător poate fi folosit pt a lua obiecte din seif. +block.container.description = Stochează o mică cantitate de materiale de orice tip. Un bloc descărcător poate fi folosit pt a lua obiecte din container. +block.unloader.description = Descarcă materialele din orice bloc din apropiere, mai puțin cele de transport. Tipul materialului de descărcat poate fi schimbat. Click pe descărcător. +block.launch-pad.description = Lansează grămezi de materiale fără a fi nevoie să lansezi nucleul. +block.launch-pad-large.description = O versiune mai bună a platformei de lansare. Stochează mai multe materiale. Lansează mai frecvent. +block.duo.description = O armă mică, ieftină. Util împotriva unităților de artilerie. +block.scatter.description = O armă esențială anti aeronave. Aruncă bucățele de plumb, fier vechi sau metasticlă către inamici. +block.scorch.description = Arde orice artilerie inamică din apropiere. Mai eficient la distanță mică. +block.hail.description = O armă anti-artilerie mică, care trage la mari distanțe. +block.wave.description = O armă medie. Trage cu lichid către inamici. Stinge focul automat când este alimentată cu apă. +block.lancer.description = O armă anti-artilerie medie, cu laser. Se încarcă și trage cu lasere puternice de electricitate. +block.arc.description = O armă electrică cu o rază de acțiune mică. Trage cu mici lasere de electricitate către inamici. +block.swarmer.description = O armă medie cu rachete. Atacă atât artileria cât și navele inamice. Trage cu rachete cu radar. +block.salvo.description = O versiune mai mare, mai avansată a armei Duo. Trage salve rapide de gloanțe către inamici. +block.fuse.description = O armă șrapnel mare cu rază de acțiune mică. Trage trei raze de gloanțe care găuresc scuturile inamicilor din apropiere. +block.ripple.description = O armă de artilerie extrem de puternică. Lovește grămezi de bucăți de material înspre inamici pe distanțe mari. +block.cyclone.description = O mare armă anti-artilerie și anti-aer. Trage cu grămezi explozive de material către ddunitățile inamice. +block.spectre.description = O armă masivă cu două țevi. Trage cu gloanțe mari care găuresc armurile țintelor aeriene și artileriei. +block.meltdown.description = O armă cu laser masivă. Trage cu un laser continuu la inamicii din apropiere. Necesită răcitor pt a opera. +block.repair-point.description = Repară încontinuu cea mai deteriorată unitate din vecinătate. +block.segment.description = Deteriorează și distruge proiectilele din apropiere. Laserele nu sunt afectate. diff --git a/core/assets/bundles/bundle_ru.properties b/core/assets/bundles/bundle_ru.properties index 2fb9106b6d..79979b5c18 100644 --- a/core/assets/bundles/bundle_ru.properties +++ b/core/assets/bundles/bundle_ru.properties @@ -1,4 +1,4 @@ -credits.text = Создатель [royal]Anuken[] — [sky]anukendev@gmail.com[]\n\nЕсть недоработки в переводе или хотите найти союзников для совместной игры?\nПишите в оф. [accent]discord-сервер Mindustry[] в канал [accent]#русский[].\n\nРедакторы и переводчики на русский язык:\n[blue]Prosta4ok_ua[green]#[yellow]6336\n[darkgray]XZ[gray]imur\n[#30FF30]Beryllium\n[tan]Felix [slate]Corvus\n[orange]Vanguard +credits.text = Создатель [royal]Anuken[] — [sky]anukendev@gmail.com[]\n\nЕсть недоработки в переводе или хотите найти союзников для совместной игры?\nПишите в оф. [accent]discord-сервер Mindustry[] в канал [accent]#русский[].\n\nРедакторы и переводчики на русский язык:\n[blue]Prosta4ok_ua[green]#[yellow]6336\n[darkgray]XZimur[]\n[#30FF30]Beryllium\n[tan]Félix [slate]Córvus\n[orange]Vanguard\n[#a00000]The [red]Slaylord[][] credits = Авторы contributors = Переводчики и помощники discord = Присоединяйтесь к нашему Discord! @@ -20,6 +20,8 @@ gameover = Игра окончена gameover.pvp = [accent]{0}[] команда победила! highscore = [accent]Новый рекорд! copied = Скопировано. +indev.popup = [accent]v6[] находится на стадии [accent]alpha[].\n[lightgray]Это означает следующее:[]\n[scarlet]- Кампания не завершена[]\n- Отсутствие контента\n- Большинство [scarlet]ИИ единиц[] не работает правильно\n- Множество единиц не готово\n- Всё, что вы видите, может быть изменено или удалено.\n\nСообщайте о багах и вылетах на [accent]GitHub[]. +indev.notready = Эта часть игры ещё не готова load.sound = Звуки load.map = Карты @@ -53,6 +55,7 @@ schematic.saved = Схема сохранена. schematic.delete.confirm = Эта схема будет поджарена Испепелителем. schematic.rename = Переименовать схему schematic.info = {0}x{1}, {2} блоков +schematic.disabled = [scarlet]Схемы отключены[]\nНа этой [accent]карте[] или [accent]сервере запрещено использование схем. stat.wave = Волн отражено:[accent] {0} stat.enemiesDestroyed = Врагов уничтожено:[accent] {0} @@ -113,6 +116,7 @@ mod.disable = Выкл. mod.content = Содержимое: mod.delete.error = Невозможно удалить модификацию. Возможно, файл используется. mod.requiresversion = [scarlet]Требуемая минимальная версия игры: [accent]{0} +mod.outdated = [scarlet]Не совместим с V6 (нет "minGameVersion: 105") mod.missingdependencies = [scarlet]Не найдены родительские модификации: {0} mod.erroredcontent = [scarlet]Ошибки содержимого mod.errors = Ошибки были вызваны загружаемым содержимым. @@ -125,9 +129,9 @@ mod.import = Импортировать модификацию mod.import.file = Импортировать файл mod.import.github = Импортировать мод с GitHub mod.jarwarn = [scarlet]JAR-модификации по сути не безопасны.[]\nУбедитесь, что вы импортируете этот мод из надежного источника! -mod.item.remove = Этот предмет является частью модификации [accent]«{0}»[]. Чтобы удалить его, удалите саму модификацию. +mod.item.remove = Этот предмет является частью модификации [accent]«{0}[accent]»[white]. Чтобы удалить его, удалите саму модификацию. mod.remove.confirm = Эта модификация будет удалена. -mod.author = [lightgray]Автор:[] {0} +mod.author = [lightgray]Автор(ы):[] {0} mod.missing = В этом сохранении есть следы модификации, которая отсутствует или установлена её обновлённая версия. Может произойти повреждение сохранения. Вы уверены, что хотите загрузить его?\n[lightgray]Модификации:\n{0} mod.preview.missing = Перед публикацией этой модификации в Мастерской, вы должны добавить изображение предпросмотра.\nРазместите изображение с именем[accent] preview.png[] в папке модификации и попробуйте снова. mod.folder.missing = Модификации могут быть опубликованы в Мастерской только в виде папки.\nЧтобы конвертировать любой мод в папку, просто извлеките его из архива и удалите старый архив .zip, затем перезапустите игру или перезагрузите модификации. @@ -136,6 +140,8 @@ mod.scripts.disable = Ваше устройство не поддерживае about.button = Об игре name = Имя: noname = Для начала, придумайте[accent] себе имя[]. +planetmap = Карта планеты +launchcore = Запуск ядра filename = Имя файла: unlocked = Новый контент разблокирован! completed = [accent]Завершено @@ -170,7 +176,7 @@ host.info = Кнопка [accent]Открыть сервер[] запускае join.info = Здесь вы можете ввести [accent]IP-адрес сервера[], найти доступные [accent]локальные[] и [accent]глобальные[] серверы для подключения.\nПоддерживаются оба многопользовательских режима: LAN и WAN.\n\n[lightgray]Если вы хотите подключиться к кому-то по IP-адресу, Вам нужно будет попросить IP-адрес у самого хоста. Хост может узнать IP-адрес своего устройства через Google запрос [accent]"my ip"[]. hostserver = Запустить многопользовательский сервер invitefriends = Пригласить друзей -hostserver.mobile = Запустить\nсервер +hostserver.mobile = Запустить сервер host = Открыть сервер hosting = [accent]Открытие сервера… hosts.refresh = Обновить @@ -484,6 +490,7 @@ loadout = Груз resources = Ресурсы bannedblocks = Запрещённые блоки addall = Добавить всё +launch.destination = Место назначения: {0} configure.invalid = Количество должно быть числом между 0 и {0}. zone.unlocked = Зона «[lightgray]{0}» теперь разблокирована. zone.requirement.complete = Условия для зоны «{0}» выполнены:[lightgray]\n{1} @@ -505,7 +512,21 @@ error.io = Сетевая ошибка ввода-вывода. error.any = Неизвестная сетевая ошибка. error.bloom = Не удалось инициализировать свечение (Bloom).\nВозможно, ваше устройство не поддерживает его. +weather.rain.name = Дождь +weather.snow.name = Снегопад +weather.sandstorm.name = Пыльная буря +weather.sporestorm.name = Споровая буря +sectors.unexplored = [lightgray]Не исследовано +sectors.resources = Ресурсы: +sectors.production = Производит: +sectors.stored = Накоплено: +sectors.resume = Продолжить +sectors.launch = Высадка +sectors.select = Выбор +sectors.nonelaunch = [lightgray]нет (солнце) + +#NOTE TO TRANSLATORS: don't bother editing these, they'll be removed and/or rewritten anyway sector.groundZero.name = Отправная точка sector.craters.name = Кратеры sector.frozenForest.name = Ледяной лес @@ -573,12 +594,16 @@ blocks.itemsmoved = Скорость перемещения blocks.launchtime = Интервал запусков blocks.shootrange = Радиус действия blocks.size = Размер +blocks.displaysize = Размер дисплея blocks.liquidcapacity = Вместимость жидкости blocks.powerrange = Дальность передачи энергии +blocks.linkrange = Дальность связи +blocks.instructions = Инструкции blocks.powerconnections = Количество соединений blocks.poweruse = Потребляет энергии blocks.powerdamage = Энергия/урон blocks.itemcapacity = Вместимость предметов +blocks.memorycapacity = Размер памяти blocks.basepowergeneration = Базовая генерация энергии blocks.productiontime = Время производства blocks.repairtime = Время полной регенерации @@ -590,11 +615,14 @@ blocks.boosteffect = Ускоряющий эффект blocks.maxunits = Максимальное количество активных единиц blocks.health = Прочность blocks.buildtime = Время строительства +blocks.maxconsecutive = Макс. последовательность blocks.buildcost = Стоимость строительства blocks.inaccuracy = Разброс blocks.shots = Выстрелы blocks.reload = Выстрелы/секунду blocks.ammo = Боеприпасы +blocks.shieldhealth = Прочность щита +blocks.cooldowntime = Время восстановления bar.drilltierreq = Требуется бур получше bar.noresources = Недостаточно ресурсов @@ -637,9 +665,12 @@ unit.liquidunits = жидкостных единиц unit.powerunits = энерг. единиц unit.degrees = град. unit.seconds = сек. +unit.minutes = мин. unit.persecond = /сек +unit.perminute = /мин unit.timesspeed = x скорость unit.percent = % +unit.shieldhealth = прочность щита unit.items = предметов unit.thousands = к unit.millions = М @@ -726,6 +757,7 @@ category.blocks.name = Выбор блока command.attack = Атаковать command.rally = Точка сбора command.retreat = Отступить +command.idle = Ждать placement.blockselectkeys = \n[lightgray]Клавиша: [{0}, keybind.respawn.name = Возрождение в ядре keybind.control.name = Перехватить контроль над единицей @@ -738,6 +770,7 @@ keybind.toggle_block_status.name = Отображение статусов бл keybind.move_x.name = Движение по оси X keybind.move_y.name = Движение по оси Y keybind.mouse_move.name = Следовать за курсором +keybind.pan.name = Панорамирование камеры keybind.boost.name = Полёт/Ускорение keybind.schematic_select.name = Выбрать область keybind.schematic_menu.name = Меню схем @@ -765,6 +798,9 @@ keybind.diagonal_placement.name = Диагональное размещение keybind.pick.name = Выбрать блок keybind.break_block.name = Разрушить блок keybind.deselect.name = Снять выделение +keybind.pickupCargo.name = Взять груз +keybind.dropCargo.name = Сбросить груз +keybind.command.name = Командовать группой keybind.shoot.name = Выстрел keybind.zoom.name = Масштабирование keybind.menu.name = Меню @@ -796,9 +832,11 @@ mode.custom = Пользовательские правила rules.infiniteresources = Бесконечные ресурсы (Игрок) rules.reactorexplosions = Взрывы реакторов +rules.schematic = Схемы разрешены rules.wavetimer = Интервал волн rules.waves = Волны rules.attack = Режим атаки +rules.buildai = Строительство ИИ rules.enemyCheat = Бесконечные ресурсы ИИ (красная команда) rules.blockhealthmultiplier = Множитель здоровья блоков rules.blockdamagemultiplier = Множитель урона блоков @@ -820,8 +858,12 @@ rules.title.unit = Боевые единицы rules.title.experimental = Экспериментально rules.title.environment = Окружение rules.lighting = Освещение +rules.fire = Огонь +rules.explosions = Урон от взрывов блоков/единиц rules.ambientlight = Окружающий свет -rules.solarpowermultiplier = Множитель солнечной энергии +rules.weather = Погода +rules.weather.frequency = Периодичность: +rules.weather.duration = Длительность: content.item.name = Предметы content.liquid.name = Жидкости @@ -847,9 +889,11 @@ liquid.water.name = Вода liquid.slag.name = Шлак liquid.oil.name = Нефть liquid.cryofluid.name = Криогенная жидкость + item.explosiveness = [lightgray]Взрывоопасность: {0}% item.flammability = [lightgray]Воспламеняемость: {0}% item.radioactivity = [lightgray]Радиоактивность: {0}% + unit.health = [lightgray]Целостность: {0} unit.speed = [lightgray]Скорость: {0} unit.weapon = [lightgray]Оружие: {0} @@ -869,10 +913,11 @@ unit.fortress.name = Крепость unit.nova.name = Нова unit.pulsar.name = Пульсар unit.quasar.name = Квазар -unit.crawler.name = Обходчик +unit.crawler.name = Ползун unit.atrax.name = Атракс unit.spiroct.name = Спайрокт unit.arkyid.name = Аркид +unit.toxopid.name = Токсопид unit.flare.name = Вспышка unit.horizon.name = Горизонт unit.zenith.name = Зенит @@ -881,34 +926,43 @@ unit.eclipse.name = Затмение unit.mono.name = Моно unit.poly.name = Поли unit.mega.name = Мега +unit.quad.name = Квад +unit.oct.name = Окт unit.risso.name = Риссо unit.minke.name = Минке unit.bryde.name = Брайд +unit.sei.name = Сейвал +unit.omura.name = Омура unit.alpha.name = Альфа unit.beta.name = Бета unit.gamma.name = Гамма +unit.scepter.name = Скипетр +unit.reign.name = Власть +# unit.vela.name = Vela +unit.corvus.name = Ворон +block.resupply-point.name = Пункт снабжения block.parallax.name = Параллакс block.cliff.name = Скала block.sand-boulder.name = Песчаный валун block.grass.name = Трава block.slag.name = Шлак block.salt.name = Соль -block.saltrocks.name = Соляные камни +block.salt-wall.name = Соляная стена block.pebbles.name = Галька block.tendrils.name = Споровые усики -block.sandrocks.name = Песчаные камни +block.sand-wall.name = Песчаная стена block.spore-pine.name = Споровая сосна -block.sporerocks.name = Споровые камни -block.rock.name = Каменный валун -block.snowrock.name = Заснеженный валун +block.spore-wall.name = Споровая стена +block.boulder.name = Каменный валун +block.snow-boulder.name = Заснеженный валун block.snow-pine.name = Заснеженная сосна block.shale.name = Сланец block.shale-boulder.name = Сланцевый валун block.moss.name = Мох block.shrubs.name = Кусты block.spore-moss.name = Споровый мох -block.shalerocks.name = Сланцевые камни +block.shale-wall.name = Сланцевая стена block.scrap-wall.name = Стена из металлолома block.scrap-wall-large.name = Большая стена из металлолома block.scrap-wall-huge.name = Огромная стена из металлолома @@ -936,13 +990,17 @@ block.craters.name = Кратеры block.sand-water.name = Песок с водой block.darksand-water.name = Тёмный песок с водой block.char.name = Выжженная земля -block.holostone.name = Голографический камень +block.dacite.name = Дацит +block.dacite-wall.name = Дацитовая стена block.ice-snow.name = Заснеженный лёд -block.rocks.name = Камни -block.icerocks.name = Ледяные камни -block.snowrocks.name = Снежные камни -block.dunerocks.name = Тёмные песчаные камни +block.stone-wall.name = Каменная стена +block.ice-wall.name = Ледяная стена +block.snow-wall.name = Снежная стена +block.dune-wall.name = Тёмная песчаная стена block.pine.name = Сосна +block.dirt.name = Земля +block.dirt-wall.name = Земляная стена +block.mud.name = Грязь block.white-tree-dead.name = Мёртвое белое дерево block.white-tree.name = Белое дерево block.spore-cluster.name = Скопление спор @@ -958,10 +1016,9 @@ block.dark-panel-4.name = Тёмная панель 4 block.dark-panel-5.name = Тёмная панель 5 block.dark-panel-6.name = Тёмная панель 6 block.dark-metal.name = Тёмный металл -block.ignarock.name = Обожжённый камень +block.basalt.name = Базальт block.hotrock.name = Горячий камень block.magmarock.name = Магмовый камень -block.cliffs.name = Скалы block.copper-wall.name = Медная стена block.copper-wall-large.name = Большая медная стена block.titanium-wall.name = Титановая стена @@ -1010,7 +1067,7 @@ block.diode.name = Диод block.battery.name = Аккумулятор block.battery-large.name = Большой аккумулятор block.combustion-generator.name = Генератор внутреннего сгорания -block.turbine-generator.name = Паровой генератор +block.steam-generator.name = Паровой генератор block.differential-generator.name = Дифференциальный генератор block.impact-reactor.name = Импульсный реактор block.mechanical-drill.name = Механический бур @@ -1072,6 +1129,7 @@ block.container.name = Контейнер block.launch-pad.name = Пусковая площадка block.launch-pad-large.name = Большая пусковая площадка block.segment.name = Сегмент +block.command-center.name = Командный центр block.ground-factory.name = Наземная фабрика block.air-factory.name = Воздушная фабрика block.naval-factory.name = Морская фабрика @@ -1088,8 +1146,11 @@ block.overdrive-dome.name = Сверхприводный купол block.switch.name = Переключатель block.micro-processor.name = Микропроцессор block.logic-processor.name = Логический процессор +block.hyper-processor.name = Гипер процессор block.logic-display.name = Логический дисплей -block.memory-cell.name = Запоминающее устройство +block.large-logic-display.name = Большой логический дисплей +block.memory-cell.name = Ячейка памяти +block.memory-bank.name = Блок памяти team.blue.name = Синяя team.crux.name = Красная @@ -1216,7 +1277,7 @@ block.battery.description = Накапливает энергию как буф block.battery-large.description = Хранит гораздо больше энергии, чем обычный аккумулятор. block.combustion-generator.description = Вырабатывает энергию путём сжигания легковоспламеняющихся материалов, таких как уголь. block.thermal-generator.description = Генерирует энергию, когда находится в горячих местах. -block.turbine-generator.description = Усовершенствованный генератор сгорания. Более эффективен, но дополнительно требует воду для выработки пара. +block.steam-generator.description = Усовершенствованный генератор сгорания. Более эффективен, но дополнительно требует воду для выработки пара. block.differential-generator.description = Генерирует большое количество энергии. Использует разницу температур между криогенной жидкостью и горящим пиротитом. block.rtg-generator.description = Простой, надежный генератор. Использует тепло распадающихся радиоактивных соединений для производства энергии с низкой скоростью. block.solar-panel.description = Обеспечивает небольшое количество энергии от солнца. @@ -1225,10 +1286,10 @@ block.thorium-reactor.description = Генерирует значительно block.impact-reactor.description = Усовершенствованный генератор, способный создавать огромное количество энергии на пике эффективности. Требуется значительное количество энергии для запуска процесса. block.mechanical-drill.description = Дешёвый бур. При размещении на соответствующих плитках, предметы постоянно выдаются в медленном темпе. Способен добывать только базовые ресурсы. block.pneumatic-drill.description = Улучшенный бур, способный добывать титан. Добывает быстрее, чем механический бур. -block.laser-drill.description = Позволяет сверлить еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий. +block.laser-drill.description = Позволяет добывать еще быстрее с помощью лазерной технологии, но требует энергию. Способен добывать торий. block.blast-drill.description = Самый продвинутый бур. Требует большое количество энергии. block.water-extractor.description = Выкачивает подземные воды. Используется в местах, где нет поверхностных вод. -block.cultivator.description = Выращивает крошечные концентрации спор в атмосфере в готовые к использованию споры. +block.cultivator.description = Выращивает крошечные концентрации спор из атмосферы в готовые к использованию споры. block.oil-extractor.description = Использует большое количество энергии, песка и воды для бурения, добывая нефть. block.core-shard.description = Первая итерация капсулы ядра. После уничтожения, весь контакт с регионом теряется. Не позволяйте этому случиться. block.core-foundation.description = Вторая версия ядра. Лучше бронировано. Хранит больше ресурсов. diff --git a/core/assets/bundles/bundle_sv.properties b/core/assets/bundles/bundle_sv.properties index bbe0f390c6..0102844ace 100644 --- a/core/assets/bundles/bundle_sv.properties +++ b/core/assets/bundles/bundle_sv.properties @@ -20,6 +20,8 @@ gameover = Game Over gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]Nytt rekord! copied = Kopierad. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Ljud load.map = Kartor @@ -63,8 +65,7 @@ stat.delivered = Resources Launched: stat.playtime = Tid Spelat:[accent] {0} stat.rank = Slutgiltiga Rank: [accent]{0} -launcheditems = [accent]Launched Items -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +globalitems = [accent]Global Items map.delete = Är du säker på att du vill ta bort mappen "[accent]{0}[]"? level.highscore = High Score: [accent]{0} level.select = Nivåval @@ -114,6 +115,7 @@ mod.disable = Disable mod.content = Content: mod.delete.error = Unable to delete mod. File may be in use. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Om name = Namn: noname = Välj ett[accent] namn[] först. +planetmap = Planet Map +launchcore = Launch Core filename = Filnamn: unlocked = Nytt innehåll upplåst! completed = [accent]Avklarad @@ -144,6 +148,7 @@ techtree = Teknologiträd research.list = [lightgray]Forskning: research = Forskning researched = [lightgray]{0} framforskat. +research.progress = {0}% complete players = {0} spelare online players.single = {0} spelare online players.search = search @@ -340,6 +345,11 @@ waves.load = Läs från Urklipp waves.invalid = Invalid waves in clipboard. waves.copied = Vågor kopierade. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Redigera... @@ -459,7 +469,8 @@ locked = Låst complete = [lightgray]Nå: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best Wave: {0} launch = < LAUNCH > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Okänt nätverksfel. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafik settings.cleardata = Rensa Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< Pausat > clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Range blocks.size = Storlek +blocks.displaysize = Display Size blocks.liquidcapacity = Liquid Capacity blocks.powerrange = Power Range +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Power Use blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Health blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = Inaccuracy blocks.shots = Skott blocks.reload = Shots/Second blocks.ammo = Ammunition +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Bättre Borr Krävs bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = liquid units unit.powerunits = power units unit.degrees = grader unit.seconds = sekunder +unit.minutes = mins unit.persecond = /sek +unit.perminute = /min unit.timesspeed = x hastighet unit.percent = % +unit.shieldhealth = shield health unit.items = föremål unit.thousands = k unit.millions = mil +unit.billions = b category.general = Allmänt category.power = Energi category.liquids = Vätskor @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Move x keybind.move_y.name = Move y keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Deselect +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Shoot keybind.zoom.name = Zoom keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Vågtimer rules.waves = Vågor rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI (Red Team) Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Föremål content.liquid.name = Vätskor @@ -830,9 +878,11 @@ liquid.water.name = Vatten liquid.slag.name = Slag liquid.oil.name = Olja liquid.cryofluid.name = Cryofluid + item.explosiveness = [lightgray]Explosiveness: {0}% item.flammability = [lightgray]Flammability: {0}% item.radioactivity = [lightgray]Radioactivity: {0}% + unit.health = [lightgray]Health: {0} unit.speed = [lightgray]Fart: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sandbumling block.grass.name = Gräs block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Saltstenar +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sandstenar +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Sten -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Mossa block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -919,13 +979,17 @@ block.craters.name = Kratrar block.sand-water.name = Sandvatten block.darksand-water.name = Mörksandvatten block.char.name = Char -block.holostone.name = Holosten +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Issnö -block.rocks.name = Stenar -block.icerocks.name = Isstenar -block.snowrocks.name = Snöstenar -block.dunerocks.name = Dynstenar +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Tall +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Vitt Dött Träd block.white-tree.name = Vitt Träd block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Mörk Panel 4 block.dark-panel-5.name = Mörk Panel 5 block.dark-panel-6.name = Mörk Panel 6 block.dark-metal.name = Mörk Metall -block.ignarock.name = Ignasten +block.basalt.name = Basalt block.hotrock.name = Het Sten block.magmarock.name = Magmasten -block.cliffs.name = Klippor block.copper-wall.name = Kopparvägg block.copper-wall-large.name = Stor Kopparvägg block.titanium-wall.name = Titanvägg @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Batteri block.battery-large.name = Stort Batteri block.combustion-generator.name = Combustion Generator -block.turbine-generator.name = Ånggenerator +block.steam-generator.name = Ånggenerator block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mekanisk Borr @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blåa team.crux.name = röda team.sharded.name = orangea @@ -1192,7 +1265,7 @@ block.battery.description = Stores power as a buffer in times of surplus energy. block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning flammable materials, such as coal. block.thermal-generator.description = Generates power when placed in hot locations. -block.turbine-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. +block.steam-generator.description = An advanced combustion generator. More efficient, but requires additional water for generating steam. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A simple, reliable generator. Uses the heat of decaying radioactive compounds to produce energy at a slow rate. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_th.properties b/core/assets/bundles/bundle_th.properties index 8fcf97cb03..72028722d0 100644 --- a/core/assets/bundles/bundle_th.properties +++ b/core/assets/bundles/bundle_th.properties @@ -20,6 +20,8 @@ gameover = Game Over gameover.pvp = ทีมที่ชนะคือทีม[accent] {0}[]! highscore = [accent]คะแนนสูงสุดใหม่! copied = คัดลอกแล้ว. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = เสียง load.map = แมพ @@ -63,8 +65,7 @@ stat.delivered = ทรัพยากรที่ส่งไปได้: stat.playtime = Time Played:[accent] {0} stat.rank = ระดับ: [accent]{0} -launcheditems = [accent]ไอเท็มที่ส่งไปได้ -launchinfo = [unlaunched][[ส่ง] แกนกลางของคุณเพื่อที่จะรับไอเท็มที่ไฮไลท์สีน้ำเงิน +globalitems = [accent]Global Items map.delete = คุณแน่ใจหรือว่าจะลบแมพชื่อ "[accent]{0}[]"? level.highscore = คะแนนสูงสุด: [accent]{0} level.select = เลือกด่าน @@ -114,6 +115,7 @@ mod.disable = ปิดใช้งาน mod.content = Content: mod.delete.error = ไม่สามารถลบมอดได้. ไฟล์อาจอยู่ในระหว่างการใช้งาน. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]dependencies หาย: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = เกี่ยวกับ name = ชื่อ: noname = ใส่ชื่อ[accent] ผู้เล่น[] ก่อน. +planetmap = Planet Map +launchcore = Launch Core filename = ชื่อไฟล์: unlocked = content ใหม่ปลดล็อค! completed = [accent]สำเร็จ @@ -144,6 +148,7 @@ techtree = ความคืบหน้าในการวิจัย research.list = [lightgray]วิจัย: research = วิจัย researched = [lightgray]{0} วิจัยแล้ว. +research.progress = {0}% complete players = {0} ผู้เล่น players.single = {0} ผู้เล่น players.search = search @@ -340,6 +345,11 @@ waves.load = โหลดจากคลิปบอร์ด waves.invalid = waves ในคลิปบอร์ดไม่ถูกต้อง waves.copied = คัดลอก Waves แล้ว waves.none = ไม่ได้กำหนดศัตรู\nwave layouts เปล่าจะถูกแทนที่โดย layout ค่าเริ่มต้นของเกม + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]<ค่าเริ่่มต้น> details = รสยละเอียด... edit = แก้ไข... @@ -459,7 +469,8 @@ locked = ล็อค complete = [lightgray]สำเร็จ: requirement.wave = ถึง Wave ที่ {0} ใน {1} requirement.core = ทำลาย Core ของศัตรูใน {0} -requirement.unlock = ปลดล็อค {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = เล่นต่อในโซน:\n[lightgray]{0} bestwave = [lightgray]Wave สูงสุด: {0} launch = < ส่ง > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = เพิ่มทั้งหมด +launch.destination = Destination: {0} configure.invalid = จำนวนต้อยู่ระหว่าง 0 ถึง {0}. zone.unlocked = [lightgray]{0} ปลดล็อคแล้ว zone.requirement.complete = ข้อเรียกร้องสำหรับ {0} สำเร็จแล้ว:[lightgray]\n{1} @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unknown network error. error.bloom = ไม่สามารถเริ่มต้น bloom ได้\nอุปกรณ์ของคุณอาจไม่รองรับ +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = กราฟิก settings.cleardata = เคลียร์ข้อมูลเกม... settings.clear.confirm = คุณแน่ใจหรือว่าจะเคลียร์ข้อมูลเกม?\nสิ่งที่ทำไปแล้วจะไม่สามารถย้อนกลับได้! settings.clearall.confirm = [scarlet]คำเตือน![]\nการกระทำนี้จะลบข้อมูลทั้งหมด นั้นรวมไปถึงเซฟ, แมพ, สิ่งที่ปลดล็อคแล้วและ keybinds.\nเมื่อคุณกด 'โอเค' เกมจะลบข้อมูลทุกอย่างและออกโดยอัตโนมัติ +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< หยุดชั่วคราว > clear = เคลียร์ banned = [scarlet]แบน @@ -557,8 +585,11 @@ blocks.itemsmoved = ความเร็วเคลื่อนที่ blocks.launchtime = เวลาระหว่างการส่ง blocks.shootrange = ระยะยิง blocks.size = ขนาด +blocks.displaysize = Display Size blocks.liquidcapacity = จุของเหลว blocks.powerrange = ระยะพลังงาน +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = จำนวนการเชื่อมต่อสูงสุด blocks.poweruse = ใช้พลังงาน blocks.powerdamage = หน่วยพลังงาน/ดาเมจ @@ -574,11 +605,14 @@ blocks.boosteffect = แอฟเฟ็คของบูสต์ blocks.maxunits = จำนวนยูนิตสูงสุด blocks.health = เลือด blocks.buildtime = เวลาในการสร้าง +blocks.maxconsecutive = Max Consecutive blocks.buildcost = ใช้ blocks.inaccuracy = ความคลาดเคลื่อน blocks.shots = นัด blocks.reload = นัด/วินาที blocks.ammo = กระสุน +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = จำเป็นต้องใช้เครื่องขุดที่ดีกว่า bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = หน่วยของเหลว unit.powerunits = หน่วยพลังงาน unit.degrees = องศา unit.seconds = วินาที +unit.minutes = mins unit.persecond = /วินาที +unit.perminute = /min unit.timesspeed = เท่าเร็วขึ้น unit.percent = % +unit.shieldhealth = shield health unit.items = ไอเท็ม unit.thousands = k unit.millions = mil +unit.billions = b category.general = ทั่วไป category.power = พลังงาน category.liquids = ของเหลว @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = โจมตี command.rally = ชุมนุม command.retreat = ถอยกลับ +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = เคลื่อนที่ในแกน x keybind.move_y.name = เคลี่อนที่ในแกน y keybind.mouse_move.name = ตามเม้าส์ +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = เลือกภูมิภาค keybind.schematic_menu.name = เมนู Schematic @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = วางเป็นแนวทแยง keybind.pick.name = เลือกบล็อค keybind.break_block.name = ทุบบล็อค keybind.deselect.name = ยกเลิกการเบือก +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = ยิง keybind.zoom.name = ซูม keybind.menu.name = เมนู @@ -782,6 +825,7 @@ rules.reactorexplosions = การระเบิดของ rules.wavetimer = ตัวนับเวลาปล่อยคลื่น(รอบ) rules.waves = คลื่น(รอบ) rules.attack = โหมดการโจมตี +rules.buildai = AI Building rules.enemyCheat = AI (ทีมสีแดง) มีทรัพยากรไม่จำกัด rules.blockhealthmultiplier = พหุคูณเลือดของบล็อค rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = ยูนิต rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = ไอเท็ม content.liquid.name = ของเหลว @@ -830,9 +878,11 @@ liquid.water.name = น้ำ liquid.slag.name = เศษแร่ liquid.oil.name = น้ำมัน liquid.cryofluid.name = โครโรฟิวล์ + item.explosiveness = [lightgray]ค่าการระเบิด: {0}% item.flammability = [lightgray]ความไวต่อไฟ: {0}% item.radioactivity = [lightgray]ค่ากัมมันตภาพรังสี: {0}% + unit.health = [lightgray]เลือด: {0} unit.speed = [lightgray]ความเร็ว: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = ครอว์เลอร์ unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = ก้อนหินทราย block.grass.name = หญ้า block.slag.name = Slag block.salt.name = เกลือ -block.saltrocks.name = หินเกลือ +block.salt-wall.name = Salt Wall block.pebbles.name = ก้อนกรวด block.tendrils.name = ไม้เลื้อย -block.sandrocks.name = หินทราย +block.sand-wall.name = Sand Wall block.spore-pine.name = ต้นสนสปอร์ -block.sporerocks.name = หินสปอร์ -block.rock.name = หิน -block.snowrock.name = ก้อนหิมะ +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = ต้นสนที่คลุมหิมะ block.shale.name = หินดินดาน block.shale-boulder.name = ก้อนหินดินดาน block.moss.name = ตะไคร่น้ำ block.shrubs.name = พุ่มไม้ block.spore-moss.name = พุ่มไม้สปอร์ -block.shalerocks.name = หิน +block.shale-wall.name = Shale Wall block.scrap-wall.name = กำแพงเศษเหล็ก block.scrap-wall-large.name = กำแพงเศษเหล็กขนาดใหญ่ block.scrap-wall-huge.name = กำแพงเศษเหล็กขนาดใหญ่มาก @@ -919,13 +979,17 @@ block.craters.name = หลุมอุกกาบาต block.sand-water.name = น้ำบนทราย block.darksand-water.name = น้ำบนทรายดำ block.char.name = ถ่าน -block.holostone.name = หินโฮโล +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = น้ำแข็งหิมะ -block.rocks.name = หิน -block.icerocks.name = หินน้ำแข็ง -block.snowrocks.name = หินหิมะ -block.dunerocks.name = หินเนินทราย +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = ต้นสน +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = ต้นไม้ขาวที่ตายแล้ว block.white-tree.name = ต้มไม้ขาว block.spore-cluster.name = กลุ่มสปอร์ @@ -941,10 +1005,9 @@ block.dark-panel-4.name = แผ่นดำ 4 block.dark-panel-5.name = แผ่นดำ 5 block.dark-panel-6.name = แผ่นดำ 6 block.dark-metal.name = เหล็กดำ -block.ignarock.name = หินอิกน่า +block.basalt.name = Basalt block.hotrock.name = หินร้อน block.magmarock.name = หินแมกม่า -block.cliffs.name = หน้าผา block.copper-wall.name = กำแพงทองแดง block.copper-wall-large.name = กำแพงทองแดงขนาดใหญ่ block.titanium-wall.name = กำแพงไทเทเนี่ยม @@ -993,7 +1056,7 @@ block.diode.name = ไดโอดแบตเตอรี่ block.battery.name = แบตเตอรี่ block.battery-large.name = แบตเตอรี่ขนาดใหญ่ block.combustion-generator.name = เครื่องกำเนิดไฟฟ้าโดยการสันดาป -block.turbine-generator.name = เครื่องกำเนิดไฟฟ้าไอน้ำ +block.steam-generator.name = เครื่องกำเนิดไฟฟ้าไอน้ำ block.differential-generator.name = เครื่องกำเนิดไฟฟ้าดิฟเฟอเร่นเตอร์ block.impact-reactor.name = เตาปฏิกรณ์อัดกระแทก block.mechanical-drill.name = เครื่องขุดเชิงกล @@ -1055,6 +1118,7 @@ block.container.name = ตู้เก็บของ block.launch-pad.name = ฐานส่งของ block.launch-pad-large.name = ฐานส่งของขนาดใหญ่ block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = น้ำเงิน team.crux.name = แดง team.sharded.name = ส้ม @@ -1192,7 +1265,7 @@ block.battery.description = เก็บพลังงานเป็นบั block.battery-large.description = เก็บพลังงานได้เยอะกว่าแบตเตอรี่ธรรมดา. block.combustion-generator.description = ผลิตพลังงานโดยการวัสดุติดไฟ เช่นถ่านหิน. block.thermal-generator.description = ผลิตพลังงานเมื่อวานในที่ร้อน (บนหินร้อนหรือหินแม็คม่า) -block.turbine-generator.description = เครื่องกำเนิดไฟฟ้าเผาไหม้ขั้นสูง. ประสิทธิภาพสูงกว่า แต่ต้องใช้น้ำด้วยเพื่อผลิตไอน้ำ. +block.steam-generator.description = เครื่องกำเนิดไฟฟ้าเผาไหม้ขั้นสูง. ประสิทธิภาพสูงกว่า แต่ต้องใช้น้ำด้วยเพื่อผลิตไอน้ำ. block.differential-generator.description = ผลิตไฟฟ้าจำนวนมาก. ใช้ความต่างของอุณหภูมิระหว่างไครโยฟลูอิดและไพไรต์ที่กำลังไหม้. block.rtg-generator.description = เครื่องกำเนิดไฟฟ้าที่ใช้ง่ายและไว้ใจได้. ใช้ความร้อนจากการสลายของสารกัมมัตภาพรังสีเพื่อใช้ผลิตพลังงานอย่างช้าๆ. block.solar-panel.description = ให้พลังงานจากแสงอาทิตย์จำนวนน้อย. diff --git a/core/assets/bundles/bundle_tk.properties b/core/assets/bundles/bundle_tk.properties index 006ef4ae92..21f0cb129c 100644 --- a/core/assets/bundles/bundle_tk.properties +++ b/core/assets/bundles/bundle_tk.properties @@ -20,6 +20,8 @@ gameover = Cekirdegin yok edildi. gameover.pvp = The[accent] {0}[] team is victorious! highscore = [accent]Yeni Yuksek skor! copied = Copied. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sounds load.map = Maps @@ -63,8 +65,7 @@ stat.delivered = Resources Launched: stat.playtime = Time Played:[accent] {0} stat.rank = Final Rank: [accent]{0} -launcheditems = [accent]Launched Items -launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. +globalitems = [accent]Global Items map.delete = Su haritayi silmek istediginden emin misin? "[accent]{0}[]"? level.highscore = Yuksek Skor: [accent]{0} level.select = Seviye secimi @@ -114,6 +115,7 @@ mod.disable = Disable mod.content = Content: mod.delete.error = Unable to delete mod. File may be in use. mod.requiresversion = [scarlet]Requires min game version: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Missing dependencies: {0} mod.erroredcontent = [scarlet]Content Errors mod.errors = Errors have occurred loading content. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Hakkinda name = isim: noname = Pick a[accent] player name[] first. +planetmap = Planet Map +launchcore = Launch Core filename = File Name: unlocked = Yeni yapi acildi!! completed = [accent]Completed @@ -144,6 +148,7 @@ techtree = Tech Tree research.list = [lightgray]Research: research = Research researched = [lightgray]{0} researched. +research.progress = {0}% complete players = {0} oyuncu cevrimici players.single = {0} oyuncu cevrimici players.search = search @@ -340,6 +345,11 @@ waves.load = Load from Clipboard waves.invalid = Invalid waves in clipboard. waves.copied = Waves copied. waves.none = No enemies defined.\nNote that empty wave layouts will automatically be replaced with the default layout. + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Details... edit = Edit... @@ -459,7 +469,8 @@ locked = Locked complete = [lightgray]Complete: requirement.wave = Reach Wave {0} in {1} requirement.core = Destroy Enemy Core in {0} -requirement.unlock = Unlock {0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Resume Zone:\n[lightgray]{0} bestwave = [lightgray]Best: {0} launch = Launch @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Banned Blocks addall = Add All +launch.destination = Destination: {0} configure.invalid = Amount must be a number between 0 and {0}. zone.unlocked = [lightgray]{0} unlocked. zone.requirement.complete = Wave {0} reached:\n{1} zone requirements met. @@ -496,6 +508,20 @@ error.io = Network I/O error. error.any = Unkown network error. error.bloom = Failed to initialize bloom.\nYour device may not support it. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafikler settings.cleardata = Clear Game Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = Duraklatildi clear = Clear banned = [scarlet]Banned @@ -557,8 +585,11 @@ blocks.itemsmoved = Move Speed blocks.launchtime = Time Between Launches blocks.shootrange = Menzil blocks.size = Buyukluk +blocks.displaysize = Display Size blocks.liquidcapacity = Sivi kapasitesi blocks.powerrange = Menzil +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Max Connections blocks.poweruse = Guc kullanimi blocks.powerdamage = Power/Damage @@ -574,11 +605,14 @@ blocks.boosteffect = Boost Effect blocks.maxunits = Max Active Units blocks.health = Can blocks.buildtime = Build Time +blocks.maxconsecutive = Max Consecutive blocks.buildcost = Build Cost blocks.inaccuracy = sekme blocks.shots = vuruslar blocks.reload = Yeniden doldurma blocks.ammo = Ammo +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Better Drill Required bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = Litre unit.powerunits = Volt unit.degrees = derece unit.seconds = saniye +unit.minutes = mins unit.persecond = /sec +unit.perminute = /min unit.timesspeed = x speed unit.percent = % +unit.shieldhealth = shield health unit.items = esya unit.thousands = k unit.millions = mil +unit.billions = b category.general = General category.power = Guc category.liquids = sivilar @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Attack command.rally = Rally command.retreat = Retreat +command.idle = Idle placement.blockselectkeys = \n[lightgray]Key: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = Sol/Sag hareket keybind.move_y.name = Yukari/asagi hareket keybind.mouse_move.name = Follow Mouse +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Select Region keybind.schematic_menu.name = Schematic Menu @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Diagonal Placement keybind.pick.name = Pick Block keybind.break_block.name = Break Block keybind.deselect.name = Eldeki yapiyi birak +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Sik keybind.zoom.name = Yaklas keybind.menu.name = Menu @@ -782,6 +825,7 @@ rules.reactorexplosions = Reactor Explosions rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode +rules.buildai = AI Building rules.enemyCheat = Infinite AI Resources rules.blockhealthmultiplier = Block Health Multiplier rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Units rules.title.experimental = Experimental rules.title.environment = Environment rules.lighting = Lighting +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ambient Light -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Esyalar content.liquid.name = Sivilar @@ -830,9 +878,11 @@ liquid.water.name = Su liquid.slag.name = Slag liquid.oil.name = Benzin liquid.cryofluid.name = kriyo sivisi + item.explosiveness = [lightgray]Patlayicilik: {0} item.flammability = [lightgray]Yanbilirlik: {0} item.radioactivity = [lightgray]Radyoaktivite: {0} + unit.health = [lightgray]Can: {0} unit.speed = [lightgray]hiz: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Sand Boulder block.grass.name = Grass block.slag.name = Slag block.salt.name = Salt -block.saltrocks.name = Salt Rocks +block.salt-wall.name = Salt Wall block.pebbles.name = Pebbles block.tendrils.name = Tendrils -block.sandrocks.name = Sand Rocks +block.sand-wall.name = Sand Wall block.spore-pine.name = Spore Pine -block.sporerocks.name = Spore Rocks -block.rock.name = Rock -block.snowrock.name = Snow Rock +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Snow Pine block.shale.name = Shale block.shale-boulder.name = Shale Boulder block.moss.name = Moss block.shrubs.name = Shrubs block.spore-moss.name = Spore Moss -block.shalerocks.name = Shale Rocks +block.shale-wall.name = Shale Wall block.scrap-wall.name = Scrap Wall block.scrap-wall-large.name = Large Scrap Wall block.scrap-wall-huge.name = Huge Scrap Wall @@ -919,13 +979,17 @@ block.craters.name = Craters block.sand-water.name = Sand water block.darksand-water.name = Dark Sand Water block.char.name = Char -block.holostone.name = Holo stone +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Ice Snow -block.rocks.name = Rocks -block.icerocks.name = Ice rocks -block.snowrocks.name = Snow Rocks -block.dunerocks.name = Dune Rocks +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Pine +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = White Tree Dead block.white-tree.name = White Tree block.spore-cluster.name = Spore Cluster @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Dark Panel 4 block.dark-panel-5.name = Dark Panel 5 block.dark-panel-6.name = Dark Panel 6 block.dark-metal.name = Dark Metal -block.ignarock.name = Igna Rock +block.basalt.name = Basalt block.hotrock.name = Hot Rock block.magmarock.name = Magma Rock -block.cliffs.name = Cliffs block.copper-wall.name = bakir duvar block.copper-wall-large.name = buyuk bakir duvar block.titanium-wall.name = Titanium Wall @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = batarya block.battery-large.name = buyuk batarya block.combustion-generator.name = sicaklik jenaratoru -block.turbine-generator.name = termal jenaratoru +block.steam-generator.name = termal jenaratoru block.differential-generator.name = Differential Generator block.impact-reactor.name = Impact Reactor block.mechanical-drill.name = Mekanikal Kazici @@ -1055,6 +1118,7 @@ block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = blue team.crux.name = red team.sharded.name = orange @@ -1192,7 +1265,7 @@ block.battery.description = Stores power whenever there is an abundance and prov block.battery-large.description = Stores much more power than a regular battery. block.combustion-generator.description = Generates power by burning oil or flammable materials. block.thermal-generator.description = Generates a large amount of power from lava. -block.turbine-generator.description = More efficient than a combustion generator, but requires additional water. +block.steam-generator.description = More efficient than a combustion generator, but requires additional water. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. block.rtg-generator.description = A radioisotope thermoelectric generator which does not require cooling but provides less power than a thorium reactor. block.solar-panel.description = Provides a small amount of power from the sun. diff --git a/core/assets/bundles/bundle_tr.properties b/core/assets/bundles/bundle_tr.properties index 15788e2753..5ebb31a858 100644 --- a/core/assets/bundles/bundle_tr.properties +++ b/core/assets/bundles/bundle_tr.properties @@ -20,6 +20,8 @@ gameover = Kaybettin gameover.pvp = [accent] {0}[] Takımı kazandı! highscore = [accent]Yeni rekor! copied = Panoya Kopyalandı. +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = Sesler load.map = Haritalar @@ -63,8 +65,7 @@ stat.delivered = Gönderilen Kaynaklar: stat.playtime = Time Played:[accent] {0} stat.rank = Rütbe: [accent]{0} -launcheditems = [accent]Gönderilen Kaynaklar -launchinfo = Mavi ile belirtilen materyallerden edinmek için [unlaunched][[KALKIŞ] yapın. +globalitems = [accent]Global Items map.delete = "[accent]{0}[]" haritasını silmek istediğine emin misin? level.highscore = Rekor: [accent]{0} level.select = Seviye Seçimi @@ -114,6 +115,7 @@ mod.disable = Devre Dışı Bırak mod.content = Content: mod.delete.error = Mod silinemiyor. Dosya kullanımda olabilir. mod.requiresversion = [scarlet]Gereken en düşük oun versiyonu: [accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]Bu modun çalışması için gereken modlar: {0} mod.erroredcontent = [scarlet]İçerik hatası. mod.errors = İçerik yüklenirken bir hata oluştu. @@ -137,6 +139,8 @@ mod.scripts.disable = Your device does not support mods with scripts. You must d about.button = Hakkında name = İsim: noname = Bir[accent] kullanıcı adı[] seçmelisin. +planetmap = Planet Map +launchcore = Launch Core filename = Dosya Adı: unlocked = Yeni içerik açıldı! completed = [accent]Tamamlandı @@ -144,6 +148,7 @@ techtree = Teknoloji Ağacı research.list = [lightgray]Araştırmalar: research = Araştır researched = [lightgray]{0} Araştırıldı. +research.progress = {0}% complete players = {0} çevrimiçi oyuncu players.single = {0} çevrimiçi oyuncu players.search = search @@ -340,6 +345,11 @@ waves.load = Panodan yükle waves.invalid = Panoda geçersiz dalga sayısı var. waves.copied = Dalgalar kopyalandı. waves.none = Düşman bulunamadı.\nBoş dalga düzenlerin otomatik olarak varsayılan düzenle değiştirileceğini unutmayın + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray] details = Detaylar... edit = Düzenle... @@ -459,7 +469,8 @@ locked = Kilitli complete = [lightgray]Ulaş: requirement.wave = Bölge {1}'de Dalga {0} requirement.core = {0}`da Düşman Çekirdeği Yok Et -requirement.unlock = {0}'I Aç +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Bölgeye Devam Et:\n[lightgray]{0} bestwave = [lightgray]En İyi Dalga: {0} launch = < KALKIŞ > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = Yasaklı Bloklar addall = Hepsini Ekle +launch.destination = Destination: {0} configure.invalid = Miktar 0 ve {0} arasında bir sayı olmalı. zone.unlocked = [lightgray]{0} kilidi açıldı. zone.requirement.complete = {0}. dalgaya ulaşıldı:\n{1} bölge şartları karşılandı. @@ -496,6 +508,20 @@ error.io = Ağ I/O hatası. error.any = Bilinmeyen ağ hatası. error.bloom = Kamaşma başlatılamadı.\nCihazınız bu özelliği desteklemiyor olabilir. +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = Grafikler settings.cleardata = Oyun Verisini Sil... settings.clear.confirm = Verileri silmek istediğinizden emin misiniz?\nBu işlemi geri alamazsınız! settings.clearall.confirm = [scarlet]Uyarı![]\nBu işlem kayıtlar, haritalar açılan bloklar ve tuş atamaları dahil bütün verileri silecektir.\n"ok" tuşuna bastığınızda bütün verileriniz silinecek ve oyun kapanacaktır. +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent] clear = Temizle banned = [scarlet]Yasaklı @@ -557,8 +585,11 @@ blocks.itemsmoved = Hareket Hızı blocks.launchtime = Fırlatmalar Arasındaki Süre blocks.shootrange = Menzil blocks.size = Boyut +blocks.displaysize = Display Size blocks.liquidcapacity = Sıvı Kapasitesi blocks.powerrange = Enerji Menzili +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = Bağlantı sayısı blocks.poweruse = Enerji Kullanımı blocks.powerdamage = Enerji/Hasar @@ -574,11 +605,14 @@ blocks.boosteffect = Hızlandırma Efekti blocks.maxunits = Maksimum Aktif Birim blocks.health = Can blocks.buildtime = İnşaat Süresi +blocks.maxconsecutive = Max Consecutive blocks.buildcost = İnşaat Fiyatı blocks.inaccuracy = İskalama Oranı blocks.shots = Atışlar blocks.reload = Atışlar/Sn blocks.ammo = Mermi +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Daha İyi Matkap Gerekli bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = sıvı birimi unit.powerunits = enerji birimi unit.degrees = derece unit.seconds = saniye +unit.minutes = mins unit.persecond = /sn +unit.perminute = /min unit.timesspeed = x hız unit.percent = % +unit.shieldhealth = shield health unit.items = eşya unit.thousands = k unit.millions = mil +unit.billions = b category.general = Genel category.power = Enerji category.liquids = Sıvılar @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = Saldır command.rally = Toplan command.retreat = Geri Çekil +command.idle = Idle placement.blockselectkeys = \n[lightgray]Tuş: [{0}, keybind.respawn.name = Respawn keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = Toggle Block Statuses keybind.move_x.name = x Ekseninde Hareket keybind.move_y.name = y Ekseninde Hareket keybind.mouse_move.name = Fareyi Takip Et +keybind.pan.name = Pan View keybind.boost.name = Boost keybind.schematic_select.name = Bölge Seç keybind.schematic_menu.name = Şema Menüsü @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = Çapraz Yerleştirme keybind.pick.name = Blok Seç keybind.break_block.name = Blok Kır keybind.deselect.name = Seçimleri Kaldır +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Ateş Et keybind.zoom.name = Yakınlaştırma/Uzaklaştırma keybind.menu.name = Menü @@ -782,6 +825,7 @@ rules.reactorexplosions = Reaktör Patlamaları rules.wavetimer = Dalga Zamanlayıcısı rules.waves = Dalgalar rules.attack = Saldırı Modu +rules.buildai = AI Building rules.enemyCheat = Sonsuz AI (Kırmızı Takım) Kaynakları rules.blockhealthmultiplier = Blok Canı Çarpanı rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = Birlikler rules.title.experimental = Deneysel rules.title.environment = Environment rules.lighting = Işıklandırma +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = Ortam Işığı -rules.solarpowermultiplier = Solar Power Multiplier +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = Eşyalar content.liquid.name = Sıvılar @@ -830,9 +878,11 @@ liquid.water.name = Su liquid.slag.name = Cüruf liquid.oil.name = Petrol liquid.cryofluid.name = Kriyosıvı + item.explosiveness = [lightgray]Patlama: {0}% item.flammability = [lightgray]Yanıcılık: {0}% item.radioactivity = [lightgray]Radyoaktivite: {0}% + unit.health = [lightgray]Can: {0} unit.speed = [lightgray]Hız: {0} unit.weapon = [lightgray]Weapon: {0} @@ -856,6 +906,7 @@ unit.crawler.name = Crawler unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = Cliff block.sand-boulder.name = Kum Kaya Parçaları block.grass.name = Çimen block.slag.name = Slag block.salt.name = Tuz -block.saltrocks.name = Tuz Taşları +block.salt-wall.name = Salt Wall block.pebbles.name = Çakıl Taşları block.tendrils.name = Tendriller -block.sandrocks.name = Kum Kayaları +block.sand-wall.name = Sand Wall block.spore-pine.name = Spor Çamı -block.sporerocks.name = Spor Kayaları -block.rock.name = Kaya -block.snowrock.name = Karlı Kaya +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = Karlı Çam block.shale.name = Şist block.shale-boulder.name = Şist Kayası block.moss.name = Yosun block.shrubs.name = Çalılık block.spore-moss.name = Liken -block.shalerocks.name = Şist Kayaları +block.shale-wall.name = Shale Wall block.scrap-wall.name = Hurda Duvar block.scrap-wall-large.name = Büyük Hurda Duvar block.scrap-wall-huge.name = Dev Hurda Duvar @@ -919,13 +979,17 @@ block.craters.name = Krater block.sand-water.name = Kumlu Su block.darksand-water.name = Kara Kumlu Su block.char.name = Kömür -block.holostone.name = Holotaş +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = Buzlu Kar -block.rocks.name = Duvar -block.icerocks.name = Buz Duvarı -block.snowrocks.name = Kar Duvarı -block.dunerocks.name = Çöl Duvarı +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = Çam +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = Ölü Beyaz Ağaç block.white-tree.name = Beyaz Ağaç block.spore-cluster.name = Spor Kümesi @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Kara Panel 4 block.dark-panel-5.name = Kara Panel 5 block.dark-panel-6.name = Kara Panel 6 block.dark-metal.name = Kara Metal -block.ignarock.name = Eriyik Kaya +block.basalt.name = Basalt block.hotrock.name = Sıcak Kaya block.magmarock.name = Magma Kayası -block.cliffs.name = Uçurumlar block.copper-wall.name = Bakır Duvar block.copper-wall-large.name = Büyük Bakır Duvar block.titanium-wall.name = Titanyum Duvar @@ -993,7 +1056,7 @@ block.diode.name = Battery Diode block.battery.name = Batarya block.battery-large.name = Büyük Batarya block.combustion-generator.name = Termik Jeneratör -block.turbine-generator.name = Buhar Jeneratörü +block.steam-generator.name = Buhar Jeneratörü block.differential-generator.name = Diferansiyel Jeneratörü block.impact-reactor.name = Patlama Reaktörü block.mechanical-drill.name = Mekanik Matkap @@ -1055,6 +1118,7 @@ block.container.name = Konteyner block.launch-pad.name = Kalkış Pisti block.launch-pad-large.name = Büyük Kalkış Pisti block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = mavi team.crux.name = kırmızı team.sharded.name = turuncu @@ -1192,7 +1265,7 @@ block.battery.description = Enerji fazlasını yedek olarak saklar. Enerji açı block.battery-large.description = Sıradan bataryadan çok daha fazla enerji depolar. block.combustion-generator.description = Kömür gibi yanıcı materyalleri yakarak enerji üretir. block.thermal-generator.description = Sıcak bölgelere konulduğunda enerji üretir. -block.turbine-generator.description = Daha gelişmiş bir termik jeneratör. Daha verimlidir, ama buhar üretebilmek için suya ihtiyaç duyar. +block.steam-generator.description = Daha gelişmiş bir termik jeneratör. Daha verimlidir, ama buhar üretebilmek için suya ihtiyaç duyar. block.differential-generator.description = Çok miktarda enerji üretir. Kriyosıvı ve yanan pirratit arasındaki sıcaklık farkından yararlanır. block.rtg-generator.description = Basit, güvenilir bir reaktör. Bozunan radyoaktif materyallerin ısısını kullanır. block.solar-panel.description = Güneşten küçük miktarda enerji üretir. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 9c02b7b8b4..631e56dac5 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -13,13 +13,15 @@ link.google-play.description = Завантажити для Android з Google P link.f-droid.description = Завантажити для Android з F-Droid link.wiki.description = Офіційна ігрова Wiki link.suggestions.description = Запропонувати нові функції -linkfail = Не вдалося відкрити посилання!\nURL-адреса скопійована в буфер обміну. +linkfail = Не вдалося перейти за посиланням!\nURL-адреса скопійована в буфер обміну. screenshot = Зняток мапи збережено до {0} screenshot.invalid = Мапа занадто велика, тому, мабуть, не вистачає пам’яті для знятку мапи. gameover = Гра завершена gameover.pvp = [accent]{0}[] команда перемогла! highscore = [accent]Новий рекорд! copied = Скопійовано. +indev.popup = Наразі [accent]6.0[] знаходиться у стадії [accent]альфа[].\n[lightgray]Це означає наступне:[]\n- Не вистачає наповнення гри;\n- Більшість [scarlet]ШІ бойових одиниць[] не працює належним чином;\n- Багато одиниць [scarlet]відсутні[] або незавершені;\n- Кампанія повністю не є завершеною;\n- Усе, що ви бачите, може змінитися або видалитися.\n\nПовідомляйте про вади або збої на [accent]Github[], а про помилки в перекладі в Discord. +indev.notready = Ця частина гри ще не готова load.sound = Звуки load.map = Мапи @@ -39,8 +41,8 @@ be.check = Перевірити на наявність оновлень schematic = Схема schematic.add = Зберегти схему… schematics = Схеми -schematic.replace = Схема з такою назвою вже існує. Замінити її? -schematic.exists = Схема з такою назвою вже існує. +schematic.replace = Схема з такою назвою вже є. Замінити її? +schematic.exists = Схема з такою назвою вже є. schematic.import = Імпортувати схему… schematic.exportfile = Експортувати файл schematic.importfile = Імпортувати файл @@ -50,7 +52,7 @@ schematic.copy.import = Імпортувати з клавіатури schematic.shareworkshop = Поширити в Майстерню schematic.flip = [accent][[{0}][]/[accent][[{1}][]: Обернути схему schematic.saved = Схема збережена. -schematic.delete.confirm = Ця схема буде повністю випалена Викорінювачем. +schematic.delete.confirm = Ви справді хочете видалити цю схему? schematic.rename = Перейменувати схему schematic.info = {0}x{1}, {2} блоків @@ -68,7 +70,7 @@ map.delete = Ви впевнені, що хочете видалити мапу level.highscore = Рекорд: [accent]{0} level.select = Вибір мапи level.mode = Режим гри: -coreattack = < Ядро знаходиться під атакою! > +coreattack = < Ядро перебуває під атакою! > nearpoint = [[ [scarlet]ЗАЛИШТЕ ЗОНУ ВИСАДКИ НЕГАЙНО[] ]\nанігіляція неминуча database = База даних ядра savegame = Зберегти гру @@ -77,7 +79,7 @@ joingame = Мережева гра customgame = Користувацька гра newgame = Нова гра none = <нічого> -minimap = Міні-мапа +minimap = Мінімапа position = Місцезнаходження close = Закрити website = Вебсайт @@ -97,15 +99,15 @@ committingchanges = Здійснення змін done = Зроблено feature.unsupported = Ваш пристрій не підтримує цю функцію -mods.alphainfo = Майте на увазі, що модифікації знаходяться в альфі, і [scarlet]можуть бути дуже глючними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. +mods.alphainfo = Майте на увазі, що модифікації перебувають в альфі, і [scarlet]можуть бути дуже несправними[].\nПовідомте про будь-які проблеми, які ви знайдете до Mindustry Github або Discord. mods.alpha = [accent](Альфа) mods = Модифікації mods.none = [lightgray]Модифікацій не знайдено! -mods.guide = Посібник з модифікацій +mods.guide = Посібник із модифікацій mods.report = Повідомити про ваду mods.openfolder = Відкрити теку mods.reload = Перезавантажити -mods.reloadexit = Гра зараз закриється, щоб перезавантажити модифікації +mods.reloadexit = Гра зараз закриється, щоби перезавантажити модифікації mod.display = [gray]Модифікація:[orange] {0} mod.enabled = [lightgray]Увімкнено mod.disabled = [scarlet]Вимкнено @@ -113,29 +115,32 @@ mod.disable = Вимкнути mod.content = Зміст: mod.delete.error = Неможливо видалити модифікацію. Файл, можливо, використовується. mod.requiresversion = [scarlet]Необхідна мінімальна версія гри: [accent]{0} +mod.outdated = [scarlet]Не сумісна з V6 (немає мінімальної версі гри (англ. min-game-version): 105) mod.missingdependencies = [scarlet]Відсутні залежності: {0} -mod.erroredcontent = [scarlet]Помилки при завантаженні +mod.erroredcontent = [scarlet]Помилки під час завантаження mod.errors = Виникли помилки під час завантаження змісту. mod.noerrorplay = [scarlet]Ви маєте модифікації з помилками.[] Або вимкніть проблемні модифікації, або виправте їх. mod.nowdisabled = [scarlet]Модифікації «{0}» не вистачає залежних модифікацій:[accent] {1}\n[lightgray]Ці модифікації потрібно завантажити спочатку.\nЦя модифікація буде автоматично вимкнена. mod.enable = Увімкнути -mod.requiresrestart = А тепер гра закриється, щоб застосувати зміни модифікацій. +mod.requiresrestart = А тепер гра закриється, щоби застосувати зміни модифікацій. mod.reloadrequired = [scarlet]Потрібно перезавантаження mod.import = Імпортувати модифікацію mod.import.file = Імпортувати файл mod.import.github = Імпортувати з GitHub -mod.jarwarn = [scarlet]JAR-модифікації по своїй суті небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела! -mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоб видалити його, видаліть цю модифікацію. +mod.jarwarn = [scarlet]JAR-модифікації за своєю суттю небезпечні.[]\nПереконайтеся, що ви імпортуєте цю модифікацію з надійного джерела! +mod.item.remove = Цей предмет є частиною модифікації [accent] «{0}»[]. Щоби видалити його, видаліть цю модифікацію. mod.remove.confirm = Цю модифікацію буде видалено. mod.author = [lightgray]Автор:[] {0} mod.missing = Це збереження містить модифікації, які ви нещодавно оновили або більше не встановлювали. Збереження може зіпсуватися. Ви впевнені, що хочете завантажити його?\n[lightgray]Модифікації:\n{0} -mod.preview.missing = До публікації цієї модифікації в Майстерні, ви повинні додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову. -mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію у теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації. +mod.preview.missing = До публікації цієї модифікації в Майстерні, ви мусите додати зображення попереднього перегляду.\nПомістіть зображення з назвою [accent] preview.png[] у теку з модифікаціями та спробуйте знову. +mod.folder.missing = Тільки модифікації у формі теці можуть бути опубліковані в Майстерні.\nЩоб перетворити будь-яку модифікацію в теку, просто розархівуйте цей файл у теку та видаліть старий архів, і потім перезапустіть гру або перезавантажте ваші модифікації. mod.scripts.disable = Ваш пристрій не підтримує модифікації зі скриптами. Вимкніть модифікацію для запуску гри. about.button = Про гру name = Ім’я: noname = Спочатку придумайте[accent] собі ім’я[]. +planetmap = Планетна мапа +launchcore = Запустити ядро filename = Назва файлу: unlocked = Доступний новий вміст! completed = [accent]Завершено @@ -149,28 +154,28 @@ players.single = {0} гравець на сервері players.search = пошук players.notfound = [gray]гравців не знайдено server.closing = [accent]Закриття сервера… -server.kicked.kick = Ви були вигнані з сервера! +server.kicked.kick = Ви були вигнані із сервера! server.kicked.whitelist = Ви не в білому списку сервера. -server.kicked.serverClose = Сервер закрито. +server.kicked.serverClose = Сервер зачинено. server.kicked.vote = Вас було вигнано із сервера за допомогою голосування. Прощавайте. server.kicked.clientOutdated = Застарілий клієнт! Оновіть свою гру! server.kicked.serverOutdated = Застарілий сервер! Попрохайте адміністратора сервера оновити сервер/гру! server.kicked.banned = Ви заблоковані на цьому сервері. -server.kicked.typeMismatch = Цей сервер не сумісний з вашим типом збірки. +server.kicked.typeMismatch = Цей сервер не сумісний із вашим типом збірки. server.kicked.playerLimit = Цей сервер — заповнений. Дочекайтесь вільного місця. server.kicked.recentKick = Нещодавно вас вигнали.\nПочекайте трохи перед наступним під’єднанням. -server.kicked.nameInUse = На цьому сервері вже є хтось з таким ім’ям. +server.kicked.nameInUse = На цьому сервері вже є хтось із таким ім’ям. server.kicked.nameEmpty = Ваше ім’я має містити принаймні один символ або цифру. server.kicked.idInUse = Ви вже на цьому сервері! Під’єднанням двох облікових записів не дозволяється. server.kicked.customClient = Цей сервер не підтримує користувацькі збірки. Завантажте офіційну версію. server.kicked.gameover = Гру завершено! server.kicked.serverRestarting = Сервер перезавантажується server.versions = Ваша версія:[accent] {0}[]\nВерсія на сервері:[accent] {1}[] -host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які знаходяться у тій же [lightgray]WiFi або локальній мережах[], повинні побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоб люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви дозволили Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дозволяють виявити сервер. +host.info = Кнопка [accent]Сервер[] розміщує сервер на порті [scarlet]6567[]. \nКористувачі, які перебувають в тій же [lightgray]WiFi або локальній мережах[], мають побачити ваш сервер у своєму списку серверів.\n\nЯкщо ви хочете, щоби люди могли приєднуватися з будь-якої точки планети через IP, то потрібно зробити[accent] переадресація порту[].\n\n[lightgray]Примітка. Якщо у вас виникли проблеми з приєднанням до вашої локальної гри, переконайтеся, що ви надали Mindustry доступ до вашої локальної мережі в налаштуваннях брандмауера. Зауважте, що публічні мережі іноді не дають змогу виявити сервер. join.info = Тут ви можете ввести [accent]IP сервера[] для під’єднання або знайти сервери у [accent]локальній[] чи [accent]глобальній мережі[] для приєднання до них.\nПідтримується локальна мережа(LAN) і широкосмугова мережа(WAN).\n\n[lightgray] Примітка. Це не є автоматичним глобальним списком серверів; якщо ви хочете приєднатися до когось через IP, вам доведеться попросити власника сервера дати свій ip. hostserver = Запустити багатокористувацький сервер invitefriends = Запросити друзів -hostserver.mobile = Запустити\nсервер +hostserver.mobile = Запустити сервер host = Запустити hosting = [accent]Відкриття сервера… hosts.refresh = Оновити @@ -259,25 +264,25 @@ ok = Гаразд open = Відкрити customize = Налаштувати правила cancel = Скасувати -openlink = Відкрити посилання +openlink = Перейти за посиланням copylink = Скопіювати посилання back = Назад data.export = Вивантажити дані data.import = Завантажити дані -data.openfolder = Відкрити теку з даними +data.openfolder = Відчинити теку з даними data.exported = Дані вивантажено. data.invalid = Це не дійсні ігрові дані. -data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЩойно дані імпортуються, гра негайно закриється. +data.import.confirm = Вивантаження зовнішніх даних перезапише[scarlet] ВСІ[] ваші поточні ігрові дані.\n[accent]Це неможливо скасувати![]\n\nЯк тільки дані імпортуються, гра негайно закриється. quit.confirm = Ви дійсно хочете вийти? quit.confirm.tutorial = Ви впевнені, що знаєте що робите?\nНавчання можна пройти наново[accent] Налаштування->Гра->Пройти навчання ще раз.[] loading = [accent]Завантаження… reloading = [accent]Перезавантаження модифікацій… saving = [accent]Збереження… -respawn = [accent][[{0}][], щоб відродитися в ядрі +respawn = [accent][[{0}][], щоби відродитися в ядрі cancelbuilding = [accent][[{0}][], щоб очистити план -selectschematic = [accent][[{0}][], щоб вибрати та скопіювати -pausebuilding = [accent][[{0}][], щоб призупинити будування -resumebuilding = [scarlet][[{0}][], щоб продовжити будування +selectschematic = [accent][[{0}][], щоби вибрати та скопіювати +pausebuilding = [accent][[{0}][], щоби призупинити будування +resumebuilding = [scarlet][[{0}][], щоби продовжити будування wave = [accent]Хвиля {0} wave.waiting = [lightgray]Наступна хвиля\nчерез {0} wave.waveInProgress = [lightgray]Хвиля триває @@ -293,11 +298,11 @@ builtin = Вбудована map.delete.confirm = Ви дійсно хочете видалити цю мапу? Цю дію неможливо буде скасувати! map.random = [accent]Випадкова мапа map.nospawn = Ця мапа не має жодного ядра для появи гравця! Додайте [accent]помаранчеве[] ядро до цієї мапи в редакторі. -map.nospawn.pvp = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі. -map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі. +map.nospawn.pvp = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]не помаранчеве[] ядро до цієї мапи в редакторі. +map.nospawn.attack = У цієї мапи немає ворожих ядер, у яких гравець може з’явитися! Додайте [scarlet]червоне[] ядро до цієї мапи в редакторі. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. workshop.update = Оновити предмет -workshop.error = Помилка при отриманні інформації з Майстерні: {0} +workshop.error = Помилка під час отримання інформації з Майстерні: {0} map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Спершу переконайтеся, що ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться! workshop.menu = Виберіть, що ви хочете зробити з цим предметом. workshop.info = Інформація про предмет @@ -306,7 +311,7 @@ eula = Ліцензійна угода Steam missing = Цей предмет було видалено або переміщено.\n[lightgray]Список Майстерні тепер автоматично від’єднано. publishing = [accent]Публікація… publish.confirm = Ви дійсно хочете опублікувати це?\n\n[lightgray]Переконайтеся, що ви спочатку погоджуєтеся з EULA Майстерні, або ваші предмети не з’являться! -publish.error = Виникла помилка при публікації предмета: {0} +publish.error = Виникла помилка під час публікації предмета: {0} steam.error = Не вдалося ініціалізувати сервіси Steam.\nПомилка: {0} editor.brush = Пензлик @@ -316,11 +321,11 @@ editor.oregen.info = Генерація руд: editor.mapinfo = Інформація про мапу editor.author = Автор: editor.description = Опис: -editor.nodescription = Мапа повинна мати щонайменше 4 символи для публікації. +editor.nodescription = Мапа мусить мати щонайменше 4 символи для публікації. editor.waves = Хвилі: editor.rules = Правила: editor.generation = Генерація: -editor.ingame = Редагувати у грі +editor.ingame = Редагувати в грі editor.publish.workshop = Опублікувати в Майстерні Steam editor.newmap = Нова мапа workshop = Майстерня @@ -337,9 +342,14 @@ waves.preview = Попередній перегляд waves.edit = Редагувати… waves.copy = Копіювати в буфер обміну waves.load = Завантажити з буфера обміну -waves.invalid = Недійсні хвилі у буфері обміну. +waves.invalid = Недійсні хвилі в буфері обміну. waves.copied = Хвилі скопійовані. waves.none = Противники не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. + +wavemode.counts = кількість +wavemode.totals = усього +wavemode.health = здоров’я + editor.default = [lightgray]<За замовчуванням> details = Подробиці… edit = Редагувати… @@ -349,11 +359,11 @@ editor.removeunit = Видалити бойову одиницю editor.teams = Команди editor.errorload = Помилка завантаження зображення. editor.errorsave = Помилка збереження зображення. -editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» у редакторі. +editor.errorimage = Це зображення, а не мапа.\n\nЯкщо ви хочете імпортувати застарілу мапу, то використовуйте кнопку «Імпортувати застарілу мапу» в редакторі. editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується. editor.errornot = Це не мапа. editor.errorheader = Цей файл мапи недійсний або пошкоджений. -editor.errorname = Мапа не має назви. Може Ви намагаєтеся завантажити збереження? +editor.errorname = Мапа не має назви. Може, ви намагаєтеся завантажити збереження? editor.update = Оновити editor.randomize = Випадково editor.apply = Застосувати @@ -364,7 +374,7 @@ editor.savemap = Зберегти мапу editor.saved = Збережено! editor.save.noname = Ваша мапа не має назви! Установіть його в «Інформація про мапу». editor.save.overwrite = Ваша мапа перезаписує вбудовану мапу! Виберіть іншу назву в «Інформація про мапу». -editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже існує! +editor.import.exists = [scarlet]Неможливо імпортувати:[] вбудована мапа з назвою «{0}» вже є! editor.import = Імпорт… editor.importmap = Імпортувати мапу editor.importmap.description = Імпортувати вже наявну мапу @@ -379,12 +389,12 @@ editor.exportimage = Експорт зображення місцевості editor.exportimage.description = Експортувати файл зображення, що містить лише основний рельєф місцевості editor.loadimage = Завантажити\nзображення editor.saveimage = Зберегти\nзображення -editor.unsaved = [scarlet]У вас є незбережені зміни![]\nВи впевнені, що хочете вийти? +editor.unsaved = Ви впевнені, що хочете вийти?\n[scarlet]Незбережені зміни буде втрачено назавжди![] editor.resizemap = Змінити розмір мапи editor.mapname = Назва мапи: editor.overwrite = [accent]Попередження!\nЦе перезаписує наявну мапу. -editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже існує. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]» -editor.exists = Мапа з такою назвою вже існує. +editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже є. Ви впевнені, що хочете переписати її?\n«[accent]{0}[]» +editor.exists = Мапа з такою назвою вже є. editor.selectmap = Виберіть мапу для завантаження: toolmode.replace = Замінити @@ -397,7 +407,7 @@ toolmode.square = Прямокутник toolmode.square.description = Прямокутна кисть. toolmode.eraseores = Видалення руд toolmode.eraseores.description = Видалити тільки руди. -toolmode.fillteams = Змінити блок в команді +toolmode.fillteams = Змінити блок у команді toolmode.fillteams.description = Змінює належність\nблоків до команди. toolmode.drawteams = Змінити команду блока toolmode.drawteams.description = Змінює належність\nблока до команди. @@ -446,7 +456,7 @@ load = Завантажити save = Зберегти fps = FPS: {0} ping = Затримка: {0} мс -language.restart = Будь ласка, перезапустіть свою гру, щоб налаштування мови набули чинності. +language.restart = Будь ласка, перезапустіть свою гру, щоби налаштування мови набули чинності. settings = Налаштування tutorial = Навчання tutorial.retake = Пройти навчання ще раз @@ -458,8 +468,9 @@ abandon.text = Ця зона і всі її ресурси будуть утра locked = Заблоковано complete = [lightgray]Необхідно: requirement.wave = Досягніть хвилі {0} у зоні «{1}» -requirement.core = Знищте вороже ядро у зоні «{0}» -requirement.unlock = Розблокуйте {0} +requirement.core = Знищте вороже ядро в зоні «{0}» +requirement.research = Research {0} +requirement.capture = Capture {0} resume = Відновити зону:\n[lightgray]{0} bestwave = [lightgray]Найкраща хвиля: {0} launch = < ЗАПУСК > @@ -467,7 +478,7 @@ launch.text = Запуск launch.title = Запуск вдалий launch.next = [lightgray]наступна можливість буде на {0}-тій хвилі launch.unable2 = [scarlet]ЗАПУСК неможливий.[] -launch.confirm = Це видалить всі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази. +launch.confirm = Це видалить усі ресурси у вашому ядрі.\nВи не зможете повернутися до цієї бази. launch.skip.confirm = Якщо ви пропустите зараз, ви не зможете не запускати до більш пізніх хвиль. uncover = Розкрити configure = Налаштувати вивантаження @@ -475,7 +486,8 @@ loadout = Вивантаження resources = Ресурси bannedblocks = Заборонені блоки addall = Додати все -configure.invalid = Кількість повинна бути числом між 0 та {0}. +launch.destination = Destination: {0} +configure.invalid = Кількість має бути числом між 0 та {0}. zone.unlocked = Зона «[lightgray]{0}» тепер розблокована. zone.requirement.complete = Вимоги до зони «{0}» виконані:[lightgray]\n{1} zone.resources = [lightgray]Виявлені ресурси: @@ -488,7 +500,7 @@ boss.health = Здоров’я босу connectfail = [crimson]Помилка з’єднання:\n\n[accent]{0} error.unreachable = Сервер не є доступним.\nЧи правильно написана адреса? error.invalidaddress = Некоректна адреса. -error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна і що власник сервера налаштував переадресацію порту! +error.timedout = Час очікування вийшов!\nПереконайтеся, що адреса коректна й що власник сервера налаштував переадресацію порту! error.mismatch = Помилка пакету:\nможлива невідповідність версії клієнта/сервера.\nПереконайтеся, що у вас та у власника сервера встановлена остання версія Mindustry! error.alreadyconnected = Ви вже під’єдналися. error.mapnotfound = Файл мапи не знайдено! @@ -496,6 +508,20 @@ error.io = Мережева помилка введення-виведення. error.any = Невідома мережева помилка error.bloom = Не вдалося ініціалізувати світіння.\nВаш пристрій, мабуть, не підтримує це. +weather.rain.name = Дощ +weather.snow.name = Сніг +weather.sandstorm.name = Піщана буря +weather.sporestorm.name = Спорова буря + +sectors.unexplored = [lightgray]Не досліджено +sectors.resources = Ресурси: +sectors.production = Виробництво: +sectors.stored = Зберігає: +sectors.resume = Продовжити +sectors.launch = Запуск +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Відправний пункт sector.craters.name = Кратери sector.frozenForest.name = Крижаний ліс @@ -515,10 +541,10 @@ sector.craters.description = У цьому кратері накопичилас sector.ruinousShores.description = Саме берегова лінія є минулим цих відходів. Колись у цьому місці розташувався береговий оборонний масив. Проте залишилося не так багато чого. Тільки основні оборонні споруди залишилися неушкодженими, а все інше перетворилося на брухт.\nПродовжуйте експансію назовні. Повторно розкрийте технології. sector.stainedMountains.description = Якщо йти далі у вглиб материка, то можна побачити гори, які ще не заражені спорами.\nВидобудьте надлишковий титан у цій місцевості. Дізнайтеся, як використовувати його.\n\nНа жаль, тут більше противників ніж в інших місцевостях. Не дайте їм часу надіслати свої найсильніші одиниці. sector.overgrowth.description = Ближче до джерела спор є територія, що заросла.\nНе дивуйтеся, що противник встановив тут свій форпост. Побудуйте бойові одиниці під кодовою назвою «Титан». Зруйнуйте її. Поверніть те, що колись належало нам. -sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один з небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти. +sector.tarFields.description = Між горами та пустелею простягається окраїна зони видобутку нафти. Це один із небагатьох районів із корисними для використання запасами смоли.\nНе зважаючи на те, що територія покинута, вона має поблизу небезпечні сили противника. Не варто їх недооцінювати.\n\n[lightgray]Якщо можливо, дослідіть технологію перероблювання нафти. sector.desolateRift.description = Надзвичайно небезпечна зона. Багато ресурсів, але мало місця. Високий ризик знищення. Евакуюватися потрібно якомога швидше. Не розслабляйтеся між ворожими атаками та знайдіть ахіллесову п’яту супротивника. sector.nuclearComplex.description = Колишній об’єкт для виробництва та перероблювання торію було зведено до руїн.\n[lightgray]Дослідіть торій та його нескінченну кількість застосувань.\n\n Противник, який постійно шукає нападників, присутній тут у великій кількості, тому не баріться з евакуацією. - +sector.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. settings.language = Мова settings.data = Ігрові дані @@ -531,7 +557,9 @@ settings.sound = Звук settings.graphics = Графіка settings.cleardata = Очистити дані… settings.clear.confirm = Ви дійсно хочете очистити ці дані?\nЦю дію не можна скасувати! -settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включаючи збереження, мапи, розблоковане та налаштування керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється. +settings.clearall.confirm = [scarlet]УВАГА![]\nЦе очистить усі дані, включно із збереженнями, мапами, розблокованим та налаштуваннями керування.\nПісля натискання «Гаразд» гра видалить усі дані та автоматично закриється. +settings.clearsaves.confirm = Ви справді хочете видалити всі ваші збереження? +settings.clearsaves = Очистити збереження paused = [accent]< Пауза> clear = Очистити banned = [scarlet]Заблоковано @@ -557,8 +585,11 @@ blocks.itemsmoved = Швидкість переміщення blocks.launchtime = Час між запусками blocks.shootrange = Радіус дії blocks.size = Розмір +blocks.displaysize = Розмір дисплею blocks.liquidcapacity = Рідинна місткість -blocks.powerrange = Діапазон передачі енергії +blocks.powerrange = Радіус передачі енергії +blocks.linkrange = Радіус з’єднання +blocks.instructions = Інструкції blocks.powerconnections = Максимальна кількість з’єднань blocks.poweruse = Енергії використовує blocks.powerdamage = Енергії за од. шкоди @@ -574,14 +605,17 @@ blocks.boosteffect = Прискорювальний ефект blocks.maxunits = Максимальна кількість активних одиниць blocks.health = Здоров’я blocks.buildtime = Час будування +blocks.maxconsecutive = Максимальна послідовність blocks.buildcost = Вартість будування blocks.inaccuracy = Розкид blocks.shots = Постріли blocks.reload = Постріли/секунду blocks.ammo = Боєприпаси +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = Потребується кращий бур -bar.noresources = Відсутні ресурси +bar.noresources = Бракує ресурсів bar.corereq = Необхідне основне ядро bar.drillspeed = Швидкість буріння: {0} за с. bar.pumpspeed = Швидкість викачування: {0} за с. @@ -621,9 +655,12 @@ unit.liquidunits = одиниць рідини unit.powerunits = одиниць енергії unit.degrees = град. unit.seconds = с +unit.minutes = хв unit.persecond = за секунду +unit.perminute = за хвилину unit.timesspeed = x швидкість unit.percent = % +unit.shieldhealth = shield health unit.items = предм. unit.thousands = тис unit.millions = млн @@ -637,7 +674,7 @@ category.shooting = Стрільба category.optional = Додаткові поліпшення setting.landscape.name = Тільки альбомний (горизонтальний) режим setting.shadows.name = Тіні -setting.blockreplace.name = Пропозиції щодо автоматичної заміни блоків +setting.blockreplace.name = Пропонування щодо автоматичної заміни блоків setting.linear.name = Лінійна фільтрація setting.hints.name = Підказки setting.flow.name = Показувати темп швидкості ресурсів @@ -648,7 +685,7 @@ setting.animatedshields.name = Анімаційні щити setting.antialias.name = Згладжування[lightgray] (потребує перезапуску)[] setting.playerindicators.name = Позначки гравців setting.indicators.name = Позначки противників -setting.autotarget.name = Авто-стрільба +setting.autotarget.name = Автострільба setting.keyboard.name = Миш+Керування з клавіатури setting.touchscreen.name = Керування сенсорним екраном setting.fpscap.name = Максимальний FPS @@ -680,11 +717,11 @@ setting.blockselectkeys.name = Показувати клавіші вибору setting.vsync.name = Вертикальна синхронізація setting.pixelate.name = Пікселізація setting.minimap.name = Показувати мінімапу -setting.coreitems.name = Показувати предмети в ядрі (в роботі) +setting.coreitems.name = Показувати предмети в ядрі (дороблюється) setting.position.name = Показувати координати гравця setting.musicvol.name = Гучність музики setting.atmosphere.name = Показувати планетарну атмосферу -setting.ambientvol.name = Звуки навколишнього середовища +setting.ambientvol.name = Звуки довкілля setting.mutemusic.name = Заглушити музику setting.sfxvol.name = Гучність звукових ефектів setting.mutesound.name = Заглушити звук @@ -696,7 +733,7 @@ setting.chatopacity.name = Непрозорість чату setting.lasersopacity.name = Непрозорість лазерів енергопостачання setting.bridgeopacity.name = Непрозорість мостів setting.playerchat.name = Показувати хмару чата над гравцями -public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити у Налаштування->Гра->Загальнодоступність гри. +public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[accent]Будь-хто може приєднатися до вашої гри.\n[lightgray]Це можна змінити в Налаштування->Гра->Загальнодоступність гри. public.beta = Зауважте, що в бета-версії гри ви не можете робити публічні ігри. uiscale.reset = Масштаб користувацького інтерфейсу було змінено.\nНатисніть «Гаразд» для підтвердження цього масштабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] секунд… uiscale.cancel = Скасувати & Вийти @@ -710,6 +747,7 @@ category.blocks.name = Вибір блока command.attack = Атака command.rally = Точка збору command.retreat = Відступити +command.idle = Бездіяти placement.blockselectkeys = \n[lightgray]Ключ: [{0}, keybind.respawn.name = Відродження keybind.control.name = Контролювання одиниці @@ -721,7 +759,8 @@ keybind.toggle_power_lines.name = Показувати лазери енерго keybind.toggle_block_status.name = Показувати стан блоків keybind.move_x.name = Рух по осі X keybind.move_y.name = Рух по осі Y -keybind.mouse_move.name = Слідкувати за мишею +keybind.mouse_move.name = Рухатися за мишею +keybind.pan.name = Політ камери за мишею keybind.boost.name = Прискорення keybind.schematic_select.name = Вибрати ділянку keybind.schematic_menu.name = Меню схем @@ -749,12 +788,15 @@ keybind.diagonal_placement.name = Діагональне розміщення keybind.pick.name = Вибрати блок keybind.break_block.name = Зламати блок keybind.deselect.name = Скасувати +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = Постріл keybind.zoom.name = Наблизити keybind.menu.name = Меню keybind.pause.name = Пауза keybind.pause_building.name = Призупинити/Продовжити будування -keybind.minimap.name = Міні-мапа +keybind.minimap.name = Мінімапа keybind.chat.name = Чат keybind.player_list.name = Список гравців keybind.console.name = Консоль @@ -765,10 +807,10 @@ keybind.chat_history_prev.name = Попередня історія чату keybind.chat_history_next.name = Наступна історія чату keybind.chat_scroll.name = Прокрутка чату keybind.drop_unit.name = Скинути бойову одиницю -keybind.zoom_minimap.name = Збільшити міні-мапу +keybind.zoom_minimap.name = Збільшити мінімапу mode.help.title = Опис режимів гри mode.survival.name = Виживання -mode.survival.description = Звичайний режим. В цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри. +mode.survival.description = Звичайний режим. У цьому режимі треба самим видобувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи противників для гри. mode.sandbox.name = Пісочниця mode.sandbox.description = Нескінченні ресурси та хвилі йдуть за вашим бажанням. mode.editor.name = Редактор @@ -783,29 +825,34 @@ rules.reactorexplosions = Вибухи реактора rules.wavetimer = Таймер для хвиль rules.waves = Хвилі rules.attack = Режим атаки +rules.buildai = Будування ШІ rules.enemyCheat = Нескінченні ресурси для червоної команди ШІ rules.blockhealthmultiplier = Множник здоров’я блоків rules.blockdamagemultiplier = Множник шкоди блоків rules.unitbuildspeedmultiplier = Множник швидкості виробництва бойових одиниць rules.unithealthmultiplier = Множник здоров’я бойових одиниць rules.unitdamagemultiplier = Множник шкоди бойових одиниць -rules.enemycorebuildradius = Радіус захисту для ворожого ядра:[lightgray] (плитки) +rules.enemycorebuildradius = Радіус оборони для ворожого ядра:[lightgray] (плитки) rules.wavespacing = Інтервал хвиль:[lightgray] (секунди) rules.buildcostmultiplier = Множник затрат на будування rules.buildspeedmultiplier = Множник швидкості будування -rules.deconstructrefundmultiplier = Множник відшкодування при демонтажі +rules.deconstructrefundmultiplier = Множник відшкодування у разі демонтажу rules.waitForWaveToEnd = Хвилі чекають на завершення попередньої rules.dropzoneradius = Радіус зони висадки:[lightgray] (у плитках) rules.unitammo = Бойові одиниці потребують боєприпасів rules.title.waves = Хвилі -rules.title.resourcesbuilding = Ресурси & будування +rules.title.resourcesbuilding = Ресурси й будування rules.title.enemy = Противники rules.title.unit = Бойові одиниці rules.title.experimental = Експериментальне rules.title.environment = Середовище rules.lighting = Світлотінь +rules.fire = Вогонь +rules.explosions = Шкода від вибухів блоків і одиниць rules.ambientlight = Навколишнє світло -rules.solarpowermultiplier = Множник сонячної енергії +rules.weather = Погода +rules.weather.frequency = Повторюваність: +rules.weather.duration = Тривалість: content.item.name = Предмети content.liquid.name = Рідини @@ -831,9 +878,11 @@ liquid.water.name = Вода liquid.slag.name = Шлак liquid.oil.name = Нафта liquid.cryofluid.name = Кріогенна рідина + item.explosiveness = [lightgray]Вибухонебезпечність: {0} % item.flammability = [lightgray]Вогненебезпечність: {0} % item.radioactivity = [lightgray]Радіоактивність: {0} % + unit.health = [lightgray]Здоров’я: {0} unit.speed = [lightgray]Швидкість: {0} unit.weapon = [lightgray]Зброя: {0} @@ -842,6 +891,7 @@ unit.minespeed = [lightgray]Швидкість видобутку: {0} % unit.minepower = [lightgray]Потужність видобутку: {0} unit.ability = [lightgray]Здібність: {0} unit.buildspeed = [lightgray]Швидкість будування: {0} % + liquid.heatcapacity = [lightgray]Теплоємність: {0} liquid.viscosity = [lightgray]В’язкість: {0} liquid.temperature = [lightgray]Температура: {0} @@ -852,11 +902,12 @@ unit.fortress.name = Фортеця unit.nova.name = Нова unit.pulsar.name = Пульсар unit.quasar.name = Квазар -unit.crawler.name = Камікадзе +unit.crawler.name = Плазун unit.atrax.name = Атракс unit.spiroct.name = Павучник unit.arkyid.name = Аркиїд -unit.flare.name = Фальшфейєр +unit.toxopid.name = Отруйник +unit.flare.name = Фальшфеєр unit.horizon.name = Горизонт unit.zenith.name = Зеніт unit.antumbra.name = Тіньовик @@ -864,34 +915,43 @@ unit.eclipse.name = Затьмарник unit.mono.name = Єдинак unit.poly.name = Багацько unit.mega.name = Мега +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Грампус unit.minke.name = Смугач малий unit.bryde.name = Смугач Брайда +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Альфа unit.beta.name = Бета unit.gamma.name = Гамма +unit.scepter.name = Верховна влада +unit.reign.name = Верховний Порядок +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Пункт постачання block.parallax.name = Паралакс block.cliff.name = Скеля block.sand-boulder.name = Пісочний валун block.grass.name = Трава block.slag.name = Шлак block.salt.name = Сіль -block.saltrocks.name = Соляні камені +block.salt-wall.name = Соляна стіна block.pebbles.name = Галька block.tendrils.name = Щупальця -block.sandrocks.name = Піщані скелі +block.sand-wall.name = Піскова стіна block.spore-pine.name = Спорова сосна -block.sporerocks.name = Спорові камені -block.rock.name = Камінь -block.snowrock.name = Сніжний камінь +block.spore-wall.name = Спорова стіна +block.boulder.name = Брила +block.snow-boulder.name = Снігова брила block.snow-pine.name = Сніжні сосни block.shale.name = Сланець block.shale-boulder.name = Сланцевий валун block.moss.name = Мох block.shrubs.name = Кущі block.spore-moss.name = Споровий мох -block.shalerocks.name = Сланцеві породи +block.shale-wall.name = Сланцева стіна block.scrap-wall.name = Стіна з брухту block.scrap-wall-large.name = Велика стіна з брухту block.scrap-wall-huge.name = Величезна стіна з брухту @@ -916,16 +976,20 @@ block.darksand.name = Темний пісок block.ice.name = Лід block.snow.name = Сніг block.craters.name = Кратери -block.sand-water.name = Пісок з водою -block.darksand-water.name = Темний пісок з водою +block.sand-water.name = Пісок із водою +block.darksand-water.name = Темний пісок із водою block.char.name = Випалена земля -block.holostone.name = Голографічний камінь +block.dacite.name = Дацит +block.dacite-wall.name = Дацитова стіна block.ice-snow.name = Крижаний сніг -block.rocks.name = Камені -block.icerocks.name = Крижані камені -block.snowrocks.name = Снігові камені -block.dunerocks.name = Піщані камені +block.stone-wall.name = Кам’яна стіна +block.ice-wall.name = Крижана стіна +block.snow-wall.name = Снігова стіна +block.dune-wall.name = Дюнова стіна block.pine.name = Сосна +block.dirt.name = Ґрунт +block.dirt-wall.name = Ґрунтова стіна +block.mud.name = Mud block.white-tree-dead.name = Мертве біле дерево block.white-tree.name = Біле дерево block.spore-cluster.name = Скупчення спор @@ -941,10 +1005,9 @@ block.dark-panel-4.name = Темна панель 4 block.dark-panel-5.name = Темна панель 5 block.dark-panel-6.name = Темна панель 6 block.dark-metal.name = Темний метал -block.ignarock.name = Магматичні гірські породи +block.basalt.name = Базальт block.hotrock.name = Гарячий камінь block.magmarock.name = Магмовий камінь -block.cliffs.name = Скелі block.copper-wall.name = Мідна стіна block.copper-wall-large.name = Велика мідна стіна block.titanium-wall.name = Титанова стіна @@ -966,7 +1029,7 @@ block.conveyor.name = Конвеєр block.titanium-conveyor.name = Титановий конвеєр block.plastanium-conveyor.name = Пластанієвий конвеєр block.armored-conveyor.name = Броньований конвеєр -block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що і титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. +block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, що й титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрних стрічок. block.junction.name = Перехрестя block.router.name = Маршрутизатор block.distributor.name = Розподілювач @@ -993,7 +1056,7 @@ block.diode.name = Діод block.battery.name = Акумулятор block.battery-large.name = Великий акумулятор block.combustion-generator.name = Генератор згорання -block.turbine-generator.name = Паровий генератор +block.steam-generator.name = Паровий генератор block.differential-generator.name = Диференційний генератор block.impact-reactor.name = Імпульсний реактор block.mechanical-drill.name = Механічний бур @@ -1055,18 +1118,28 @@ block.container.name = Сховище block.launch-pad.name = Стартовий майданчик block.launch-pad-large.name = Великий стартовий майданчик block.segment.name = Сегмент +block.command-center.name = Командний центр block.ground-factory.name = Наземний завод block.air-factory.name = Повітряний завод block.naval-factory.name = Морський завод block.additive-reconstructor.name = Додавальний реконструктор block.multiplicative-reconstructor.name = Примножувальний реконструктор block.exponential-reconstructor.name = Експоненційний реконструктор -block.tetrative-reconstructor.name = Тетративний реконструктор +block.tetrative-reconstructor.name = Тетративний реконструктор block.payload-conveyor.name = Вантажний конвеєр block.payload-router.name = Розвантажувальний маршрутизатор block.disassembler.name = Розбирач block.silicon-crucible.name = Кремнієвий тигель -block.large-overdrive-projector.name = Великий прискорювач +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Перемикач +block.micro-processor.name = Мікропроцесор +block.logic-processor.name = Логічний процесор +block.hyper-processor.name = Гіперпроцесор +block.logic-display.name = Логічний дисплей +block.large-logic-display.name = Великий логічний дисплей +block.memory-cell.name = Комірка пам’яті + team.blue.name = Синя team.crux.name = Червона team.sharded.name = Помаранчева @@ -1076,39 +1149,39 @@ team.green.name = Зелена team.purple.name = Фіолетова tutorial.next = [lightgray]<Натисніть для продовження> -tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nВикористовуйте[accent] [[WASD][] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоб розпочати видобуток.\n\n[accent]{0}/{1} міді -tutorial.intro.mobile = Ви розпочали[scarlet] навчання по Mindustry.[]\nПроведіть по екрану для руху.\n[accent] Зведіть або розведіть 2 пальця[] для приближення і віддалення відповідно.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоб розпочати видобуток.\n\n[accent]{0}/{1} міді -tutorial.drill = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\n\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснувши [accent][[1][], незалежно від відкритої вкладки.\n[accent]Натисніть ПКМ[], щоб зупинити будування. -tutorial.drill.mobile = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\nВиберіть[accent] механічний бур[].\nРозмістіть його на мідній жилі натисканням, потім натисніть на [accent]галочку[] нижче, щоб підтвердити розміщення.\nНатисніть [accent]кнопку X[], щоб скасувати розміщення. +tutorial.intro = Ви розпочали[scarlet] навчання з Mindustry.[]\nВикористовуйте[accent] [[WASD][] для руху.\n[accent]Прокручуйте миш[] для приближення і віддалення.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді +tutorial.intro.mobile = Ви розпочали[scarlet] навчання з Mindustry.[]\nПроведіть по екрану для руху.\n[accent] Зведіть або розведіть 2 пальця[] для приближення і віддалення відповідно.\nРозпочніть з [accent]видобування міді[]. Наблизьтесь до мідної жили біля вашого ядра, а потім натисніть на неї, щоби розпочати видобуток.\n\n[accent]{0}/{1} міді +tutorial.drill = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\n\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\nВи також можете вибрати бур, натиснувши [accent][[2][], а потім швидко натиснувши [accent][[1][], незалежно від розгорнутої вкладки.\n[accent]Натисніть ПКМ[], щоби зупинити будування. +tutorial.drill.mobile = Добування вручну не є ефективним.\n[accent]Бури[] можуть видобувати автоматично.\nНатисніть на вкладку із зображенням свердла праворуч знизу.\nВиберіть[accent] механічний бур[].\nРозмістіть його на мідній жилі натисканням, потім натисніть на [accent]галочку[] нижче, щоби підтвердити розміщення.\nНатисніть [accent]кнопку X[], щоби скасувати розміщення. tutorial.blockinfo = Кожний блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисніть на кнопку «?», коли ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура негайно.[] -tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш для розміщення у лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро. -tutorial.conveyor.mobile = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви обрали.\n\n[accent]Розмістіть 2 конвеєри у лінію, а потім доставте предмет в ядро. -tutorial.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються у будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди повинні бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази. -tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоб заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1 +tutorial.conveyor = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent]Утримуйте миш для розміщення в лінію.[]\nУтримуйте[accent] CTRL[] під час вибору лінії для розміщення по діагоналі.\nПрокручуйте, щоб обертати блоки до їх установлення.\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро. +tutorial.conveyor.mobile = [accent]Конвеєри[] використовуються для транспортування предметів до ядра.\nПобудуйте лінію конвеєрів від бура до ядра.\n[accent] Розмістить у лінію, утримуючи палець кілька секунд[] і тягніть у напрямку, який Ви обрали.\n\n[accent]Розмістіть 2 конвеєри в лінію, а потім доставте предмет у ядро. +tutorial.turret = Щойно предмет потрапить до ядра, він може бути використаний у будівництві.\nМайте на увазі, не всі предмети придатні для будівництва.\nПредмети що не використовуються в будівництві, такі як[accent] вугілля[] чи[accent] брухт[], не можуть потрапити до ядра.\nОборонні споруди мають бути побудовані для відбиття[lightgray] противників[].\nПобудуйте[accent] башту «Подвійна»[] біля вашої бази. +tutorial.drillturret = «Подвійна» потребує [accent]мідні боєприпаси[] для стрільби.\nРозмістіть бур біля башти.\nПроведіть конвеєри до башти, щоби заповнити її боєприпасами.\n\n [accent]Доставлено боєприпасів: 0/1 tutorial.pause = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n [accent]Натисніть пробіл для паузи. tutorial.pause.mobile = Під час гри ви можете[accent] поставити на паузу.[]\nВи можете зробити чергу на будування під час паузи.\n\n[accent]Натисніть кнопку вгорі ліворуч для паузи. tutorial.unpause = Призупиніть гру, натиснувши на пробіл. -tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоб зняти паузу. -tutorial.breaking = Блоки часто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення у зоні. -tutorial.breaking.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоб зламати його.\nЗнищте область, утримуючи палець протягом декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоб підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення у зоні. +tutorial.unpause.mobile = Тепер натисніть туди ще раз, щоби зняти паузу. +tutorial.breaking = Блоки часто треба знищувати.\n[accent]Утримуючи ПКМ[] ви знищите всі виділені блоки.[]\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні. +tutorial.breaking.mobile = Блоки часто треба знищувати.\n[accent]Виберіть режим руйнування[], потім натисніть на блок, щоби зламати його.\nВидаліть ділянку, утримуючи палець упродовж декількох секунд [] і потягнувши в потрібному напрямку.\nНатисніть кнопку галочки, щоби підтвердити руйнування.\n\n[accent]Необхідно знищити всі стіни з брухту ліворуч від вашого ядра використовуючи видалення в зоні. tutorial.withdraw = У деяких ситуаціях потрібно брати предмети безпосередньо з блоків.\nЩоб зробити це, [accent]натисніть на блок[] з предметами, і потім [accent]натисніть на предмет[] в інвентарі.\nМожна вилучити кілька предметів [accent]натискаючи та утримуючи[].\n\n [accent]Вилучіть трохи міді з ядра.[] tutorial.deposit = Покладіть предмети в блок, перетягнувши з вашого корабля в потрібний блок.\n\n[accent]Покладіть мідь назад у ядро.[] -tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль.[accent] Натисніть ЛКМ[], щоб стріляти.\nПобудуйте більше башт і бурів. Добудьте більше міді. +tutorial.waves = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль.[accent] Натисніть ЛКМ[], щоби стріляти.\nПобудуйте більше башт і бурів. Добудьте більше міді. tutorial.waves.mobile = [lightgray]Противник[] з’явився.\n\nЗахистіть ядро від двох хвиль. Ваш корабель буде автоматично атакувати противників.\nПобудуйте більше башт і бурів. Добудьте більше міді. tutorial.launch = Як тільки ви досягнете певної хвилі, ви зможете[accent] запустити ядро[], залишивши свою базу позаду, та [accent]отримати всі ресурси у вашому ядрі.[]\nЦі отримані ресурси можуть бути використані для дослідження нових технологій.\n\n[accent]Натисніть кнопку запуску. item.copper.description = Початковий будівельний матеріал. Широко використовується у всіх типах блоків. -item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та у транспортуванні рідин. +item.lead.description = Основний початковий матеріал. Широко застосовується в електроніці та в транспортуванні рідин. item.metaglass.description = Дуже жорсткий склад скла. Широко застосовується для розподілу та зберігання рідини. item.graphite.description = Мінералізований вуглець, що використовується для боєприпасів та як електричний компонент. -item.sand.description = Поширений матеріал, який широко використовується при виплавці, як при сплавленні, так і в якості відходів. +item.sand.description = Поширений матеріал, який широко використовується у виплавці, як під час сплавлення, так і в якості відходів. item.coal.description = Скам’янілі рослинні речовини, що утворилися задовго до посіву. Широко використовується для виробництва пального та ресурсів. item.titanium.description = Рідкісний надлегкий метал, який широко використовується для транспортування рідини, бурів і літаків. item.thorium.description = Щільний радіоактивний метал, що використовується в якості конструкційної опори та ядерного палива. item.scrap.description = Залишки старих споруд та підрозділів. Містить мікроелементи багатьох різних металів. item.silicon.description = Надзвичайно корисний напівпровідник. Має застосування в сонячних батареях, складній електроніці та боєприпасах для башт. item.plastanium.description = Легкий пластичний матеріал, що використовується в сучасних літальних апаратах та у фрагментованих боєприпасах. -item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та у технології самовідновлення. +item.phase-fabric.description = Майже невагома речовина, що застосовується в передовій електроніці та в технології самовідновлення. item.surge-alloy.description = Удосконалений сплав з унікальними електричними властивостями. item.spore-pod.description = Струмок синтетичних спор, синтезований з атмосферних концентрацій для промислових цілей. Використовується для перетворення на нафту, вибухівку та паливо. item.blast-compound.description = Нестабільна сполука, яка використовується в бомбах і вибухівках. Синтезується зі спорових стручків та інших летких речовин. Використовувати як паливо не рекомендується. @@ -1116,24 +1189,24 @@ item.pyratite.description = Надзвичайно легкозаймиста р liquid.water.description = Найкорисніша рідина. Зазвичай використовується для охолодження машин та перероблювання відходів. liquid.slag.description = Різні види розплавленого металу змішуються між собою. Може бути відокремлений від складових корисних копалин або розпорошений на ворожі частини як зброя. liquid.oil.description = Рідина, яка використовується у виробництві сучасних матеріалів. Може бути перетворена у вугілля в якості палива або використана як куля. -liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Володіє надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує. +liquid.cryofluid.description = Інертна рідина, що створена з води та титану. Має здатність надзвичайно високою пропускною спроможністю. Широко використовується в якості рідини, що охолоджує. block.message.description = Зберігає повідомлення. Використовується для комунікації між союзниками. block.graphite-press.description = Стискає шматки вугілля в чисті аркуші графіту. block.multi-press.description = Модернізована версія графітового преса. Використовує воду та енергію для швидкого та ефективного перероблювання вугілля. -block.silicon-smelter.description = Змішує пісок з чистим вугіллям. Виробляє кремній. +block.silicon-smelter.description = Змішує пісок із чистим вугіллям. Виробляє кремній. block.kiln.description = Виплавляє пісок та свинець у сполуку, відому як метаскло. Для запуску потрібна невелика кількість енергії. -block.plastanium-compressor.description = Виробляє пластаній з нафти та титану. +block.plastanium-compressor.description = Виробляє пластаній із нафти та титану. block.phase-weaver.description = Синтезує фазову тканину з радіоактивного торію та піску. Для роботи потрібна велика кількість енергії. block.alloy-smelter.description = Поєднує титан, свинець, кремній і мідь для отримання кінетичного сплаву. -block.cryofluidmixer.description = Змішує воду і дрібний порошок титану в кріогенну рідину. Основне використання у торієвому реактору. -block.blast-mixer.description = Подрібнює і змішує скупчення спор з піротитом для отримання вибухової суміші. +block.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 +1214,30 @@ block.item-source.description = Постійно створює предмети block.item-void.description = Знищує будь-які предмети. Тільки пісочниця. block.liquid-source.description = Постійно створює рідини. Тільки пісочниця. block.liquid-void.description = Видаляє будь-які рідини. Тільки пісочниця. -block.copper-wall.description = Дешевий захисний блок.\nКорисний для захисту ядра та башт у перші кілька хвиль. -block.copper-wall-large.description = Дешевий захисний блок.\nКорисний для захисту ядра та башт у перші кілька хвиль.\nЗаймає декілька плиток. -block.titanium-wall.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від противників. -block.titanium-wall-large.description = Відносно сильний захисний блок.\nЗабезпечує помірний захист від противників.\nЗаймає декілька плиток. -block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів. -block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги й блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток. -block.thorium-wall.description = Сильний захисний блок.\nГідний захист від противників. -block.thorium-wall-large.description = Сильний захисний блок.\nГідний захист від противників.\nЗаймає декілька плиток. -block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі. -block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Відхиляє більшість куль при ударі.\nЗаймає декілька плиток. -block.surge-wall.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином. -block.surge-wall-large.description = Надзвичайно міцний захисний блок.\nЗбільшує заряд при контакті з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток. -block.door.description = Невеликі двері. Можна відкрити або закрити, натиснувши. -block.door-large.description = Великі двері. Можна відкрити та закрити, натиснувши.\nЗаймає декілька плиток. -block.mender.description = Періодично ремонтує блоки у його радіусі дії. Захищає башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності. -block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки у його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. +block.copper-wall.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль. +block.copper-wall-large.description = Дешевий оборонний блок.\nКорисний для оборони ядра та башт у перші кілька хвиль.\nЗаймає декілька плиток. +block.titanium-wall.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників. +block.titanium-wall-large.description = Порівняно сильний оборонний блок.\nЗабезпечує помірний оборони від противників.\nЗаймає декілька плиток. +block.plastanium-wall.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів. +block.plastanium-wall-large.description = Особливий тип стіни, який поглинає електричні дуги і блокує автоматичні з’єднання енергетичних вузлів.\nЗаймає декілька плиток. +block.thorium-wall.description = Сильний оборонний блок.\nГарна оборона від противників. +block.thorium-wall-large.description = Сильний оборонний блок.\nГарна оборона від противників.\nЗаймає декілька плиток. +block.phase-wall.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару. +block.phase-wall-large.description = Стіна має покриття спеціальним складом, що відбиває світло і який базується на фазовій тканині. Здебільшого відбиває кулі у разі удару.\nЗаймає декілька плиток. +block.surge-wall.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином. +block.surge-wall-large.description = Надзвичайно міцний оборонний блок.\nЗбільшує заряд, якщо контактуватиме з кулями, вивільняючи його випадковим чином.\nЗаймає декілька плиток. +block.door.description = Невеликі двері. Можна відчинити або зачинити, натиснувши на них. +block.door-large.description = Великі двері. Можна відчинити та зачинити, натиснувши на них.\nЗаймає декілька плиток. +block.mender.description = Періодично ремонтує блоки в його радіусі дії. Боронить башти та стіни.\nЗа бажанням, можна використати кремній для підвищення дальності та ефективності. +block.mend-projector.description = Покращена версія «Регенератора». Періодично ремонтує блоки в його радіусі дії.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. block.overdrive-projector.description = Збільшує швидкість найближчих будівель.\nЗа бажанням, можна використати фазову тканину для підвищення дальності та ефективності. -block.force-projector.description = Створює навколо себе шестикутне силове поле, захищаючи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину. +block.force-projector.description = Створює навколо себе шестикутне силове поле, боронячи будівлі та блоки всередині від пошкоджень.\nПерегрівається, якщо завдано занадто великої шкоди. За бажанням, можна використати теплоносій для запобігання перегріву. Для збільшення розміру щита можна використовувати фазову тканину. block.shock-mine.description = Наносить шкоду противникам, коли вони наступають на міну. Майже невидима для противника. block.conveyor.description = Базовий транспортний блок. Переміщує елементи вперед і автоматично перетворює їх у блоки. Можна обертати. block.titanium-conveyor.description = Покращений блок транспорту елементів. Переміщує предмети швидше, ніж звичайні конвеєри. -block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду. +block.plastanium-conveyor.description = Переміщує предмети партіями.\nПриймає елементи на задній частині та вивантажує їх у трьох напрямках спереду.\nПотребує кілька точок завантаження та розвантаження для максимальної пропускної здатності. block.junction.description = Діє як міст для двох перехресних конвеєрних стрічок. Корисно в ситуаціях, коли два різних конвеєри перевозять різні матеріали в різні місця. -block.bridge-conveyor.description = Покращений блок транспорту елементів. Дозволяє транспортувати предмети до 3-ох плиток з будь-якої місцевості чи будівлі. +block.bridge-conveyor.description = Покращений блок транспорту елементів. Дає змогу транспортувати предмети до 3-ох плиток із будь-якої місцевості чи будівлі. block.phase-conveyor.description = Покращений блок транспорту елементів. Використовує енергію для телепортування елементів на під’єднаний фазовий конвеєр через кілька плиток. block.sorter.description = Сортує предмети. Якщо елемент відповідає вибраному, його можна передати. В іншому випадку елемент виводиться зліва та/чи справа. block.inverted-sorter.description = Обробляє елементи, як звичайний сортувальник, але виводить обрані елементи на сторони. @@ -1173,35 +1246,35 @@ block.distributor.description = Поліпшений маршрутизатор. block.overflow-gate.description = Вивантажує лише вліво та/або вправо, якщо передній шлях заблокований. block.underflow-gate.description = Повна протилежність надмірному затвору. Виводить предмет прямо, якщо лівий та/або правий шлях заблоковано. block.mass-driver.description = Найкращий блок для транспортування предметів. Збирає кілька предметів, а потім вистрілює їх до іншої електромагнітної катапульти на велику відстань. Для роботи потребує енергія. -block.mechanical-pump.description = Дешевий насос з повільним виходом, але не потребує енергоспоживання. +block.mechanical-pump.description = Дешевий насос із повільним виходом, але не потребує енергоспоживання. block.rotary-pump.description = Удосконалений насос. Насоси більше викачують, але потребують енергію. block.thermal-pump.description = Найкращий насос. block.conduit.description = Основний блок транспортування рідини. Пересуває рідини вперед. Застосовується спільно з насосами та іншими трубопроводами. -block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує і більше зберігає рідини, ніж стандартні трубопроводи. -block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин з боків окрім інших трубопроводів.\nПротікає менше. +block.pulse-conduit.description = Удосконалений блок транспортування рідини. Швидше транспортує й більше зберігає рідини, ніж стандартні трубопроводи. +block.plated-conduit.description = Переміщує рідини з тією ж швидкістю, що й імпульсні трубопроводи, але має більше міцності. Не приймає рідин із боків окрім інших трубопроводів.\nПротікає менше. block.liquid-router.description = Приймає рідини з одного напрямку та виводить їх до трьох інших напрямків порівну. Також можна зберігати певну кількість рідини. Корисно для розщеплення рідин від одного джерела до кількох мішеней. -block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях з непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків. +block.liquid-tank.description = Зберігає велику кількість рідини. Використовуйте для створення буферів у ситуаціях із непостійним попитом на матеріали або як гарантію охолодження життєво важливих блоків. block.liquid-junction.description = Діє як міст для двох каналів, що перетинаються. Корисно в ситуаціях, коли два різні трубопроводи транспортують різні рідини в різні місця. -block.bridge-conduit.description = Удосконалений блок транспортування рідини. Дозволяє транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі. +block.bridge-conduit.description = Удосконалений блок транспортування рідини. Надає можливість транспортувати рідину до 3 плиток будь-якої місцевості чи будівлі. block.phase-conduit.description = Удосконалений блок транспортування рідини. Використовує енергію для транспортування рідин до приєднаного фазового каналу через декілька плиток. block.power-node.description = Передає живлення на приєднані вузли. Вузол буде отримувати живлення від будь-яких сусідніх блоків або подавати живлення до них. block.power-node-large.description = Поліпшений вузол живлення з більшим радіусом дії. block.surge-tower.description = Вузол живлення з меншою кількістю доступних з’єднань і з найбільшим радіусом дії. block.diode.description = Живлення акумулятора може протікати через цей блок лише в одному напрямку, але лише в тому випадку, якщо інша сторона має менше енергії. -block.battery.description = Зберігає енергію як буфер в часи надлишкової енергії. Виводить енергію у періоди дефіциту. +block.battery.description = Зберігає енергію як буфер у часи надлишкової енергії. Виводить енергію в періоди дефіциту. block.battery-large.description = Зберігає набагато більше енергії, ніж звичайний акумулятор. block.combustion-generator.description = Виробляє енергію, спалюючи легкозаймисті матеріали, такі як вугілля. -block.thermal-generator.description = Генерує енергію при розміщенні в спекотних місцях. -block.turbine-generator.description = Удосконалений генератор згоряння. Більш ефективний, але потребує додаткової води для отримання пари. -block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною і піротитом, що горить. +block.thermal-generator.description = Генерує енергію у разі розміщення в спекотних місцях. +block.steam-generator.description = Удосконалений генератор згоряння. Більш ефективний, але потребує додаткової води для отримання пари. +block.differential-generator.description = Удосконалений генератор згоряння. Використовує різницю температур між кріогенною рідиною й піротитом, що горить. block.rtg-generator.description = Простий і надійний генератор. Використовує тепло радіоактивних сполук, які розкладаються, для отримання енергії з повільною швидкістю. block.solar-panel.description = Забезпечує невелику кількість енергії від сонця. -block.solar-panel-large.description = Значно ефективніша версія стандартної сонячної панелі. +block.solar-panel-large.description = Значно ефективніша ніж стандартна сонячна панель. block.thorium-reactor.description = Виробляє значну кількість енергії з торію. Вимагає постійного охолодження. Сильно вибухне, якщо подаватиметься недостатня кількість теплоносія. Вихідна потужність залежить від заповненості, базова потужність генерується на повній місткості. -block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії при максимальній ефективності. Для запуску процесу потрібно значні обсяги енергії. +block.impact-reactor.description = Удосконалений генератор, здатний створювати величезну кількість енергії за максимальною ефективності. Для запуску процесу потрібно значні обсяги енергії. block.mechanical-drill.description = Недорогий бур. Якщо розмістити на доречних плитках, то виводитиме предмети постійно, але повільно. Придатний лише для базових ресурсів. -block.pneumatic-drill.description = Поліпшений бур, здатний добувати титан. Видобуває швидше, ніж механічний бур. -block.laser-drill.description = Дозволяє виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію. +block.pneumatic-drill.description = Поліпшений бур, здатний видобувати титан. Видобуває швидше, ніж механічний бур. +block.laser-drill.description = Дає змогу виконувати буріння ще швидше за допомогою лазерної технології, але вимагає енергії. Придатний до видобутку торію. block.blast-drill.description = Найкращий бур. Потрібна велика кількість енергії. block.water-extractor.description = Видобуває підземні води. Використовується в місцях, де немає поверхневої води. block.cultivator.description = Культивує невеликі концентрації спор в атмосфері на готові до промисловості стручки. @@ -1212,15 +1285,15 @@ block.core-nucleus.description = Третя й остання версія ка block.vault.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.container.description = Зберігає малу кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів зі сховища. block.unloader.description = Вивантажує предмети з блока, який не переміщує предмети, на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок. -block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик дозволяє вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте у нього ресурси та забезпечте енергією. +block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. Стартовий майданчик надає можливість вам запускати ресурси кожні n секунд без необхідності завершувати гру. Просто подайте в нього ресурси та забезпечте енергією. block.launch-pad-large.description = Поліпшена версія стартового майданчика. Зберігає більше предметів. Запускається частіше. -block.duo.description = Мала і дешева башта. Корисна проти наземних одиниць. -block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла у противників. +block.duo.description = Мала й дешева башта. Корисна проти наземних одиниць. +block.scatter.description = Основна протиповітряна башта. Вистрілює грудочки свинцю, брухту чи метаскла в противників. block.scorch.description = Підпалює будь-яких наземних противників поблизу. Високоефективна на близькій відстані. block.hail.description = Невелика артилерійська башта з далеким радіусом дії. block.wave.description = Башта середнього розміру. Випускає потоками рідини в противників. Автоматично гасить пожежі при постачанні води. block.lancer.description = Лазерна башта середнього розміру, яка атакує наземних противників. Заряджає і вистрілює потужні пучки енергії. -block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики у противників. +block.arc.description = Невелика електрична башта з малим радіусом дії. Стріляє дугами електрики в противників. block.swarmer.description = Ракетна башта середнього розміру. Атакує як повітряних, так і наземних противників. Запускає ракети, які летять у противників самостійно. block.salvo.description = Більш велика, вдосконалена версія башти «Подвійна». Вистрілює швидкий залп куль у противника. block.fuse.description = Велика енергетична башта з малим радіусом дії. Стріляє трьома пронизливими променями на найближчих противників. diff --git a/core/assets/bundles/bundle_zh_CN.properties b/core/assets/bundles/bundle_zh_CN.properties index 13cf2709e2..069bc2ed8e 100644 --- a/core/assets/bundles/bundle_zh_CN.properties +++ b/core/assets/bundles/bundle_zh_CN.properties @@ -20,6 +20,8 @@ gameover = 游戏结束 gameover.pvp = [accent] {0}[]队获胜! highscore = [accent]新纪录! copied = 已复制。 +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = 音乐加载中 load.map = 地图加载中 @@ -63,8 +65,7 @@ stat.delivered = 装运资源: stat.playtime = 游玩时间:[accent] {0} stat.rank = 最终评级:[accent]{0} -launcheditems = [accent]装运的资源 -launchinfo = [unlaunched]发射你的核心后,你将获得用蓝字标识的资源。 +globalitems = [accent]Global Items map.delete = 确定要删除“[accent]{0}[]”地图吗? level.highscore = 最高分:[accent]{0} level.select = 选择关卡 @@ -114,6 +115,7 @@ mod.disable = 禁用 mod.content = 内容: mod.delete.error = 无法删除模组。可能文件被占用。 mod.requiresversion = [scarlet]所需的游戏版本:[accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]缺少前置模组:{0} mod.erroredcontent = [scarlet]内容错误 mod.errors = 读取内容时发生错误. @@ -137,6 +139,8 @@ mod.scripts.disable = 你的设备不支持含有脚本的模组。必须禁用 about.button = 关于 name = 名字: noname = 先取一个[accent]玩家名[]。 +planetmap = Planet Map +launchcore = Launch Core filename = 文件名: unlocked = 解锁了新内容! completed = [accent]己研究 @@ -144,6 +148,7 @@ techtree = 科技树 research.list = [lightgray]研究: research = 研究 researched = [lightgray]{0}己研究。 +research.progress = {0}% complete players = {0} 位玩家在线 players.single = {0} 位玩家在线 players.search = search @@ -340,6 +345,11 @@ waves.load = 从剪贴板读取 waves.invalid = 剪贴板中的波次信息无效。 waves.copied = 波次信息已复制。 waves.none = 没有定义敌人。\n请注意,这将自动替换为默认的敌人列表。 + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]<默认> details = 详情… edit = 编辑… @@ -459,7 +469,8 @@ locked = 已锁定 complete = [lightgray]完成: requirement.wave = {1}中的第{0}波次 requirement.core = 在{0}中摧毁敌方核心 -requirement.unlock = 解锁{0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = 暂停:\n[lightgray]{0} bestwave = [lightgray]最高波次:{0} launch = < 发射 > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = 禁用建筑 addall = 添加所有 +launch.destination = Destination: {0} configure.invalid = 数量必须是0到{0}之间的数字。 zone.unlocked = [lightgray]{0} 已解锁。 zone.requirement.complete = 完成{0}。\n已达成解锁{1}的要求。 @@ -496,6 +508,20 @@ error.io = 网络 I/O 错误。 error.any = 未知网络错误。 error.bloom = 未能初始化特效。\n您的设备可能不支持。 +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = 图像 settings.cleardata = 清除游戏数据… settings.clear.confirm = 您确定要清除此数据?\n此操作无法撤销! settings.clearall.confirm = [scarlet]警告![]\n这将清除所有数据,包括存档、地图、解锁和按键绑定。\n按「是」后,游戏将删除所有数据并自动退出。 +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]< 暂停 > clear = 清除 banned = [scarlet]已禁止 @@ -557,8 +585,11 @@ blocks.itemsmoved = 移动速度 blocks.launchtime = 发射间隔时间 blocks.shootrange = 范围 blocks.size = 尺寸 +blocks.displaysize = Display Size blocks.liquidcapacity = 液体容量 blocks.powerrange = 能量范围 +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = 最多连接 blocks.poweruse = 使用能量 blocks.powerdamage = 功率/损伤 @@ -574,11 +605,14 @@ blocks.boosteffect = 增强效果 blocks.maxunits = 最大单位数量 blocks.health = 生命值 blocks.buildtime = 建造时间 +blocks.maxconsecutive = Max Consecutive blocks.buildcost = 建造花费 blocks.inaccuracy = 误差 blocks.shots = 发射数 blocks.reload = 每秒发射数 blocks.ammo = 弹药 +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = 需要更好的钻头 bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = 液体 unit.powerunits = 能量 unit.degrees = 度 unit.seconds = 秒 +unit.minutes = mins unit.persecond = /秒 +unit.perminute = /min unit.timesspeed = 倍 速度 unit.percent = % +unit.shieldhealth = shield health unit.items = 物品 unit.thousands = k unit.millions = mil +unit.billions = b category.general = 普通 category.power = 能量 category.liquids = 液体 @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = 攻击 command.rally = 集合 command.retreat = 撤退 +command.idle = Idle placement.blockselectkeys = \n[lightgray]按键:[{0}, keybind.respawn.name = 重生 keybind.control.name = Control Unit @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = 显隐方块状态 keybind.move_x.name = 水平移动 keybind.move_y.name = 竖直移动 keybind.mouse_move.name = 跟随鼠标 +keybind.pan.name = Pan View keybind.boost.name = 推送 keybind.schematic_select.name = 选择区域 keybind.schematic_menu.name = 蓝图目录 @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = 斜线建造 keybind.pick.name = 选择建筑 keybind.break_block.name = 破坏建筑 keybind.deselect.name = 取消选择 +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = 射击 keybind.zoom.name = 缩放 keybind.menu.name = 菜单 @@ -782,6 +825,7 @@ rules.reactorexplosions = 反应堆爆炸 rules.wavetimer = 波次计时器 rules.waves = 波次 rules.attack = 攻击模式 +rules.buildai = AI Building rules.enemyCheat = 敌人(红队)无限资源 rules.blockhealthmultiplier = 建筑生命倍数 rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = 单位 rules.title.experimental = 实验性 rules.title.environment = Environment rules.lighting = 光照 +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = 环境光 -rules.solarpowermultiplier = 太阳能发电倍数 +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = 物品 content.liquid.name = 液体 @@ -830,9 +878,11 @@ liquid.water.name = 水 liquid.slag.name = 矿渣 liquid.oil.name = 石油 liquid.cryofluid.name = 冷冻液 + item.explosiveness = [lightgray]爆炸性:{0}% item.flammability = [lightgray]易燃性:{0}% item.radioactivity = [lightgray]放射性:{0}% + unit.health = [lightgray]生命值:{0} unit.speed = [lightgray]速度:{0} unit.weapon = [lightgray]武器{0} @@ -856,6 +906,7 @@ unit.crawler.name = 爬行者 unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = 悬崖 block.sand-boulder.name = 沙砂巨石 block.grass.name = 草地 block.slag.name = 矿渣 block.salt.name = 盐碱地 -block.saltrocks.name = 盐碱岩石 +block.salt-wall.name = Salt Wall block.pebbles.name = 鹅卵石 block.tendrils.name = 卷须 -block.sandrocks.name = 沙岩块 +block.sand-wall.name = Sand Wall block.spore-pine.name = 孢子树 -block.sporerocks.name = 孢子岩石 -block.rock.name = 岩石 -block.snowrock.name = 雪岩石 +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = 雪树 block.shale.name = 页岩地 block.shale-boulder.name = 页岩巨石 block.moss.name = 苔藓地 block.shrubs.name = 灌木丛 block.spore-moss.name = 孢子苔藓地 -block.shalerocks.name = 页岩岩石 +block.shale-wall.name = Shale Wall block.scrap-wall.name = 废墙 block.scrap-wall-large.name = 大型废墙 block.scrap-wall-huge.name = 巨型废墙 @@ -919,13 +979,17 @@ block.craters.name = 陨石坑 block.sand-water.name = 沙 水 block.darksand-water.name = 暗沙 水 block.char.name = 焦土 -block.holostone.name = 霍洛石头 +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = 冰雪地 -block.rocks.name = 岩石 -block.icerocks.name = 冰岩石 -block.snowrocks.name = 雪岩石 -block.dunerocks.name = 沙丘岩石 +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = 松树 +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = 枯萎的白树 block.white-tree.name = 白树 block.spore-cluster.name = 孢子簇 @@ -941,10 +1005,9 @@ block.dark-panel-4.name = 暗面板4 block.dark-panel-5.name = 暗面板5 block.dark-panel-6.name = 暗面板6 block.dark-metal.name = 暗金属 -block.ignarock.name = 伊格纳石头 +block.basalt.name = Basalt block.hotrock.name = 热石头 block.magmarock.name = 岩浆石头 -block.cliffs.name = 悬崖 block.copper-wall.name = 铜墙 block.copper-wall-large.name = 大型铜墙 block.titanium-wall.name = 钛墙 @@ -993,7 +1056,7 @@ block.diode.name = 二极管 block.battery.name = 电池 block.battery-large.name = 大型电池 block.combustion-generator.name = 火力发电机 -block.turbine-generator.name = 涡轮发电机 +block.steam-generator.name = 涡轮发电机 block.differential-generator.name = 温差发电机 block.impact-reactor.name = 冲击反应堆 block.mechanical-drill.name = 机械钻头 @@ -1055,6 +1118,7 @@ block.container.name = 容器 block.launch-pad.name = 发射台 block.launch-pad-large.name = 大型发射台 block.segment.name = 分割机 +block.command-center.name = Command Center block.ground-factory.name = 地面工厂 block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = 蓝 team.crux.name = 红 team.sharded.name = 黄 @@ -1192,7 +1265,7 @@ block.battery.description = 存储能量作为缓冲,在发电量不足时提 block.battery-large.description = 比普通电池容量更大。 block.combustion-generator.description = 燃烧煤等材料发电。 block.thermal-generator.description = 放置在炽热的地形上能够发电。 -block.turbine-generator.description = 先进的火力发电机,效率更高,但需要水来产生蒸汽。 +block.steam-generator.description = 先进的火力发电机,效率更高,但需要水来产生蒸汽。 block.differential-generator.description = 利用低温流体与燃烧的硫之间的温差产生大量能量。 block.rtg-generator.description = 一种简单可靠的发电机。利用放射性化合物的衰变产生的热量,以缓慢的速度产生能量。 block.solar-panel.description = 普通太阳能板,提供少量电力。 diff --git a/core/assets/bundles/bundle_zh_TW.properties b/core/assets/bundles/bundle_zh_TW.properties index ea90067971..ae572fdb39 100644 --- a/core/assets/bundles/bundle_zh_TW.properties +++ b/core/assets/bundles/bundle_zh_TW.properties @@ -20,6 +20,8 @@ gameover = 遊戲結束 gameover.pvp = [accent]{0}[]隊獲勝! highscore = [accent]新的高分紀錄! copied = 已複製。 +indev.popup = [accent]v6[] is currently in [accent]alpha[].\n[lightgray]This means:[]\n[scarlet]- The campaign is completely unfinished[]\n- Content is missing\n - Most [scarlet]Unit AI[] does not work properly\n- Many units are unfinished\n- Everything you see is subject to change or removal.\n\nReport bugs or crashes on [accent]Github[]. +indev.notready = This part of the game isn't ready yet load.sound = 音效載入中 load.map = 地圖載入中 @@ -63,8 +65,7 @@ stat.delivered = 發射的核心資源: stat.playtime = 遊玩時間:[accent] {0} stat.rank = 最終排名:[accent]{0} -launcheditems = [accent]已發射的物品 -launchinfo = [unlaunched][[發射]核心以獲得藍字部分的物品。 +globalitems = [accent]Global Items map.delete = 確認要刪除「[accent]{0}[]」地圖嗎? level.highscore = 最高分:[accent]{0} level.select = 選擇關卡 @@ -114,6 +115,7 @@ mod.disable = 禁用 mod.content = 內容: mod.delete.error = 無法刪除模組,檔案可能在使用中。 mod.requiresversion = [scarlet]最低遊戲版本要求:[accent]{0} +mod.outdated = [scarlet]Not compatible with V6 (no minGameVersion: 105) mod.missingdependencies = [scarlet]缺少必須項目: {0} mod.erroredcontent = [scarlet]內容錯誤 mod.errors = 載入內容時發生錯誤 @@ -137,6 +139,8 @@ mod.scripts.disable = 您的設備不支持包含指令檔的模組。您必須 about.button = 關於 name = 名稱: noname = 請先選擇一個[accent]玩家名稱[]。 +planetmap = Planet Map +launchcore = Launch Core filename = 檔案名稱︰ unlocked = 已解鎖新內容! completed = [accent]完成 @@ -144,6 +148,7 @@ techtree = 科技樹 research.list = [lightgray]研究︰ research = 研究 researched = [lightgray]{0}研究完成。 +research.progress = {0}% complete players = {0}個線上玩家 players.single = {0}個線上玩家 players.search = 搜尋 @@ -340,6 +345,11 @@ waves.load = 從剪貼板加載 waves.invalid = 剪貼板中的波次無效。 waves.copied = 波次已被複製。 waves.none = 無自定義敵人.\n請注意,空佈局將自動替換為預設佈局。 + +wavemode.counts = counts +wavemode.totals = totals +wavemode.health = health + editor.default = [lightgray]〈默認〉 details = 詳情... edit = 編輯... @@ -459,7 +469,8 @@ locked = 鎖定 complete = [lightgray]完成: requirement.wave = 在{1}到達第{0}波 requirement.core = 在{0}摧毀敵人核心 -requirement.unlock = 解鎖{0} +requirement.research = Research {0} +requirement.capture = Capture {0} resume = 繼續區域:\n[lightgray]{0} bestwave = [lightgray]最高波次:{0} launch = < 發射 > @@ -475,6 +486,7 @@ loadout = Loadout resources = Resources bannedblocks = 禁用方塊 addall = 全部加入 +launch.destination = Destination: {0} configure.invalid = 數值必須介於 0 到 {0}。 zone.unlocked = [lightgray]{0}已解鎖。 zone.requirement.complete = 到達波次{0}:\n滿足{1}區域要求。 @@ -496,6 +508,20 @@ error.io = 網絡輸出入錯誤。 error.any = 未知網絡錯誤。 error.bloom = 初始化特效失敗.\n您的設備可能不支援它 +weather.rain.name = Rain +weather.snow.name = Snow +weather.sandstorm.name = Sandstorm +weather.sporestorm.name = Sporestorm + +sectors.unexplored = [lightgray]Unexplored +sectors.resources = Resources: +sectors.production = Production: +sectors.stored = Stored: +sectors.resume = Resume +sectors.launch = Launch +sectors.select = Select +sectors.nonelaunch = [lightgray]none (sun) + sector.groundZero.name = Ground Zero sector.craters.name = The Craters sector.frozenForest.name = Frozen Forest @@ -532,6 +558,8 @@ settings.graphics = 圖形 settings.cleardata = 清除遊戲數據... settings.clear.confirm = 您確定要清除數據嗎?\n此操作無法撤回! settings.clearall.confirm = [scarlet]警告![]\n這將清除所有數據,包括存檔、地圖、解鎖和熱鍵綁定。\n按「是」後,遊戲將刪除所有數據並自動退出。 +settings.clearsaves.confirm = Are you sure you want to clear all your saves? +settings.clearsaves = Clear Saves paused = [accent]〈已暫停〉 clear = 清除 banned = [scarlet]已被封禁 @@ -557,8 +585,11 @@ blocks.itemsmoved = 移動速度 blocks.launchtime = 發射間隔 blocks.shootrange = 範圍 blocks.size = 尺寸 +blocks.displaysize = Display Size blocks.liquidcapacity = 液體容量 blocks.powerrange = 輸出範圍 +blocks.linkrange = Link Range +blocks.instructions = Instructions blocks.powerconnections = 最大連接數 blocks.poweruse = 能量使用 blocks.powerdamage = 能量/傷害 @@ -574,11 +605,14 @@ blocks.boosteffect = 提升效應 blocks.maxunits = 最大活躍單位 blocks.health = 耐久度 blocks.buildtime = 建設時間 +blocks.maxconsecutive = Max Consecutive blocks.buildcost = 建造成本 blocks.inaccuracy = 誤差 blocks.shots = 射擊數 blocks.reload = 射擊次數/秒 blocks.ammo = 彈藥 +blocks.shieldhealth = Shield Health +blocks.cooldowntime = Cooldown Time bar.drilltierreq = 需要更好的鑽頭 bar.noresources = Missing Resources @@ -621,12 +655,16 @@ unit.liquidunits = 液體單位 unit.powerunits = 能量單位 unit.degrees = 度 unit.seconds = 秒 +unit.minutes = mins unit.persecond = /秒 +unit.perminute = /min unit.timesspeed = ×速度 unit.percent = % +unit.shieldhealth = shield health unit.items = 物品 unit.thousands = k unit.millions = mil +unit.billions = b category.general = 一般 category.power = 能量 category.liquids = 液體 @@ -709,6 +747,7 @@ category.blocks.name = Block Select command.attack = 攻擊 command.rally = 集結 command.retreat = 撤退 +command.idle = Idle placement.blockselectkeys = \n[lightgray]按鍵:[{0}, keybind.respawn.name = 重生 keybind.control.name = 控制單位 @@ -721,6 +760,7 @@ keybind.toggle_block_status.name = 開啟方塊狀態顯示 keybind.move_x.name = 水平移動 keybind.move_y.name = 垂直移動 keybind.mouse_move.name = 跟隨滑鼠 +keybind.pan.name = Pan View keybind.boost.name = 噴射 keybind.schematic_select.name = 選擇區域 keybind.schematic_menu.name = 藍圖目錄 @@ -748,6 +788,9 @@ keybind.diagonal_placement.name = 對角線放置 keybind.pick.name = 選擇方塊 keybind.break_block.name = 移除方塊 keybind.deselect.name = 取消選取 +keybind.pickupCargo.name = Pickup Cargo +keybind.dropCargo.name = Drop Cargo +keybind.command.name = Command keybind.shoot.name = 射擊 keybind.zoom.name = 縮放 keybind.menu.name = 主選單 @@ -782,6 +825,7 @@ rules.reactorexplosions = 反應爐爆炸 rules.wavetimer = 波次時間 rules.waves = 波次 rules.attack = 攻擊模式 +rules.buildai = AI Building rules.enemyCheat = 電腦無限資源 rules.blockhealthmultiplier = 建築物耐久度倍數 rules.blockdamagemultiplier = Block Damage Multiplier @@ -803,8 +847,12 @@ rules.title.unit = 單位 rules.title.experimental = 實驗中 rules.title.environment = 環境 rules.lighting = 光照 +rules.fire = Fire +rules.explosions = Block/Unit Explosion Damage rules.ambientlight = 環境光照 -rules.solarpowermultiplier = 太陽能倍數 +rules.weather = Weather +rules.weather.frequency = Frequency: +rules.weather.duration = Duration: content.item.name = 物品 content.liquid.name = 液體 @@ -830,9 +878,11 @@ liquid.water.name = 水 liquid.slag.name = 熔渣 liquid.oil.name = 原油 liquid.cryofluid.name = 冷凍液 + item.explosiveness = [lightgray]爆炸性:{0}% item.flammability = [lightgray]易燃性:{0}% item.radioactivity = [lightgray]放射性:{0}% + unit.health = [lightgray]生命值:{0} unit.speed = [lightgray]速度:{0} unit.weapon = [lightgray]武器: {0} @@ -856,6 +906,7 @@ unit.crawler.name = 爬行機甲 unit.atrax.name = Atrax unit.spiroct.name = Spiroct unit.arkyid.name = Arkyid +unit.toxopid.name = Toxopid unit.flare.name = Flare unit.horizon.name = Horizon unit.zenith.name = Zenith @@ -864,34 +915,43 @@ unit.eclipse.name = Eclipse unit.mono.name = Mono unit.poly.name = Poly unit.mega.name = Mega +unit.quad.name = Quad +unit.oct.name = Oct unit.risso.name = Risso unit.minke.name = Minke unit.bryde.name = Bryde +unit.sei.name = Sei +unit.omura.name = Omura unit.alpha.name = Alpha unit.beta.name = Beta unit.gamma.name = Gamma +unit.scepter.name = Scepter +unit.reign.name = Reign +unit.vela.name = Vela +unit.corvus.name = Corvus +block.resupply-point.name = Resupply Point block.parallax.name = Parallax block.cliff.name = 峭壁 block.sand-boulder.name = 沙礫 block.grass.name = 草 block.slag.name = 熔渣 block.salt.name = 鹽 -block.saltrocks.name = 鹽岩 +block.salt-wall.name = Salt Wall block.pebbles.name = 卵石 block.tendrils.name = 卷鬚 -block.sandrocks.name = 沙岩 +block.sand-wall.name = Sand Wall block.spore-pine.name = 孢子松 -block.sporerocks.name = 孢子岩 -block.rock.name = 岩石 -block.snowrock.name = 雪巖 +block.spore-wall.name = Spore Wall +block.boulder.name = Boulder +block.snow-boulder.name = Snow Boulder block.snow-pine.name = 雪松 block.shale.name = 頁岩 block.shale-boulder.name = 頁岩巨石 block.moss.name = 苔蘚 block.shrubs.name = 灌木 block.spore-moss.name = 孢子苔蘚 -block.shalerocks.name = 頁岩岩石 +block.shale-wall.name = Shale Wall block.scrap-wall.name = 廢牆 block.scrap-wall-large.name = 大型廢牆 block.scrap-wall-huge.name = 巨型廢牆 @@ -919,13 +979,17 @@ block.craters.name = 隕石坑 block.sand-water.name = 沙水 block.darksand-water.name = 黑沙水 block.char.name = 燒焦 -block.holostone.name = 霍洛石頭 +block.dacite.name = Dacite +block.dacite-wall.name = Dacite Wall block.ice-snow.name = 冰雪 -block.rocks.name = 岩石 -block.icerocks.name = 冰岩 -block.snowrocks.name = 雪巖 -block.dunerocks.name = 沙丘岩 +block.stone-wall.name = Stone Wall +block.ice-wall.name = Ice Wall +block.snow-wall.name = Snow Wall +block.dune-wall.name = Dune Wall block.pine.name = 松樹 +block.dirt.name = Dirt +block.dirt-wall.name = Dirt Wall +block.mud.name = Mud block.white-tree-dead.name = 枯萎白樹 block.white-tree.name = 白樹 block.spore-cluster.name = 孢子簇 @@ -941,10 +1005,9 @@ block.dark-panel-4.name = 黑面板 4 block.dark-panel-5.name = 黑面板 5 block.dark-panel-6.name = 黑面板 6 block.dark-metal.name = 黑金屬 -block.ignarock.name = 火成岩 +block.basalt.name = Basalt block.hotrock.name = 熱岩 block.magmarock.name = 岩漿岩 -block.cliffs.name = 懸崖 block.copper-wall.name = 銅牆 block.copper-wall-large.name = 大型銅牆 block.titanium-wall.name = 鈦牆 @@ -993,7 +1056,7 @@ block.diode.name = 二極體 block.battery.name = 電池 block.battery-large.name = 大型電池 block.combustion-generator.name = 燃燒發電機 -block.turbine-generator.name = 渦輪發電機 +block.steam-generator.name = 渦輪發電機 block.differential-generator.name = 差動發電機 block.impact-reactor.name = 衝擊反應堆 block.mechanical-drill.name = 機械鑽頭 @@ -1055,6 +1118,7 @@ block.container.name = 容器 block.launch-pad.name = 小型發射台 block.launch-pad-large.name = 大型發射台 block.segment.name = Segment +block.command-center.name = Command Center block.ground-factory.name = Ground Factory block.air-factory.name = Air Factory block.naval-factory.name = Naval Factory @@ -1066,7 +1130,16 @@ block.payload-conveyor.name = Mass Conveyor block.payload-router.name = Payload Router block.disassembler.name = Disassembler block.silicon-crucible.name = Silicon Crucible -block.large-overdrive-projector.name = Large Overdrive Projector +block.overdrive-dome.name = Overdrive Dome + +block.switch.name = Switch +block.micro-processor.name = Micro Processor +block.logic-processor.name = Logic Processor +block.hyper-processor.name = Hyper Processor +block.logic-display.name = Logic Display +block.large-logic-display.name = Large Logic Display +block.memory-cell.name = Memory Cell + team.blue.name = 藍 team.crux.name = 紅 team.sharded.name = 黃 @@ -1192,7 +1265,7 @@ block.battery.description = 有能量剩餘時存儲電力並在能量短缺時 block.battery-large.description = 比普通電池存儲更多的能量。 block.combustion-generator.description = 透過燃燒原油或可燃物品以產生能量。 block.thermal-generator.description = 放置在熱的位置時會產生能量。 -block.turbine-generator.description = 比燃燒發電機更有效率,但需要水才能運作。 +block.steam-generator.description = 比燃燒發電機更有效率,但需要水才能運作。 block.differential-generator.description = 利用冷卻液和燃燒火焰彈之間的溫差產生大量的能量。 block.rtg-generator.description = 一種簡單、可靠的發電機,使用放射性化合物衰變所產生的熱產生少量能量。不需要冷卻,但產生的能量比釷反應堆少。 block.solar-panel.description = 透過太陽產生少量的能量。 diff --git a/core/assets/contributors b/core/assets/contributors index ee8b77ddb9..7cff98715f 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -89,3 +89,8 @@ Daniel Dusek DeltaNedas GioIacca9 SnakkiZXZ +sk7725 +The Slaylord +ThePlayerA +YellOw139 +PetrGasparik 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 278b00dc51..e5778f6442 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -21,15 +21,8 @@ 63723=ice|block-ice-medium 63722=ice-snow|block-ice-snow-medium 63721=cliffs|block-cliffs-medium -63720=rocks|block-rocks-medium -63719=sporerocks|block-sporerocks-medium 63718=rock|block-rock-medium 63717=snowrock|block-snowrock-medium -63716=icerocks|block-icerocks-medium -63715=snowrocks|block-snowrocks-medium -63714=dunerocks|block-dunerocks-medium -63713=sandrocks|block-sandrocks-medium -63712=saltrocks|block-saltrocks-medium 63711=spore-pine|block-spore-pine-medium 63710=snow-pine|block-snow-pine-medium 63709=pine|block-pine-medium @@ -38,7 +31,6 @@ 63706=white-tree|block-white-tree-medium 63705=spore-cluster|block-spore-cluster-medium 63704=shale|block-shale-medium -63703=shalerocks|block-shalerocks-medium 63702=shale-boulder|block-shale-boulder-medium 63701=sand-boulder|block-sand-boulder-medium 63700=moss|block-moss-medium @@ -134,7 +126,7 @@ 63610=battery-large|block-battery-large-medium 63609=combustion-generator|block-combustion-generator-medium 63608=thermal-generator|block-thermal-generator-medium -63607=turbine-generator|block-turbine-generator-medium +63607=steam-generator|block-steam-generator-medium 63606=differential-generator|block-differential-generator-medium 63605=rtg-generator|block-rtg-generator-medium 63604=solar-panel|block-solar-panel-medium @@ -287,3 +279,35 @@ 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 +63430=omura|unit-omura-medium +63429=mud|block-mud-medium +63428=sei|unit-sei-medium +63427=quad|unit-quad-medium +63426=oct|unit-oct-medium +63425=vela|unit-vela-medium +63424=corvus|unit-corvus-medium +63423=memory-bank|block-memory-bank-medium 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 deleted file mode 100644 index d31bf6c11c..0000000000 Binary files a/core/assets/planets/serpulo.dat and /dev/null differ diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index 04ebb37a27..8910dbd2a9 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -74,11 +74,13 @@ importPackage(Packages.mindustry.gen) importPackage(Packages.mindustry.graphics) importPackage(Packages.mindustry.graphics.g3d) importPackage(Packages.mindustry.input) +importPackage(Packages.mindustry.io) importPackage(Packages.mindustry.logic) importPackage(Packages.mindustry.maps) importPackage(Packages.mindustry.maps.filters) 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) @@ -124,7 +126,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 @@ -152,7 +154,6 @@ const SaveLoadEvent = Packages.mindustry.game.EventType.SaveLoadEvent const MapPublishEvent = Packages.mindustry.game.EventType.MapPublishEvent const MapMakeEvent = Packages.mindustry.game.EventType.MapMakeEvent const ResizeEvent = Packages.mindustry.game.EventType.ResizeEvent -const LaunchEvent = Packages.mindustry.game.EventType.LaunchEvent const LoseEvent = Packages.mindustry.game.EventType.LoseEvent const WinEvent = Packages.mindustry.game.EventType.WinEvent const Trigger = Packages.mindustry.game.EventType.Trigger diff --git a/core/assets/shaders/mud.frag b/core/assets/shaders/mud.frag new file mode 100644 index 0000000000..3858cdec63 --- /dev/null +++ b/core/assets/shaders/mud.frag @@ -0,0 +1,29 @@ +#define HIGHP + +#define NSCALE 180.0 / 2.0 + +uniform sampler2D u_texture; +uniform sampler2D u_noise; + +uniform vec2 u_campos; +uniform vec2 u_resolution; +uniform float u_time; + +varying vec2 v_texCoords; + +void main(){ + vec2 c = v_texCoords.xy; + vec2 coords = vec2(c.x * u_resolution.x + u_campos.x, c.y * u_resolution.y + u_campos.y); + + float btime = u_time / 70000.0; + float noise = sin((texture2D(u_noise, (coords) / NSCALE + vec2(btime) * vec2(-0.9, 0.8)).r + texture2D(u_noise, (coords) / NSCALE + vec2(abs(sin(btime)) * 1.1) * vec2(-0.8, -1.0)).r) / 2.0); + vec4 color = texture2D(u_texture, c); + + if(noise > 0.54 && noise < 0.68){ + color.rgb *= 1.4; + }else if(!(noise > 0.40 && noise < 0.54)){ + color.rgb *= 1.2; + } + + gl_FragColor = color; +} diff --git a/core/assets/shaders/slag.frag b/core/assets/shaders/slag.frag index 2dae9dc45c..f904d48dbf 100755 --- a/core/assets/shaders/slag.frag +++ b/core/assets/shaders/slag.frag @@ -22,12 +22,10 @@ void main(){ float noise = (texture2D(u_noise, (coords) / NSCALE + vec2(btime) * vec2(-0.9, 0.8)).r + texture2D(u_noise, (coords) / NSCALE + vec2(btime * 1.1) * vec2(0.8, -1.0)).r) / 2.0; vec4 color = texture2D(u_texture, c); - if(color.a > 0.1){ - if(noise > 0.6){ - color.rgb = S2; - }else if (noise > 0.54){ - color.rgb = S1; - } + if(noise > 0.6){ + color.rgb = S2; + }else if (noise > 0.54){ + color.rgb = S1; } gl_FragColor = color; diff --git a/core/assets/shaders/tar.frag b/core/assets/shaders/tar.frag index 39b0c27492..ea2a3b3f1d 100644 --- a/core/assets/shaders/tar.frag +++ b/core/assets/shaders/tar.frag @@ -20,7 +20,7 @@ void main(){ vec4 color = texture2D(u_texture, c); if(!(noise > 0.54 && noise < 0.58)){ - color.rgb *= 0.6; + color.rgb *= vec3(0.6, 0.6, 0.7); } gl_FragColor = color; diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index b93360e858..2e56024196 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 957a39f63a..f667e53905 100644 --- a/core/assets/sprites/fallback/sprites.atlas +++ b/core/assets/sprites/fallback/sprites.atlas @@ -6,6486 +6,7542 @@ filter: nearest,nearest repeat: none white-tree rotate: false - xy: 1, 389 + xy: 1127, 1273 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead rotate: false - xy: 1322, 1705 + xy: 1127, 951 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead-shadow rotate: false - xy: 1, 1677 + xy: 403, 843 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 white-tree-shadow rotate: false - xy: 1, 1677 + xy: 403, 843 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 -exponential-reconstructor - rotate: false - xy: 1387, 479 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -exponential-reconstructor-top - rotate: false - xy: 1387, 253 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -factory-in-7 - rotate: false - xy: 549, 33 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 factory-in-9 rotate: false - xy: 613, 835 + xy: 1015, 371 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 -factory-out-7 - rotate: false - xy: 1613, 963 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 factory-out-9 rotate: false - xy: 903, 1125 + xy: 725, 81 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 tetrative-reconstructor rotate: false - xy: 1193, 1415 + xy: 1015, 81 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 tetrative-reconstructor-top rotate: false - xy: 613, 545 + xy: 1338, 515 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 -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 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-wreck1 - rotate: false - xy: 1831, 479 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-wreck2 - rotate: false - xy: 1613, 237 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-full - rotate: false - xy: 1161, 899 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 block-tetrative-reconstructor-full rotate: false - xy: 1, 99 + xy: 1449, 1385 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 -cracks-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 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-1 - rotate: false - xy: 1161, 447 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-2 - rotate: false - xy: 1161, 221 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-3 - rotate: false - xy: 1451, 1189 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-4 - rotate: false - xy: 1741, 1253 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-5 - rotate: false - xy: 581, 291 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-6 - rotate: false - xy: 1387, 931 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-7 - rotate: false - xy: 1387, 705 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-8-0 - rotate: false - xy: 903, 867 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-1 - rotate: false - xy: 1193, 1157 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-2 - rotate: false - xy: 903, 609 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-3 - rotate: false - xy: 1483, 1447 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-4 - rotate: false - xy: 1741, 1479 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-5 - rotate: false - xy: 323, 259 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-6 - rotate: false - xy: 291, 1 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-7 - rotate: false - xy: 903, 351 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 cracks-9-0 rotate: false - xy: 1644, 1737 + xy: 1449, 1095 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-1 rotate: false - xy: 323, 1387 + xy: 1449, 805 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-2 rotate: false - xy: 323, 1097 + xy: 1739, 1385 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-3 rotate: false - xy: 323, 807 + xy: 1739, 1095 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-4 rotate: false - xy: 323, 517 + xy: 1739, 805 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-5 rotate: false - xy: 613, 1415 + xy: 758, 661 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-6 rotate: false - xy: 613, 1125 + xy: 1048, 661 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 cracks-9-7 rotate: false - xy: 903, 1415 + xy: 725, 371 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 +eclipse-outline + rotate: false + xy: 1, 67 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 eclipse-wreck0 rotate: false - xy: 1, 1033 + xy: 403, 521 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck1 rotate: false - xy: 678, 1705 + xy: 1529, 1675 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-wreck2 rotate: false - xy: 1, 711 + xy: 403, 199 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 -unit-antumbra-full +oct-outline rotate: false - xy: 1831, 237 - size: 216, 240 - orig: 216, 240 + xy: 403, 1595 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-wreck0 + rotate: false + xy: 1, 791 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-wreck1 + rotate: false + xy: 403, 1193 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-wreck2 + rotate: false + xy: 805, 1595 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +omura-outline + rotate: false + xy: 1587, 1 + size: 280, 400 + orig: 280, 400 offset: 0, 0 index: -1 unit-eclipse-full rotate: false - xy: 1000, 1705 + xy: 805, 951 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 -circle +unit-oct-full rotate: false - xy: 1839, 1050 - size: 201, 201 - orig: 201, 201 - offset: 0, 0 - index: -1 -antumbra - rotate: false - xy: 1613, 721 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-cell - rotate: false - xy: 1831, 721 - size: 216, 240 - orig: 216, 240 + xy: 1, 389 + size: 400, 400 + orig: 400, 400 offset: 0, 0 index: -1 eclipse rotate: false - xy: 1, 1355 + xy: 805, 1273 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 eclipse-cell rotate: false - xy: 356, 1705 + xy: 1207, 1675 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 +oct + rotate: false + xy: 1, 1595 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-cell + rotate: false + xy: 1, 1193 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +omura + rotate: false + xy: 1305, 113 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-cell + rotate: false + xy: 1628, 403 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 sprites2.png size: 2048,2048 format: rgba8888 filter: nearest,nearest repeat: none -core-silo +large-logic-display rotate: false - xy: 713, 1887 - size: 160, 160 - orig: 160, 160 + xy: 1567, 102 + size: 192, 192 + orig: 192, 192 offset: 0, 0 index: -1 -launch-pad +exponential-reconstructor rotate: false - xy: 1545, 1415 - size: 96, 96 - orig: 96, 96 + xy: 767, 1071 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -launch-pad-large +exponential-reconstructor-top rotate: false - xy: 1397, 1627 - size: 128, 128 - orig: 128, 128 + xy: 993, 1313 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -launch-pad-light +factory-in-7 rotate: false - xy: 1545, 1317 - size: 96, 96 - orig: 96, 96 + xy: 993, 1087 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -launchpod +factory-out-7 rotate: false - xy: 1303, 453 - size: 64, 64 - orig: 64, 64 + xy: 1219, 1313 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -force-projector +circle-shadow rotate: false - xy: 733, 725 - size: 96, 96 - orig: 96, 96 + xy: 1620, 684 + size: 201, 201 + orig: 201, 201 offset: 0, 0 index: -1 -force-projector-top +antumbra-outline rotate: false - xy: 831, 725 - size: 96, 96 - orig: 96, 96 + xy: 719, 143 + size: 216, 240 + orig: 216, 240 offset: 0, 0 index: -1 -mend-projector +antumbra-wreck0 rotate: false - xy: 1407, 57 - size: 64, 64 - orig: 64, 64 + xy: 941, 385 + size: 216, 240 + orig: 216, 240 offset: 0, 0 index: -1 -mend-projector-top +antumbra-wreck1 rotate: false - xy: 1015, 55 - size: 64, 64 - orig: 64, 64 + xy: 937, 143 + size: 216, 240 + orig: 216, 240 offset: 0, 0 index: -1 -overdrive-dome +antumbra-wreck2 rotate: false - xy: 929, 517 - size: 96, 96 - orig: 96, 96 + xy: 1667, 1313 + size: 216, 240 + orig: 216, 240 offset: 0, 0 index: -1 -overdrive-dome-top +block-exponential-reconstructor-full rotate: false - xy: 1027, 517 - size: 96, 96 - orig: 96, 96 + xy: 1823, 1797 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -overdrive-projector +corvus-outline rotate: false - xy: 1081, 113 - size: 64, 64 - orig: 64, 64 + xy: 933, 1 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -overdrive-projector-top +corvus-wreck0 rotate: false - xy: 1081, 47 - size: 64, 64 - orig: 64, 64 + xy: 993, 945 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -block-loader +corvus-wreck1 rotate: false - xy: 1043, 1203 - size: 96, 96 - orig: 96, 96 + xy: 985, 803 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -block-unloader +corvus-wreck2 rotate: false - xy: 647, 1137 - size: 96, 96 - orig: 96, 96 + xy: 969, 661 + size: 214, 140 + orig: 214, 140 offset: 0, 0 index: -1 -bridge-arrow +cracks-6-0 rotate: false - xy: 1873, 97 - size: 32, 32 - orig: 32, 32 + xy: 1367, 494 + size: 192, 192 + orig: 192, 192 offset: 0, 0 index: -1 -bridge-conveyor +cracks-6-1 rotate: false - xy: 1907, 97 - size: 32, 32 - orig: 32, 32 + xy: 1561, 490 + size: 192, 192 + orig: 192, 192 offset: 0, 0 index: -1 -bridge-conveyor-bridge +cracks-6-2 rotate: false - xy: 1941, 131 - size: 32, 32 - orig: 32, 32 + xy: 1755, 490 + size: 192, 192 + orig: 192, 192 offset: 0, 0 index: -1 -bridge-conveyor-end +cracks-6-3 rotate: false - xy: 1975, 165 - size: 32, 32 - orig: 32, 32 + xy: 1823, 693 + size: 192, 192 + orig: 192, 192 offset: 0, 0 index: -1 -center +cracks-6-4 rotate: false - xy: 1873, 29 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-0 - rotate: false - xy: 1683, 389 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-armored-conveyor-full - rotate: false - xy: 1683, 389 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-1 - rotate: false - xy: 1885, 455 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-2 - rotate: false - xy: 1847, 417 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-0-3 - rotate: false - xy: 1847, 383 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-0 - rotate: false - xy: 1732, 371 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-1 - rotate: false - xy: 1732, 337 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-2 - rotate: false - xy: 1766, 355 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-1-3 - rotate: false - xy: 1725, 303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-0 - rotate: false - xy: 1725, 269 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-1 - rotate: false - xy: 1725, 235 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-2 - rotate: false - xy: 1800, 349 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-2-3 - rotate: false - xy: 1834, 349 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-0 - rotate: false - xy: 1766, 321 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-1 - rotate: false - xy: 1800, 315 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-2 - rotate: false - xy: 1834, 315 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-3-3 - rotate: false - xy: 1759, 287 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-0 - rotate: false - xy: 1759, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-1 - rotate: false - xy: 1793, 281 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-2 - rotate: false - xy: 1827, 281 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-4-3 - rotate: false - xy: 1793, 247 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-1 - rotate: false - xy: 2009, 97 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-2 - rotate: false - xy: 2009, 63 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-3 - rotate: false - xy: 2009, 29 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -distributor - rotate: false - xy: 1275, 57 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver-base - rotate: false - xy: 929, 615 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor - rotate: false - xy: 1125, 519 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-edge - rotate: false - xy: 1741, 1439 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-top - rotate: false - xy: 1741, 1341 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-top - rotate: false - xy: 1741, 1341 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router - rotate: false - xy: 1839, 1439 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-edge - rotate: false - xy: 1839, 1341 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-over - rotate: false - xy: 1937, 1439 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-drill - rotate: false - xy: 155, 65 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rim - rotate: false - xy: 305, 1437 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-rotator - rotate: false - xy: 305, 1307 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -blast-drill-top - rotate: false - xy: 305, 1177 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -drill-top - rotate: false - xy: 1289, 849 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-liquid - rotate: false - xy: 1289, 849 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -laser-drill - rotate: false - xy: 1349, 1415 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rim - rotate: false - xy: 1349, 1317 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-rotator - rotate: false - xy: 1447, 1415 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -laser-drill-top - rotate: false - xy: 1447, 1317 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mechanical-drill - rotate: false - xy: 1341, 57 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-rotator - rotate: false - xy: 1407, 189 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mechanical-drill-top - rotate: false - xy: 1407, 123 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -oil-extractor - rotate: false - xy: 537, 610 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-liquid - rotate: false - xy: 635, 549 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-rotator - rotate: false - xy: 733, 529 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -oil-extractor-top - rotate: false - xy: 831, 529 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -pneumatic-drill - rotate: false - xy: 1355, 519 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-rotator - rotate: false - xy: 1369, 453 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pneumatic-drill-top - rotate: false - xy: 1419, 387 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor - rotate: false - xy: 1553, 717 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-liquid - rotate: false - xy: 1553, 651 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-rotator - rotate: false - xy: 1553, 585 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-top - rotate: false - xy: 1553, 519 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-border - rotate: false - xy: 1861, 247 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-middle - rotate: false - xy: 1983, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-select - rotate: false - xy: 1839, 111 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-liquid - rotate: false - xy: 1941, 29 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -place-arrow - rotate: false - xy: 1937, 1341 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -bridge-conduit - rotate: false - xy: 1907, 131 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-arrow - rotate: false - xy: 1941, 165 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-arrow - rotate: false - xy: 1941, 165 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-bridge - rotate: false - xy: 1975, 199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-end - rotate: false - xy: 1873, 63 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom - rotate: false - xy: 1975, 131 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-0 - rotate: false - xy: 1907, 29 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-1 - rotate: false - xy: 1941, 63 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-2 - rotate: false - xy: 1975, 97 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-3 - rotate: false - xy: 1975, 97 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-bottom-4 - rotate: false - xy: 1975, 97 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-0 - rotate: false - xy: 1975, 63 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-1 - rotate: false - xy: 1975, 29 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-2 - rotate: false - xy: 2009, 199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-3 - rotate: false - xy: 2009, 165 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-top-3 - rotate: false - xy: 2009, 165 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-top-4 - rotate: false - xy: 2009, 131 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-tank-bottom - rotate: false - xy: 1643, 1415 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-liquid - rotate: false - xy: 1643, 1317 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-tank-top - rotate: false - xy: 635, 647 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rotary-pump - rotate: false - xy: 1421, 981 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-pump - rotate: false - xy: 1447, 1121 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -hyper-processor - rotate: false - xy: 1125, 715 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-display - rotate: false - xy: 733, 627 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -logic-processor - rotate: false - xy: 1287, 387 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -battery - rotate: false - xy: 1827, 247 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -battery-large - rotate: false - xy: 1153, 1301 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery-large-top - rotate: false - xy: 435, 599 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -battery-top - rotate: false - xy: 1868, 349 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator - rotate: false - xy: 1907, 63 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator-top - rotate: false - xy: 1941, 97 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -differential-generator - rotate: false - xy: 1039, 1105 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-liquid - rotate: false - xy: 1137, 1105 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-top - rotate: false - xy: 929, 1007 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -impact-reactor - rotate: false - xy: 487, 1627 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-bottom - rotate: false - xy: 617, 1627 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-light - rotate: false - xy: 747, 1627 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-0 - rotate: false - xy: 877, 1627 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-1 - rotate: false - xy: 1007, 1627 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-2 - rotate: false - xy: 1137, 1627 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -impact-reactor-plasma-3 - rotate: false - xy: 1267, 1627 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -power-node-large - rotate: false - xy: 1419, 321 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rtg-generator - rotate: false - xy: 1421, 915 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -solar-panel-large - rotate: false - xy: 1349, 1121 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -surge-tower - rotate: false - xy: 1487, 519 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-generator - rotate: false - xy: 1551, 321 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-reactor - rotate: false - xy: 1545, 1121 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-lights - rotate: false - xy: 1643, 1121 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-top - rotate: false - xy: 1741, 1047 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -turbine-generator - rotate: false - xy: 1605, 123 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-cap - rotate: false - xy: 1605, 57 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-top - rotate: false - xy: 1553, 981 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-turbine0 - rotate: false - xy: 1553, 915 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-turbine1 - rotate: false - xy: 1553, 849 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -alloy-smelter - rotate: false - xy: 957, 1301 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -alloy-smelter-top - rotate: false - xy: 1055, 1301 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -blast-mixer - rotate: false - xy: 847, 135 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-forge - rotate: false - xy: 415, 11 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -coal-centrifuge - rotate: false - xy: 1155, 319 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-bottom - rotate: false - xy: 1077, 179 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-liquid - rotate: false - xy: 1143, 179 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-top - rotate: false - xy: 1209, 187 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator - rotate: false - xy: 1275, 189 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-middle - rotate: false - xy: 1209, 121 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-top - rotate: false - xy: 1275, 123 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -disassembler - rotate: false - xy: 929, 909 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-liquid - rotate: false - xy: 1027, 1007 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -disassembler-spinner - rotate: false - xy: 1027, 909 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -graphite-press - rotate: false - xy: 1289, 717 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -kiln - rotate: false - xy: 1289, 651 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -kiln-top - rotate: false - xy: 1289, 585 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-smelter-top - rotate: false - xy: 1289, 585 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -multi-press - rotate: false - xy: 1027, 615 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -phase-weaver - rotate: false - xy: 1355, 915 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-bottom - rotate: false - xy: 1355, 849 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-weave - rotate: false - xy: 1355, 783 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor - rotate: false - xy: 1355, 717 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor-top - rotate: false - xy: 1355, 651 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pyratite-mixer - rotate: false - xy: 1473, 189 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator - rotate: false - xy: 1539, 189 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-liquid - rotate: false - xy: 1539, 123 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-spinner - rotate: false - xy: 1539, 57 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-crucible - rotate: false - xy: 1839, 1145 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-crucible-top - rotate: false - xy: 1937, 1145 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -silicon-smelter - rotate: false - xy: 1487, 981 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press - rotate: false - xy: 1487, 915 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame0 - rotate: false - xy: 1487, 849 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame1 - rotate: false - xy: 1487, 783 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-frame2 - rotate: false - xy: 1487, 717 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-liquid - rotate: false - xy: 1487, 651 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-press-top - rotate: false - xy: 1487, 585 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rock1 - rotate: false - xy: 1877, 489 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rock2 - rotate: false - xy: 1927, 471 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrock1 - rotate: false - xy: 1675, 222 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrock2 - rotate: false - xy: 1671, 172 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-cluster1 - rotate: false - xy: 1767, 431 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster2 - rotate: false - xy: 1725, 405 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -spore-cluster3 - rotate: false - xy: 1767, 389 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -container - rotate: false - xy: 1221, 321 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation - rotate: false - xy: 357, 1725 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team - rotate: false - xy: 487, 1757 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus - rotate: false - xy: 389, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team - rotate: false - xy: 1, 1337 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard - rotate: false - xy: 635, 1039 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team - rotate: false - xy: 635, 941 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault - rotate: false - xy: 1937, 1047 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -arc-heat - rotate: false - xy: 1111, 13 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-1 - rotate: false - xy: 1868, 315 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-2 - rotate: false - xy: 1105, 451 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-3 - rotate: false - xy: 423, 501 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-4 - rotate: false - xy: 305, 1047 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -hail-heat - rotate: false - xy: 2001, 1959 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -lancer-heat - rotate: false - xy: 1237, 453 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -meltdown-heat - rotate: false - xy: 1657, 1627 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -ripple-heat - rotate: false - xy: 1839, 1243 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -salvo-heat - rotate: false - xy: 1421, 783 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-left - rotate: false - xy: 1421, 717 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-panel-right - rotate: false - xy: 1421, 651 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -wave-liquid - rotate: false - xy: 1617, 387 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -additive-reconstructor - rotate: false - xy: 957, 1399 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -additive-reconstructor-top - rotate: false - xy: 1055, 1399 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -air-factory - rotate: false - xy: 1153, 1399 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -command-center - rotate: false - xy: 1221, 387 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -factory-in-3 - rotate: false - xy: 929, 811 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-in-5 - rotate: false - xy: 1, 365 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -factory-out-3 - rotate: false - xy: 1027, 811 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -factory-out-5 - rotate: false - xy: 1523, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -factory-top-3 - rotate: false - xy: 1125, 813 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ground-factory - rotate: false - xy: 1027, 713 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multiplicative-reconstructor - rotate: false - xy: 1, 203 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -multiplicative-reconstructor-top - rotate: false - xy: 1685, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -naval-factory - rotate: false - xy: 1125, 617 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rally-point - rotate: false - xy: 1473, 123 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -resupply-point - rotate: false - xy: 1473, 57 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -copper-wall-large - rotate: false - xy: 913, 157 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-large - rotate: false - xy: 1289, 981 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-large-open - rotate: false - xy: 1289, 915 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-wall-large - rotate: false - xy: 1355, 981 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-wall-large - rotate: false - xy: 1355, 585 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-gigantic - rotate: false - xy: 617, 1497 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-huge2 - rotate: false - xy: 1251, 1205 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge3 - rotate: false - xy: 1741, 1145 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-large1 - rotate: false - xy: 1421, 519 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large2 - rotate: false - xy: 1435, 453 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large3 - rotate: false - xy: 1485, 387 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-large4 - rotate: false - xy: 1485, 321 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-wall-large - rotate: false - xy: 1501, 453 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-wall-large - rotate: false - xy: 1551, 255 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thruster - rotate: false - xy: 877, 1497 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -titanium-wall-large - rotate: false - xy: 1605, 189 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bullet - rotate: false - xy: 1015, 1 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -bullet-back - rotate: false - xy: 1147, 1 - size: 52, 52 - orig: 52, 52 - offset: 0, 0 - index: -1 -circle-end - rotate: false - xy: 549, 1296 - size: 100, 199 - orig: 100, 199 - offset: 0, 0 - index: -1 -error - rotate: false - xy: 1513, 7 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -laser-end - rotate: false - xy: 957, 443 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -minelaser-end - rotate: false - xy: 1031, 443 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -missile - rotate: false - xy: 1809, 459 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -missile-back - rotate: false - xy: 1809, 421 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -parallax-laser-end - rotate: false - xy: 871, 369 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -particle - rotate: false - xy: 1767, 473 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -shell - rotate: false - xy: 1809, 383 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -shell-back - rotate: false - xy: 1847, 451 - size: 36, 36 - orig: 36, 36 - offset: 0, 0 - index: -1 -alpha-wreck0 - rotate: false - xy: 1793, 947 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck1 - rotate: false - xy: 1843, 997 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-wreck2 - rotate: false - xy: 1735, 831 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -arc - rotate: false - xy: 2001, 1799 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -arkyid-wreck0 - rotate: false - xy: 163, 455 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck1 - rotate: false - xy: 163, 325 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck2 - rotate: false - xy: 163, 195 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -atrax-wreck0 - rotate: false - xy: 617, 417 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck1 - rotate: false - xy: 617, 351 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck2 - rotate: false - xy: 617, 285 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -beta-wreck0 - rotate: false - xy: 1735, 731 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck1 - rotate: false - xy: 1735, 681 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck2 - rotate: false - xy: 1735, 631 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-additive-reconstructor-full - rotate: false - xy: 423, 403 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-air-factory-full - rotate: false - xy: 423, 305 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-arc-full - rotate: false - xy: 1861, 281 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-full - rotate: false - xy: 305, 917 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-char-full - rotate: false - xy: 1919, 437 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-full - rotate: false - xy: 1885, 421 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-full - rotate: false - xy: 1881, 387 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-full - rotate: false - xy: 1919, 403 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-0 - rotate: false - xy: 1919, 403 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-full - rotate: false - xy: 305, 787 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-core-nucleus-full - rotate: false - xy: 1, 1499 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-core-shard-full - rotate: false - xy: 423, 207 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-craters-full - rotate: false - xy: 1915, 369 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluidmixer-full - rotate: false - xy: 1171, 453 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cultivator-full - rotate: false - xy: 1089, 377 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cyclone-full - rotate: false - xy: 423, 109 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-dark-metal-full - rotate: false - xy: 1902, 335 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-full - rotate: false - xy: 1902, 301 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dunerocks-full - rotate: false - xy: 1895, 267 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-full - rotate: false - xy: 1895, 233 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fuse-full - rotate: false - xy: 651, 1235 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-grass-full - rotate: false - xy: 1936, 335 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ground-factory-full - rotate: false - xy: 749, 1215 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-hail-full - rotate: false - xy: 1936, 301 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-full - rotate: false - xy: 1929, 267 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-full - rotate: false - xy: 1929, 233 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-full - rotate: false - xy: 1949, 369 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-full - rotate: false - xy: 1970, 335 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-icerocks-full - rotate: false - xy: 1970, 301 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-full - rotate: false - xy: 1963, 267 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-full - rotate: false - xy: 305, 657 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-lancer-full - rotate: false - xy: 1089, 311 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-laser-drill-full - rotate: false - xy: 847, 1215 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-liquid-router-full - rotate: false - xy: 1963, 233 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-full - rotate: false - xy: 945, 1203 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-magmarock-full - rotate: false - xy: 1953, 413 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-full - rotate: false - xy: 1141, 1203 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-mechanical-drill-full - rotate: false - xy: 1083, 245 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-meltdown-full - rotate: false - xy: 293, 527 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-full - rotate: false - xy: 1987, 413 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-full - rotate: false - xy: 1997, 267 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-full - rotate: false - xy: 195, 1693 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-naval-factory-full - rotate: false - xy: 549, 1198 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-oil-extractor-full - rotate: false - xy: 537, 1100 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-ore-coal-full - rotate: false - xy: 1997, 233 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-full - rotate: false - xy: 2004, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-full - rotate: false - xy: 2004, 311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-full - rotate: false - xy: 979, 178 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-full - rotate: false - xy: 1771, 199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-full - rotate: false - xy: 1771, 165 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-full - rotate: false - xy: 751, 61 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-payload-conveyor-full - rotate: false - xy: 537, 1002 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-icon - rotate: false - xy: 537, 1002 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-payload-router-full - rotate: false - xy: 537, 904 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon - rotate: false - xy: 537, 904 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-pebbles-full - rotate: false - xy: 1771, 131 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-full - rotate: false - xy: 817, 61 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-plated-conduit-full - rotate: false - xy: 1771, 97 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-full - rotate: false - xy: 883, 69 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-pulse-conduit-full - rotate: false - xy: 1771, 63 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-full - rotate: false - xy: 1771, 29 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-full - rotate: false - xy: 1805, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-full - rotate: false - xy: 537, 806 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-rock-full - rotate: false - xy: 693, 77 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rocks-full - rotate: false - xy: 1805, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-saltrocks-full - rotate: false - xy: 1839, 213 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-full - rotate: false - xy: 1223, 1039 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-sand-boulder-full - rotate: false - xy: 1805, 145 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-full - rotate: false - xy: 1839, 179 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-full - rotate: false - xy: 1805, 111 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-full - rotate: false - xy: 1223, 973 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-scorch-full - rotate: false - xy: 1839, 145 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-full - rotate: false - xy: 1805, 77 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall1 - rotate: false - xy: 1805, 77 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-full - rotate: false - xy: 537, 708 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge1 - rotate: false - xy: 537, 708 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-scrap-wall-large-full - rotate: false - xy: 1223, 907 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-segment-full - rotate: false - xy: 1223, 841 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-shale-boulder-full - rotate: false - xy: 1805, 43 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-full - rotate: false - xy: 1839, 77 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shalerocks-full - rotate: false - xy: 1839, 43 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-full - rotate: false - xy: 1805, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-full - rotate: false - xy: 1839, 9 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-full - rotate: false - xy: 1893, 939 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrocks-full - rotate: false - xy: 1873, 199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-full - rotate: false - xy: 293, 397 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-spore-cluster-full - rotate: false - xy: 435, 1503 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-full - rotate: false - xy: 1873, 165 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-full - rotate: false - xy: 1223, 775 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-sporerocks-full - rotate: false - xy: 1907, 199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-full - rotate: false - xy: 1873, 131 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-full - rotate: false - xy: 1223, 709 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-tendrils-full - rotate: false - xy: 1907, 165 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-titanium-conveyor-full - rotate: false - xy: 1941, 199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-0 - rotate: false - xy: 1941, 199 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-turbine-generator-full - rotate: false - xy: 1223, 643 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-water-extractor-full - rotate: false - xy: 1223, 577 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-wave-full - rotate: false - xy: 1155, 385 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bryde-wreck0 - rotate: false - xy: 163, 1141 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck1 - rotate: false - xy: 163, 999 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck2 - rotate: false - xy: 163, 857 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -core-foundation-team-crux - rotate: false - xy: 617, 1757 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team-sharded - rotate: false - xy: 747, 1757 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus-team-crux - rotate: false - xy: 551, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team-sharded - rotate: false - xy: 1, 1175 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard-team-crux - rotate: false - xy: 635, 843 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team-sharded - rotate: false - xy: 635, 745 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-2-0 - rotate: false - xy: 883, 3 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-1 - rotate: false - xy: 1155, 253 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-2 - rotate: false - xy: 1221, 255 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-3 - rotate: false - xy: 949, 91 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-4 - rotate: false - xy: 949, 25 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-5 - rotate: false - xy: 1235, 1137 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-6 - rotate: false - xy: 945, 233 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-7 - rotate: false - xy: 1011, 212 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-3-0 - rotate: false - xy: 745, 1117 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-1 - rotate: false - xy: 843, 1117 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-2 - rotate: false - xy: 733, 1019 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-3 - rotate: false - xy: 733, 921 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-4 - rotate: false - xy: 831, 1019 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-5 - rotate: false - xy: 733, 823 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-6 - rotate: false - xy: 831, 921 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-7 - rotate: false - xy: 831, 823 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-4-0 - rotate: false - xy: 877, 1757 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-1 - rotate: false - xy: 1007, 1757 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-2 - rotate: false - xy: 1137, 1757 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-3 - rotate: false - xy: 1267, 1757 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-4 - rotate: false - xy: 1397, 1757 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-5 - rotate: false - xy: 1527, 1757 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-6 - rotate: false - xy: 1657, 1757 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-7 - rotate: false - xy: 357, 1595 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-5-0 - rotate: false - xy: 1, 1013 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-1 - rotate: false - xy: 875, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-2 - rotate: false - xy: 1, 851 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-3 - rotate: false - xy: 1037, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-4 - rotate: false - xy: 1, 689 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-5 - rotate: false - xy: 1199, 1887 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-6 - rotate: false - xy: 1, 527 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-7 - rotate: false - xy: 1361, 1887 - size: 160, 160 - orig: 160, 160 + xy: 1373, 296 + size: 192, 192 + orig: 192, 192 offset: 0, 0 index: -1 cracks-6-5 rotate: false - xy: 1, 1855 + xy: 1567, 296 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-6 rotate: false - xy: 1, 1661 + xy: 1761, 296 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 cracks-6-7 rotate: false - xy: 195, 1855 + xy: 1373, 102 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 -crawler-wreck0 +cracks-7-0 rotate: false - xy: 1735, 581 - size: 48, 48 - orig: 48, 48 + xy: 1823, 1571 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -crawler-wreck1 +cracks-7-1 rotate: false - xy: 1727, 531 - size: 48, 48 - orig: 48, 48 + xy: 807, 1539 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -crawler-wreck2 +cracks-7-2 rotate: false - xy: 435, 1545 - size: 48, 48 - orig: 48, 48 + xy: 1033, 1539 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -cyclone +cracks-7-3 rotate: false - xy: 941, 1105 + xy: 541, 1297 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-4 + rotate: false + xy: 541, 1071 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-5 + rotate: false + xy: 1259, 1539 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-6 + rotate: false + xy: 1485, 1555 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-7 + rotate: false + xy: 767, 1297 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-8-0 + rotate: false + xy: 565, 1765 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-1 + rotate: false + xy: 1, 559 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-2 + rotate: false + xy: 283, 1297 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-3 + rotate: false + xy: 823, 1765 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-4 + rotate: false + xy: 1, 301 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-5 + rotate: false + xy: 283, 1039 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-6 + rotate: false + xy: 1081, 1765 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-7 + rotate: false + xy: 1, 43 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +omura-wreck0 + rotate: false + xy: 1, 1621 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-wreck1 + rotate: false + xy: 1, 1219 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-wreck2 + rotate: false + xy: 283, 1621 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +quad-outline + rotate: false + xy: 541, 849 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck0 + rotate: false + xy: 763, 849 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck1 + rotate: false + xy: 525, 627 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck2 + rotate: false + xy: 747, 627 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +reign-outline + rotate: false + xy: 1661, 1171 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck0 + rotate: false + xy: 1441, 1033 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck1 + rotate: false + xy: 1657, 1029 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck2 + rotate: false + xy: 1219, 949 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +sei-outline + rotate: false + xy: 283, 797 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck0 + rotate: false + xy: 259, 555 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck1 + rotate: false + xy: 259, 313 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck2 + rotate: false + xy: 259, 71 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +toxopid-cannon-outline + rotate: false + xy: 1209, 727 + size: 206, 220 + orig: 206, 220 + offset: 0, 0 + index: -1 +toxopid-leg-base + rotate: false + xy: 283, 1555 + size: 270, 64 + orig: 270, 64 + offset: 0, 0 + index: -1 +unit-antumbra-full + rotate: false + xy: 1155, 143 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +unit-corvus-full + rotate: false + xy: 1435, 891 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +unit-omura-full + rotate: false + xy: 1, 817 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +unit-quad-full + rotate: false + xy: 501, 405 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +unit-reign-full + rotate: false + xy: 1651, 887 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +unit-sei-full + rotate: false + xy: 565, 1523 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +circle + rotate: false + xy: 1417, 688 + size: 201, 201 + orig: 201, 201 + offset: 0, 0 + index: -1 +antumbra + rotate: false + xy: 501, 163 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +antumbra-cell + rotate: false + xy: 723, 385 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +corvus + rotate: false + xy: 501, 21 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-cell + rotate: false + xy: 717, 1 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-weapon-heat + rotate: false + xy: 1149, 1 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +quad + rotate: false + xy: 1219, 1091 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-cell + rotate: false + xy: 1445, 1317 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +reign + rotate: false + xy: 1445, 1175 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +sei + rotate: false + xy: 1339, 1781 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-cell + rotate: false + xy: 1581, 1781 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +toxopid-cannon + rotate: false + xy: 1159, 439 + size: 206, 220 + orig: 206, 220 + offset: 0, 0 + index: -1 +omura-cannon + rotate: false + xy: 1761, 17 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 + +sprites3.png +size: 2048,2048 +format: rgba8888 +filter: nearest,nearest +repeat: none +core-silo + rotate: false + xy: 195, 1466 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +launch-pad + rotate: false + xy: 1565, 1467 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -dagger-wreck0 +launch-pad-large rotate: false - xy: 1363, 7 - size: 48, 48 - orig: 48, 48 + xy: 725, 363 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -dagger-wreck1 +launch-pad-light rotate: false - xy: 1413, 7 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck2 - rotate: false - xy: 1463, 7 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck0 - rotate: false - xy: 1785, 765 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck1 - rotate: false - xy: 1785, 715 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck2 - rotate: false - xy: 1785, 665 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -fortress-wreck0 - rotate: false - xy: 435, 1105 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck1 - rotate: false - xy: 651, 1333 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck2 - rotate: false - xy: 753, 1415 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fuse - rotate: false - xy: 929, 713 + xy: 1663, 1467 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -gamma-wreck0 +force-projector rotate: false - xy: 1619, 793 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck1 - rotate: false - xy: 1619, 735 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck2 - rotate: false - xy: 1619, 677 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -horizon-wreck0 - rotate: false - xy: 699, 127 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck1 - rotate: false - xy: 773, 127 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck2 - rotate: false - xy: 883, 443 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -item-blast-compound-large - rotate: false - xy: 2001, 1917 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-blast-compound-xlarge - rotate: false - xy: 1835, 797 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-coal-large - rotate: false - xy: 2001, 1875 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-coal-xlarge - rotate: false - xy: 1835, 747 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-copper-large - rotate: false - xy: 2001, 1833 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-copper-xlarge - rotate: false - xy: 1835, 697 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-graphite-large - rotate: false - xy: 1301, 1163 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-graphite-xlarge - rotate: false - xy: 1835, 647 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-lead-large - rotate: false - xy: 1069, 5 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-lead-xlarge - rotate: false - xy: 1885, 889 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-metaglass-large - rotate: false - xy: 1301, 1121 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-metaglass-xlarge - rotate: false - xy: 1885, 839 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-phase-fabric-large - rotate: false - xy: 1289, 1079 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-phase-fabric-xlarge - rotate: false - xy: 1885, 789 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-plastanium-large - rotate: false - xy: 1331, 1079 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-plastanium-xlarge - rotate: false - xy: 1885, 739 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-pyratite-large - rotate: false - xy: 1373, 1079 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-pyratite-xlarge - rotate: false - xy: 1885, 689 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-sand-large - rotate: false - xy: 1415, 1079 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-sand-xlarge - rotate: false - xy: 1885, 639 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-scrap-large - rotate: false - xy: 1457, 1079 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-scrap-xlarge - rotate: false - xy: 1835, 597 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-silicon-large - rotate: false - xy: 1499, 1079 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-silicon-xlarge - rotate: false - xy: 1785, 565 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-spore-pod-large - rotate: false - xy: 1541, 1079 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-spore-pod-xlarge - rotate: false - xy: 1885, 589 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-surge-alloy-large - rotate: false - xy: 1583, 1079 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-surge-alloy-xlarge - rotate: false - xy: 1835, 547 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-thorium-large - rotate: false - xy: 1625, 1079 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-thorium-xlarge - rotate: false - xy: 1885, 539 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-titanium-large - rotate: false - xy: 1683, 507 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-titanium-xlarge - rotate: false - xy: 1777, 515 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -lancer - rotate: false - xy: 1289, 519 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -liquid-cryofluid-large - rotate: false - xy: 1683, 465 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-cryofluid-xlarge - rotate: false - xy: 1935, 771 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-oil-large - rotate: false - xy: 1725, 489 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-oil-xlarge - rotate: false - xy: 1935, 721 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-slag-large - rotate: false - xy: 1683, 423 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-slag-xlarge - rotate: false - xy: 1935, 671 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-water-large - rotate: false - xy: 1725, 447 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-water-xlarge - rotate: false - xy: 1935, 621 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mace-wreck0 - rotate: false - xy: 1353, 255 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck1 - rotate: false - xy: 1341, 189 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck2 - rotate: false - xy: 1341, 123 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver - rotate: false - xy: 831, 627 + xy: 1349, 773 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -mega-wreck0 +force-projector-top rotate: false - xy: 435, 799 + xy: 1349, 675 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +overdrive-dome + rotate: false + xy: 1561, 1271 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +overdrive-dome-top + rotate: false + xy: 1463, 1173 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-loader + rotate: false + xy: 1055, 479 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-unloader + rotate: false + xy: 1157, 969 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mass-driver-base + rotate: false + xy: 1663, 1369 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-conveyor + rotate: false + xy: 1659, 1271 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-conveyor-edge + rotate: false + xy: 1561, 1173 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-conveyor-top + rotate: false + xy: 1757, 1271 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-top + rotate: false + xy: 1757, 1271 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router + rotate: false + xy: 1659, 1173 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-edge + rotate: false + xy: 1757, 1173 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-over + rotate: false + xy: 1353, 1075 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +blast-drill + rotate: false + xy: 335, 571 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +blast-drill-rim + rotate: false + xy: 335, 441 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +blast-drill-rotator + rotate: false + xy: 325, 311 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +blast-drill-top + rotate: false + xy: 325, 181 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +laser-drill + rotate: false + xy: 1349, 89 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +laser-drill-rim + rotate: false + xy: 1271, 1467 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +laser-drill-rotator + rotate: false + xy: 1369, 1467 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +laser-drill-top + rotate: false + xy: 1467, 1467 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor + rotate: false + xy: 1267, 1173 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor-liquid + rotate: false + xy: 1365, 1271 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor-rotator + rotate: false + xy: 1463, 1271 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor-top + rotate: false + xy: 1365, 1173 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +place-arrow + rotate: false + xy: 1353, 977 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +liquid-tank-bottom + rotate: false + xy: 1761, 1467 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +liquid-tank-liquid + rotate: false + xy: 1271, 1369 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +liquid-tank-top + rotate: false + xy: 1369, 1369 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thermal-pump + rotate: false + xy: 1447, 879 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +hyper-processor + rotate: false + xy: 1349, 381 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +logic-display + rotate: false + xy: 1467, 1369 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +battery-large + rotate: false + xy: 957, 437 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +battery-large-top + rotate: false + xy: 957, 339 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +differential-generator + rotate: false + xy: 1251, 773 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +differential-generator-liquid + rotate: false + xy: 1251, 675 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +differential-generator-top + rotate: false + xy: 1251, 577 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +impact-reactor + rotate: false + xy: 725, 1273 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-bottom + rotate: false + xy: 725, 1143 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-light + rotate: false + xy: 725, 1013 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-0 + rotate: false + xy: 725, 883 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-1 + rotate: false + xy: 725, 753 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-2 + rotate: false + xy: 725, 623 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-3 + rotate: false + xy: 725, 493 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +solar-panel-large + rotate: false + xy: 1745, 977 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thorium-reactor + rotate: false + xy: 1447, 781 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thorium-reactor-lights + rotate: false + xy: 1545, 879 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thorium-reactor-top + rotate: false + xy: 1447, 683 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +alloy-smelter + rotate: false + xy: 957, 633 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +alloy-smelter-top + rotate: false + xy: 957, 535 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +blast-mixer + rotate: false + xy: 1879, 570 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-forge + rotate: false + xy: 1059, 969 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +disassembler + rotate: false + xy: 1251, 479 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +disassembler-liquid + rotate: false + xy: 1251, 381 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +disassembler-spinner + rotate: false + xy: 1251, 283 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +multi-press + rotate: false + xy: 1761, 1369 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +silicon-crucible + rotate: false + xy: 1647, 977 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +silicon-crucible-top + rotate: false + xy: 1745, 1075 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-foundation + rotate: false + xy: 465, 571 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-foundation-team + rotate: false + xy: 465, 441 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-nucleus + rotate: false + xy: 1, 11 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-nucleus-team + rotate: false + xy: 1421, 1887 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-shard + rotate: false + xy: 1153, 773 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-shard-team + rotate: false + xy: 1153, 675 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vault + rotate: false + xy: 1545, 781 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vault-team + rotate: false + xy: 1643, 879 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-2 + rotate: false + xy: 1945, 572 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-3 + rotate: false + xy: 957, 241 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-4 + rotate: false + xy: 325, 51 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +meltdown-heat + rotate: false + xy: 585, 193 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +ripple-heat + rotate: false + xy: 1451, 977 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +additive-reconstructor + rotate: false + xy: 957, 927 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +additive-reconstructor-top + rotate: false + xy: 957, 829 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +air-factory + rotate: false + xy: 957, 731 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +factory-in-3 + rotate: false + xy: 1251, 185 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +factory-in-5 + rotate: false + xy: 163, 8 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +factory-out-3 + rotate: false + xy: 1251, 87 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +factory-out-5 + rotate: false + xy: 389, 1745 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +factory-top-3 + rotate: false + xy: 1349, 871 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +ground-factory + rotate: false + xy: 1349, 479 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +multiplicative-reconstructor + rotate: false + xy: 551, 1745 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +multiplicative-reconstructor-top + rotate: false + xy: 713, 1745 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +naval-factory + rotate: false + xy: 1267, 1271 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-gigantic + rotate: false + xy: 1385, 1565 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scrap-wall-huge2 + rotate: false + xy: 1549, 977 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-huge3 + rotate: false + xy: 1647, 1075 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thruster + rotate: false + xy: 1645, 1565 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +circle-end + rotate: false + xy: 855, 1030 + size: 100, 199 + orig: 100, 199 + offset: 0, 0 + index: -1 +large-bomb + rotate: false + xy: 715, 1 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -mega-wreck1 +large-bomb-back rotate: false - xy: 435, 697 + xy: 817, 1 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -mega-wreck2 +laser-end rotate: false - xy: 753, 1313 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -meltdown - rotate: false - xy: 1527, 1627 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-wreck0 - rotate: false - xy: 1787, 1537 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-wreck1 - rotate: false - xy: 1917, 1537 - size: 128, 128 - orig: 128, 128 - 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: 1985, 747 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck1 - rotate: false - xy: 1985, 697 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck2 - rotate: false - xy: 1985, 647 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-wreck0 - rotate: false - xy: 811, 3 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck1 - rotate: false - xy: 1015, 121 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck2 - rotate: false - xy: 1677, 1005 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -parallax - rotate: false - xy: 1147, 55 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -poly-wreck0 - rotate: false - xy: 1677, 831 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck1 - rotate: false - xy: 1677, 773 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck2 - rotate: false - xy: 1677, 715 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar-wreck0 - rotate: false - xy: 751, 11 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck1 - rotate: false - xy: 1223, 527 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck2 - rotate: false - xy: 1147, 129 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -quasar-wreck0 - rotate: false - xy: 789, 365 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck1 - rotate: false - xy: 789, 283 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck2 - rotate: false - xy: 707, 201 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -ripple - rotate: false - xy: 1741, 1243 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck0 - rotate: false - xy: 1447, 1219 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck1 - rotate: false - xy: 1545, 1219 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck2 - rotate: false - xy: 1643, 1219 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -salvo - rotate: false - xy: 1421, 849 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scatter - rotate: false - xy: 1421, 585 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -segment - rotate: false - xy: 1485, 255 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spectre - rotate: false - xy: 747, 1497 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spiroct-wreck0 - rotate: false - xy: 521, 379 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck1 - rotate: false - xy: 521, 302 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck2 - rotate: false - xy: 521, 225 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -swarmer - rotate: false - xy: 1551, 387 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-alpha-full - rotate: false - xy: 1671, 64 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-arkyid-full - rotate: false - xy: 1007, 1497 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-atrax-full - rotate: false - xy: 617, 219 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -unit-beta-full - rotate: false - xy: 1721, 172 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-bryde-full - rotate: false - xy: 163, 715 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -unit-crawler-full - rotate: false - xy: 1721, 122 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-full - rotate: false - xy: 1721, 72 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-flare-full - rotate: false - xy: 1721, 22 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-fortress-full - rotate: false - xy: 855, 1415 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -unit-gamma-full - rotate: false - xy: 1677, 599 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-horizon-full - rotate: false - xy: 871, 295 + xy: 1813, 710 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -unit-mace-full +minelaser-end rotate: false - xy: 1553, 783 - size: 64, 64 - orig: 64, 64 + xy: 1813, 636 + size: 72, 72 + orig: 72, 72 offset: 0, 0 index: -1 -unit-mega-full +parallax-laser-end rotate: false - xy: 855, 1313 - 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: 107, 15 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-full - rotate: false - xy: 1735, 989 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-poly-full - rotate: false - xy: 1735, 931 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-pulsar-full - rotate: false - xy: 1213, 71 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -unit-quasar-full - rotate: false - xy: 789, 201 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -unit-risso-full - rotate: false - xy: 1839, 1047 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -unit-spiroct-full - rotate: false - xy: 521, 148 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -unit-zenith-full - rotate: false - xy: 1267, 1513 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -wave - rotate: false - xy: 1567, 453 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -zenith-wreck0 - rotate: false - xy: 1609, 1513 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck1 - rotate: false - xy: 435, 1383 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck2 - rotate: false - xy: 435, 1269 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -shape-3 - rotate: false - xy: 1617, 322 - size: 63, 63 - orig: 63, 63 - offset: 0, 0 - index: -1 -alpha - rotate: false - xy: 1793, 997 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-cell - rotate: false - xy: 1735, 881 - 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 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-cell - rotate: false - xy: 521, 82 - size: 88, 64 - orig: 88, 64 + xy: 1889, 784 + size: 72, 72 + orig: 72, 72 offset: 0, 0 index: -1 arkyid-foot rotate: false - xy: 945, 371 + xy: 1887, 638 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-joint-base rotate: false - xy: 871, 223 + xy: 1807, 564 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 -arkyid-leg - rotate: false - xy: 1683, 1063 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 arkyid-leg-base rotate: false - xy: 1, 11 + xy: 969, 1393 size: 104, 64 orig: 104, 64 offset: 0, 0 index: -1 +arkyid-outline + rotate: false + xy: 335, 1091 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-wreck0 + rotate: false + xy: 335, 961 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-wreck1 + rotate: false + xy: 335, 831 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-wreck2 + rotate: false + xy: 335, 701 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +artillery-mount-outline + rotate: false + xy: 1789, 420 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +atrax-outline + rotate: false + xy: 1641, 593 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +atrax-wreck0 + rotate: false + xy: 1045, 21 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +atrax-wreck1 + rotate: false + xy: 1135, 21 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +atrax-wreck2 + rotate: false + xy: 1225, 21 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +beam-weapon-outline + rotate: false + xy: 1837, 858 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +block-additive-reconstructor-full + rotate: false + xy: 1075, 1361 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-air-factory-full + rotate: false + xy: 1071, 1263 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-blast-drill-full + rotate: false + xy: 465, 1221 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-command-center-full + rotate: false + xy: 1933, 504 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-container-full + rotate: false + xy: 1933, 438 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-core-foundation-full + rotate: false + xy: 465, 1091 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-core-nucleus-full + rotate: false + xy: 1, 335 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-core-shard-full + rotate: false + xy: 1071, 1165 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-cryofluidmixer-full + rotate: false + xy: 1897, 202 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cultivator-full + rotate: false + xy: 1897, 136 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cyclone-full + rotate: false + xy: 1059, 1067 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-fuse-full + rotate: false + xy: 1055, 871 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-ground-factory-full + rotate: false + xy: 1055, 773 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-impact-reactor-full + rotate: false + xy: 465, 961 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-lancer-full + rotate: false + xy: 1893, 70 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-laser-drill-full + rotate: false + xy: 1055, 675 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-liquid-tank-full + rotate: false + xy: 1055, 577 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-mass-driver-full + rotate: false + xy: 1055, 381 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-mechanical-drill-full + rotate: false + xy: 1891, 4 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-meltdown-full + rotate: false + xy: 465, 831 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-full + rotate: false + xy: 1, 173 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-naval-factory-full + rotate: false + xy: 1055, 283 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-oil-extractor-full + rotate: false + xy: 1055, 185 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-parallax-full + rotate: false + xy: 1959, 70 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-payload-conveyor-full + rotate: false + xy: 957, 143 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-conveyor-icon + rotate: false + xy: 957, 143 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-payload-router-full + rotate: false + xy: 1055, 87 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-icon + rotate: false + xy: 1055, 87 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-phase-weaver-full + rotate: false + xy: 1957, 4 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-pneumatic-drill-full + rotate: false + xy: 1961, 718 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-ripple-full + rotate: false + xy: 947, 45 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-salvo-full + rotate: false + xy: 1961, 652 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-scatter-full + rotate: false + xy: 1861, 426 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-full + rotate: false + xy: 1157, 1067 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-huge1 + rotate: false + xy: 1157, 1067 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-scrap-wall-large-full + rotate: false + xy: 1861, 360 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-segment-full + rotate: false + xy: 1927, 372 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-spectre-full + rotate: false + xy: 465, 701 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-spore-press-full + rotate: false + xy: 1899, 294 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-steam-generator-full + rotate: false + xy: 1965, 306 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-swarmer-full + rotate: false + xy: 1965, 240 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-vault-full + rotate: false + xy: 1153, 871 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-water-extractor-full + rotate: false + xy: 1963, 174 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-wave-full + rotate: false + xy: 1963, 835 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +bryde-outline + rotate: false + xy: 665, 1403 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-wreck0 + rotate: false + xy: 829, 1573 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-wreck1 + rotate: false + xy: 971, 1573 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-wreck2 + rotate: false + xy: 1113, 1573 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +core-foundation-team-crux + rotate: false + xy: 455, 311 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-foundation-team-sharded + rotate: false + xy: 455, 181 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-nucleus-team-crux + rotate: false + xy: 1583, 1887 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-nucleus-team-sharded + rotate: false + xy: 1745, 1887 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-shard-team-crux + rotate: false + xy: 1153, 577 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-shard-team-sharded + rotate: false + xy: 1153, 479 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +corvus-foot + rotate: false + xy: 1447, 262 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +corvus-joint-base + rotate: false + xy: 1789, 348 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +toxopid-joint-base + rotate: false + xy: 1789, 348 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +cracks-3-0 + rotate: false + xy: 1153, 381 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-1 + rotate: false + xy: 1153, 283 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-2 + rotate: false + xy: 1153, 185 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-3 + rotate: false + xy: 1153, 87 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-4 + rotate: false + xy: 1169, 1263 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-5 + rotate: false + xy: 1169, 1165 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-6 + rotate: false + xy: 1255, 1067 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-7 + rotate: false + xy: 1255, 969 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-4-0 + rotate: false + xy: 455, 51 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-1 + rotate: false + xy: 595, 1233 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-2 + rotate: false + xy: 595, 1103 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-3 + rotate: false + xy: 595, 973 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-4 + rotate: false + xy: 595, 843 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-5 + rotate: false + xy: 595, 713 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-6 + rotate: false + xy: 595, 583 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-7 + rotate: false + xy: 595, 453 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-5-0 + rotate: false + xy: 173, 1304 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-1 + rotate: false + xy: 173, 1142 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-2 + rotate: false + xy: 173, 980 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-3 + rotate: false + xy: 173, 818 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-4 + rotate: false + xy: 173, 656 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-5 + rotate: false + xy: 173, 494 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-6 + rotate: false + xy: 163, 332 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-7 + rotate: false + xy: 163, 170 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cyclone + rotate: false + xy: 1251, 871 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +fortress-leg + rotate: false + xy: 585, 1 + size: 80, 60 + orig: 80, 60 + offset: 0, 0 + index: -1 +fortress-outline + rotate: false + xy: 855, 866 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-wreck0 + rotate: false + xy: 855, 784 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-wreck1 + rotate: false + xy: 855, 702 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-wreck2 + rotate: false + xy: 855, 620 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fuse + rotate: false + xy: 1349, 577 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +gamma-outline + rotate: false + xy: 1683, 117 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-wreck0 + rotate: false + xy: 1753, 117 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-wreck1 + rotate: false + xy: 1863, 494 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-wreck2 + rotate: false + xy: 1611, 98 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +horizon-outline + rotate: false + xy: 1739, 752 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-wreck0 + rotate: false + xy: 1739, 678 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-wreck1 + rotate: false + xy: 1733, 604 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-wreck2 + rotate: false + xy: 1815, 784 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +large-bullet-mount-outline + rotate: false + xy: 1539, 156 + size: 70, 97 + orig: 70, 97 + offset: 0, 0 + index: -1 +large-laser-mount-outline + rotate: false + xy: 1173, 1371 + size: 96, 192 + orig: 96, 192 + offset: 0, 0 + index: -1 +large-purple-mount-outline + rotate: false + xy: 1611, 248 + size: 70, 97 + orig: 70, 97 + offset: 0, 0 + index: -1 +mass-driver + rotate: false + xy: 1565, 1369 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mega-outline + rotate: false + xy: 855, 314 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-wreck0 + rotate: false + xy: 855, 212 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-wreck1 + rotate: false + xy: 845, 110 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-wreck2 + rotate: false + xy: 969, 1209 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +meltdown + rotate: false + xy: 595, 323 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +minke-outline + rotate: false + xy: 1859, 1434 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-wreck0 + rotate: false + xy: 1949, 1434 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-wreck1 + rotate: false + xy: 1859, 1331 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-wreck2 + rotate: false + xy: 1949, 1331 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +omura-cannon-outline + rotate: false + xy: 195, 1770 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 +pulsar-outline + rotate: false + xy: 1681, 57 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck0 + rotate: false + xy: 1751, 57 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck1 + rotate: false + xy: 1827, 138 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck2 + rotate: false + xy: 1823, 78 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +quasar-leg + rotate: false + xy: 1543, 442 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-outline + rotate: false + xy: 1543, 360 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck0 + rotate: false + xy: 1627, 511 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck1 + rotate: false + xy: 1625, 429 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck2 + rotate: false + xy: 1625, 347 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +reign-leg + rotate: false + xy: 357, 1493 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +reign-weapon-outline + rotate: false + xy: 1843, 1022 + size: 83, 138 + orig: 83, 138 + offset: 0, 0 + index: -1 +ripple + rotate: false + xy: 1451, 1075 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +risso-outline + rotate: false + xy: 1683, 267 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +risso-wreck0 + rotate: false + xy: 1683, 187 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +risso-wreck1 + rotate: false + xy: 1755, 267 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +risso-wreck2 + rotate: false + xy: 1755, 187 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +scepter-leg + rotate: false + xy: 1255, 1565 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +vela-leg + rotate: false + xy: 1255, 1565 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scepter-outline + rotate: false + xy: 195, 1628 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck0 + rotate: false + xy: 389, 1907 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck1 + rotate: false + xy: 1, 1207 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck2 + rotate: false + xy: 561, 1907 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +sei-launcher-outline + rotate: false + xy: 1707, 429 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +spectre + rotate: false + xy: 1515, 1565 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +spiroct-outline + rotate: false + xy: 1447, 508 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-wreck0 + rotate: false + xy: 1545, 606 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-wreck1 + rotate: false + xy: 1643, 725 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-wreck2 + rotate: false + xy: 1447, 431 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +toxopid-foot + rotate: false + xy: 1447, 170 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +toxopid-leg + rotate: false + xy: 665, 1545 + size: 150, 72 + orig: 150, 72 + offset: 0, 0 + index: -1 +toxopid-outline + rotate: false + xy: 1037, 1715 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck0 + rotate: false + xy: 1199, 1715 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck1 + rotate: false + xy: 1361, 1695 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck2 + rotate: false + xy: 1523, 1695 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +unit-arkyid-full + rotate: false + xy: 1775, 1565 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +unit-atrax-full + rotate: false + xy: 1855, 1265 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +unit-bryde-full + rotate: false + xy: 357, 1351 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +unit-fortress-full + rotate: false + xy: 957, 1127 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +unit-gamma-full + rotate: false + xy: 1821, 8 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +unit-horizon-full + rotate: false + xy: 1887, 710 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +unit-mega-full + rotate: false + xy: 957, 1025 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +unit-minke-full + rotate: false + xy: 1855, 1162 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +unit-pulsar-full + rotate: false + xy: 1928, 967 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +unit-quasar-full + rotate: false + xy: 1707, 347 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +unit-risso-full + rotate: false + xy: 1827, 268 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +unit-scepter-full + rotate: false + xy: 1, 1065 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +unit-spiroct-full + rotate: false + xy: 1447, 354 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +unit-toxopid-full + rotate: false + xy: 1685, 1695 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +unit-vela-full + rotate: false + xy: 733, 1907 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +unit-zenith-full + rotate: false + xy: 1905, 1651 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +vault-team-crux + rotate: false + xy: 1447, 585 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vault-team-sharded + rotate: false + xy: 1545, 683 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vela-outline + rotate: false + xy: 1, 781 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck0 + rotate: false + xy: 1, 639 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck1 + rotate: false + xy: 1249, 1907 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck2 + rotate: false + xy: 1, 497 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +zenith-outline + rotate: false + xy: 931, 1459 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck0 + rotate: false + xy: 1045, 1459 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck1 + rotate: false + xy: 855, 1345 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck2 + rotate: false + xy: 855, 1231 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +arkyid + rotate: false + xy: 499, 1363 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-cell + rotate: false + xy: 335, 1221 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 atrax rotate: false - xy: 513, 16 + xy: 1447, 104 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 atrax-base rotate: false - xy: 1017, 278 + xy: 1925, 901 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 atrax-cell rotate: false - xy: 629, 483 + xy: 1643, 659 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 -atrax-foot - rotate: false - xy: 1619, 519 - 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: 1735, 781 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-cell - rotate: false - xy: 1943, 997 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 bryde rotate: false - xy: 163, 1425 + xy: 1907, 1907 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 bryde-cell rotate: false - xy: 163, 1283 + xy: 1907, 1765 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 -chaos-array-base +corvus-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: 1943, 947 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-base - rotate: false - xy: 1993, 997 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-cell - rotate: false - xy: 1993, 947 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-leg - rotate: false - xy: 1677, 549 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger - rotate: false - xy: 1213, 21 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-base - rotate: false - xy: 1263, 7 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-leg - rotate: false - xy: 1313, 7 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -eradicator - rotate: false - xy: 1, 77 + xy: 367, 1619 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: 1613, 7 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 fortress rotate: false - xy: 435, 1187 + xy: 969, 1311 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 -fortress-base - rotate: false - xy: 1289, 783 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 fortress-cell rotate: false - xy: 651, 1415 + xy: 855, 948 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 -fortress-leg - rotate: false - xy: 611, 75 - size: 80, 60 - orig: 80, 60 - offset: 0, 0 - index: -1 gamma rotate: false - xy: 1617, 264 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-cell - rotate: false - xy: 1619, 851 - size: 56, 56 - orig: 56, 56 + xy: 1827, 198 + size: 68, 68 + orig: 68, 68 offset: 0, 0 index: -1 horizon rotate: false - xy: 603, 1 + xy: 1315, 13 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 horizon-cell rotate: false - xy: 677, 1 + xy: 1741, 826 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -mace - rotate: false - xy: 1287, 321 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-base - rotate: false - xy: 1287, 255 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-cell - rotate: false - xy: 1353, 387 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-leg - rotate: false - xy: 1353, 321 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 mega rotate: false - xy: 435, 1003 + xy: 855, 518 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 mega-cell rotate: false - xy: 435, 901 + xy: 855, 416 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 minke rotate: false - xy: 1787, 1667 - size: 128, 128 - orig: 128, 128 + xy: 1447, 1 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 minke-cell rotate: false - xy: 1917, 1667 + xy: 585, 63 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -mono +omura-cannon-heat rotate: false - xy: 1985, 847 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-cell - rotate: false - xy: 1985, 797 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova - rotate: false - xy: 1619, 619 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-base - rotate: false - xy: 1985, 547 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-cell - rotate: false - xy: 1619, 561 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-leg - rotate: false - xy: 1985, 497 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -poly - rotate: false - xy: 1677, 947 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-cell - rotate: false - xy: 1677, 889 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -power-cell - rotate: false - xy: 1677, 657 - size: 56, 56 - orig: 56, 56 + xy: 1, 1770 + size: 192, 277 + orig: 192, 277 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: 1827, 497 - 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: 1419, 255 - size: 64, 64 - orig: 64, 64 + xy: 1609, 38 + size: 68, 58 + orig: 68, 58 offset: 0, 0 index: -1 quasar rotate: false - xy: 719, 447 + xy: 1945, 1109 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-base rotate: false - xy: 801, 447 + xy: 1928, 1027 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 quasar-cell rotate: false - xy: 707, 365 + xy: 1545, 524 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 -quasar-leg +reign-base rotate: false - xy: 707, 283 - size: 80, 80 - orig: 80, 80 + xy: 521, 1619 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +reign-cell + rotate: false + xy: 675, 1619 + size: 152, 124 + orig: 152, 124 offset: 0, 0 index: -1 risso rotate: false - xy: 1937, 1243 - size: 96, 96 - orig: 96, 96 + xy: 1611, 168 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 risso-cell rotate: false - xy: 1349, 1219 + xy: 1549, 1075 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +scepter + rotate: false + xy: 1, 1349 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-base + rotate: false + xy: 725, 233 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +vela-base + rotate: false + xy: 725, 233 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scepter-cell + rotate: false + xy: 715, 103 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 spiroct rotate: false - xy: 533, 533 + xy: 1643, 802 size: 94, 75 orig: 94, 75 offset: 0, 0 index: -1 spiroct-cell rotate: false - xy: 521, 456 + xy: 1741, 900 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: 875, 1715 + 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: 511, 1493 + size: 152, 124 + orig: 152, 124 offset: 0, 0 index: -1 -spiroct-leg-base +vela rotate: false - xy: 1723, 1541 - size: 48, 34 - orig: 48, 34 + xy: 1, 923 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 -vanguard +vela-cell rotate: false - xy: 157, 15 - size: 48, 48 - orig: 48, 48 + xy: 905, 1907 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 -vanguard-cell +vela-weapon-heat rotate: false - xy: 207, 15 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -antumbra-missiles - rotate: false - xy: 1843, 947 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -artillery - rotate: false - xy: 1893, 989 - size: 48, 56 - orig: 48, 56 + xy: 1077, 1907 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 artillery-mount rotate: false - xy: 945, 299 + xy: 1791, 492 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 beam-weapon rotate: false - xy: 617, 137 + xy: 1843, 940 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 -chaos - rotate: false - xy: 1619, 909 - size: 56, 136 - orig: 56, 136 - offset: 0, 0 - index: -1 -eradication - rotate: false - xy: 1125, 911 - size: 96, 192 - orig: 96, 192 - offset: 0, 0 - index: -1 -eruption - rotate: false - xy: 1785, 873 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -flakgun - rotate: false - xy: 1563, 7 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flamethrower - rotate: false - xy: 1785, 815 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -heal-shotgun-weapon - rotate: false - xy: 1785, 615 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon - rotate: false - xy: 1835, 897 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -heal-weapon-mount - rotate: false - xy: 1835, 847 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -large-artillery - rotate: false - xy: 1935, 871 - size: 48, 66 - orig: 48, 66 - offset: 0, 0 - index: -1 large-bullet-mount rotate: false - xy: 1017, 344 + xy: 1539, 255 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-laser-mount rotate: false - xy: 1251, 1303 + xy: 1349, 187 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 -large-weapon +large-purple-mount rotate: false - xy: 1935, 821 - size: 48, 48 - orig: 48, 48 + xy: 1537, 57 + size: 70, 97 + orig: 70, 97 offset: 0, 0 index: -1 -missiles +omura-cannon-heat rotate: false - xy: 1935, 571 - size: 48, 48 - orig: 48, 48 + xy: 1, 1491 + size: 192, 277 + orig: 192, 277 offset: 0, 0 index: -1 -missiles-mount +reign-weapon rotate: false - xy: 1985, 897 - size: 48, 48 - orig: 48, 48 + xy: 1945, 1191 + size: 83, 138 + orig: 83, 138 offset: 0, 0 index: -1 -mount-purple-weapon +sei-launcher rotate: false - xy: 1985, 597 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mount-weapon - rotate: false - xy: 1935, 521 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-basic-weapon - rotate: false - xy: 1977, 447 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-mount-weapon - rotate: false - xy: 1663, 7 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -small-weapon - rotate: false - xy: 1675, 272 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spiroct-weapon - rotate: false - xy: 1671, 114 - size: 48, 56 - orig: 48, 56 - offset: 0, 0 - index: -1 -weapon - rotate: false - xy: 1682, 337 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -zenith-missiles - rotate: false - xy: 1633, 465 - size: 48, 48 - orig: 48, 48 + xy: 1709, 511 + size: 80, 80 + orig: 80, 80 offset: 0, 0 index: -1 zenith rotate: false - xy: 1381, 1513 + xy: 1905, 1537 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-cell rotate: false - xy: 1495, 1513 + xy: 817, 1459 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 -sprites3.png -size: 1024,256 +sprites4.png +size: 2048,1024 format: rgba8888 filter: nearest,nearest repeat: none +launchpod + rotate: false + xy: 397, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mend-projector + rotate: false + xy: 199, 563 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mend-projector-top + rotate: false + xy: 265, 629 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 mender rotate: false - xy: 341, 19 + xy: 1577, 697 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender-top rotate: false - xy: 375, 53 + xy: 1611, 697 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +overdrive-projector + rotate: false + xy: 331, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +overdrive-projector-top + rotate: false + xy: 397, 761 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 shock-mine rotate: false - xy: 579, 19 + xy: 1981, 601 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-arrow + rotate: false + xy: 1849, 737 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor + rotate: false + xy: 1985, 771 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-bridge + rotate: false + xy: 1985, 737 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-end + rotate: false + xy: 331, 335 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +center + rotate: false + xy: 330, 301 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-0 + rotate: false + xy: 2013, 907 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-armored-conveyor-full + rotate: false + xy: 2013, 907 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-1 + rotate: false + xy: 1727, 849 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-2 + rotate: false + xy: 1761, 879 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-3 + rotate: false + xy: 1795, 879 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-0 + rotate: false + xy: 1829, 879 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-1 + rotate: false + xy: 2013, 873 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-2 + rotate: false + xy: 893, 825 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-3 + rotate: false + xy: 927, 825 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-0 + rotate: false + xy: 931, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-1 + rotate: false + xy: 965, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-2 + rotate: false + xy: 999, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-3 + rotate: false + xy: 1033, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-0 + rotate: false + xy: 1067, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-1 + rotate: false + xy: 1101, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-2 + rotate: false + xy: 1135, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-3 + rotate: false + xy: 1169, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-0 + rotate: false + xy: 1203, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-1 + rotate: false + xy: 1237, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-2 + rotate: false + xy: 1271, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-3 + rotate: false + xy: 1305, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-1 + rotate: false + xy: 1063, 757 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-2 + rotate: false + xy: 961, 655 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-3 + rotate: false + xy: 995, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 1, 223 + xy: 1029, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 1, 189 + xy: 1097, 757 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 35, 223 + xy: 961, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 1, 155 + xy: 995, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 35, 189 + xy: 1029, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 69, 223 + xy: 1063, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1, 121 + xy: 1131, 757 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 35, 155 + xy: 995, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 69, 189 + xy: 1029, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 103, 223 + xy: 1063, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 1, 87 + xy: 1097, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 35, 121 + xy: 1165, 757 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 69, 155 + xy: 1029, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 103, 189 + xy: 1063, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 137, 223 + xy: 1097, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1, 53 + xy: 1131, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor rotate: false - xy: 409, 19 + xy: 1641, 663 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-0 rotate: false - xy: 443, 53 + xy: 1641, 629 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-1 rotate: false - xy: 477, 87 + xy: 1675, 663 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-2 rotate: false - xy: 511, 121 + xy: 1675, 629 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-edge rotate: false - xy: 545, 155 + xy: 1573, 595 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-stack rotate: false - xy: 579, 189 + xy: 1607, 595 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 851, 223 + xy: 1777, 539 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 681, 19 + xy: 1811, 539 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 715, 53 + xy: 1845, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 749, 87 + xy: 1879, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 783, 121 + xy: 1913, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 817, 155 + xy: 1947, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 851, 189 + xy: 1981, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 885, 223 + xy: 2015, 533 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 715, 19 + xy: 1437, 561 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 749, 53 + xy: 1471, 561 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 783, 87 + xy: 1505, 531 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 817, 121 + xy: 1539, 529 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 851, 155 + xy: 1573, 527 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 885, 189 + xy: 1607, 527 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 919, 223 + xy: 1641, 527 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 749, 19 + xy: 1675, 527 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 783, 53 + xy: 1709, 509 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 817, 87 + xy: 1743, 505 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 851, 121 + xy: 1777, 505 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cross rotate: false - xy: 137, 155 + xy: 1199, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +distributor + rotate: false + xy: 199, 761 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 inverted-sorter rotate: false - xy: 69, 19 + xy: 1267, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 239, 19 + xy: 1747, 709 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 477, 155 + xy: 1505, 667 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 443, 87 + xy: 1539, 597 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 477, 121 + xy: 1573, 663 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 511, 155 + xy: 1573, 629 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 545, 189 + xy: 1607, 663 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 613, 121 + xy: 1985, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 647, 87 + xy: 1709, 577 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 underflow-gate rotate: false - xy: 953, 223 + xy: 1879, 499 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +drill-top + rotate: false + xy: 397, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-liquid + rotate: false + xy: 397, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mechanical-drill + rotate: false + xy: 529, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mechanical-drill-rotator + rotate: false + xy: 1, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mechanical-drill-top + rotate: false + xy: 67, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pneumatic-drill + rotate: false + xy: 331, 629 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pneumatic-drill-rotator + rotate: false + xy: 397, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pneumatic-drill-top + rotate: false + xy: 463, 761 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor + rotate: false + xy: 727, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-liquid + rotate: false + xy: 793, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-rotator + rotate: false + xy: 859, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-top + rotate: false + xy: 1, 35 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-border + rotate: false + xy: 397, 8 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-middle + rotate: false + xy: 465, 8 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-select + rotate: false + xy: 1645, 765 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-liquid + rotate: false + xy: 961, 757 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit + rotate: false + xy: 1883, 737 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-arrow + rotate: false + xy: 1917, 737 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-arrow + rotate: false + xy: 1917, 737 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-bridge + rotate: false + xy: 1951, 771 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-end + rotate: false + xy: 1951, 737 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom + rotate: false + xy: 811, 327 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-0 + rotate: false + xy: 811, 293 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-1 + rotate: false + xy: 927, 753 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-2 + rotate: false + xy: 927, 719 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-3 + rotate: false + xy: 927, 719 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-4 + rotate: false + xy: 927, 719 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-0 + rotate: false + xy: 995, 757 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-1 + rotate: false + xy: 961, 723 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-2 + rotate: false + xy: 1029, 757 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-3 + rotate: false + xy: 961, 689 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-3 + rotate: false + xy: 961, 689 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-4 + rotate: false + xy: 995, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 341, 121 + xy: 1849, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate rotate: false - xy: 443, 223 + xy: 1951, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate-top rotate: false - xy: 273, 19 + xy: 1985, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 307, 53 + xy: 1403, 591 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 341, 87 + xy: 1441, 731 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 375, 121 + xy: 1475, 731 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 409, 121 + xy: 1471, 629 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump-liquid rotate: false - xy: 443, 155 + xy: 1471, 595 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-liquid rotate: false - xy: 443, 155 + xy: 1471, 595 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-pump-liquid rotate: false - xy: 443, 155 + xy: 1471, 595 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 511, 189 + xy: 1505, 633 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 545, 223 + xy: 1505, 599 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 375, 19 + xy: 1539, 665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 409, 53 + xy: 1539, 631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-cap rotate: false - xy: 443, 19 + xy: 1675, 595 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-0 rotate: false - xy: 477, 53 + xy: 1713, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-1 rotate: false - xy: 511, 87 + xy: 1747, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-2 rotate: false - xy: 545, 121 + xy: 1781, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-3 rotate: false - xy: 579, 155 + xy: 1815, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-4 rotate: false - xy: 613, 189 + xy: 1709, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 545, 87 + xy: 1811, 641 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 579, 121 + xy: 1743, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 613, 155 + xy: 1777, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 647, 189 + xy: 1811, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +rotary-pump + rotate: false + xy: 133, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +logic-processor + rotate: false + xy: 463, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +memory-bank + rotate: false + xy: 133, 497 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 memory-cell rotate: false - xy: 511, 223 + xy: 1543, 699 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 409, 87 + xy: 1645, 697 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor rotate: false - xy: 443, 121 + xy: 1679, 697 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch rotate: false - xy: 749, 121 + xy: 1675, 561 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch-on rotate: false - xy: 783, 155 + xy: 1709, 543 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +battery + rotate: false + xy: 1339, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +battery-top + rotate: false + xy: 1761, 845 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +combustion-generator + rotate: false + xy: 743, 293 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +combustion-generator-top + rotate: false + xy: 777, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 diode rotate: false - xy: 171, 189 + xy: 1267, 757 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 diode-arrow rotate: false - xy: 205, 223 + xy: 1131, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator rotate: false - xy: 171, 155 + xy: 1165, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-top rotate: false - xy: 205, 189 + xy: 1199, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node rotate: false - xy: 647, 223 + xy: 1709, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +power-node-large + rotate: false + xy: 529, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 power-source rotate: false - xy: 477, 19 + xy: 1743, 641 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 511, 53 + xy: 1777, 641 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +rtg-generator + rotate: false + xy: 199, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 rtg-generator-top rotate: false - xy: 647, 155 + xy: 1845, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 613, 53 + xy: 2015, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +steam-generator + rotate: false + xy: 793, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-cap + rotate: false + xy: 1, 101 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-top + rotate: false + xy: 67, 167 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine0 + rotate: false + xy: 133, 233 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine1 + rotate: false + xy: 199, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +surge-tower + rotate: false + xy: 265, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thermal-generator + rotate: false + xy: 463, 563 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +coal-centrifuge + rotate: false + xy: 1, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cryofluidmixer-bottom + rotate: false + xy: 199, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cryofluidmixer-liquid + rotate: false + xy: 265, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cryofluidmixer-top + rotate: false + xy: 331, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cultivator + rotate: false + xy: 1, 563 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cultivator-middle + rotate: false + xy: 67, 629 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cultivator-top + rotate: false + xy: 133, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +graphite-press + rotate: false + xy: 67, 563 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 incinerator rotate: false - xy: 239, 223 + xy: 1233, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 307, 155 + xy: 1403, 693 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 409, 223 + xy: 1713, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +kiln + rotate: false + xy: 133, 629 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +kiln-top + rotate: false + xy: 199, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +silicon-smelter-top + rotate: false + xy: 199, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 liquid-source rotate: false - xy: 477, 223 + xy: 1437, 663 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-void rotate: false - xy: 307, 19 + xy: 1437, 629 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 477, 189 + xy: 1509, 701 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +phase-weaver + rotate: false + xy: 595, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +phase-weaver-bottom + rotate: false + xy: 1, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +phase-weaver-weave + rotate: false + xy: 67, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plastanium-compressor + rotate: false + xy: 133, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plastanium-compressor-top + rotate: false + xy: 199, 497 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 pulverizer rotate: false - xy: 681, 223 + xy: 1849, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 511, 19 + xy: 1883, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +pyratite-mixer + rotate: false + xy: 661, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +separator + rotate: false + xy: 133, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +separator-liquid + rotate: false + xy: 199, 365 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +separator-spinner + rotate: false + xy: 265, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +silicon-smelter + rotate: false + xy: 331, 497 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press + rotate: false + xy: 397, 563 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame0 + rotate: false + xy: 463, 629 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame1 + rotate: false + xy: 529, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame2 + rotate: false + xy: 595, 761 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-liquid + rotate: false + xy: 661, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-top + rotate: false + xy: 727, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +boulder1 + rotate: false + xy: 393, 347 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +boulder2 + rotate: false + xy: 529, 523 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder1 + rotate: false + xy: 443, 347 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder2 + rotate: false + xy: 457, 447 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 sand-boulder1 rotate: false - xy: 681, 189 + xy: 1879, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-boulder2 rotate: false - xy: 715, 223 + xy: 1913, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder1 rotate: false - xy: 715, 189 + xy: 1913, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder2 rotate: false - xy: 749, 223 + xy: 1947, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +snow-boulder1 + rotate: false + xy: 761, 671 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +snow-boulder2 + rotate: false + xy: 811, 669 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spore-cluster1 + rotate: false + xy: 1261, 825 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +spore-cluster2 + rotate: false + xy: 1303, 825 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +spore-cluster3 + rotate: false + xy: 1345, 825 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +container + rotate: false + xy: 133, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team + rotate: false + xy: 1, 761 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 unloader rotate: false - xy: 783, 19 + xy: 1913, 499 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-center rotate: false - xy: 817, 53 + xy: 1947, 499 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +arc-heat + rotate: false + xy: 1727, 883 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-1 + rotate: false + xy: 1795, 845 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hail-heat + rotate: false + xy: 1517, 879 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +lancer-heat + rotate: false + xy: 331, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +salvo-heat + rotate: false + xy: 331, 563 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +salvo-panel-left + rotate: false + xy: 397, 629 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +salvo-panel-right + rotate: false + xy: 463, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 scorch-heat rotate: false - xy: 579, 53 + xy: 1981, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +wave-liquid + rotate: false + xy: 133, 167 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +wave-top + rotate: false + xy: 199, 233 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center + rotate: false + xy: 1, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center-team + rotate: false + xy: 67, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +rally-point + rotate: false + xy: 1, 233 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 repair-point-base rotate: false - xy: 579, 87 + xy: 1951, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +resupply-point + rotate: false + xy: 67, 299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 copper-wall rotate: false - xy: 35, 87 + xy: 1199, 757 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +copper-wall-large + rotate: false + xy: 199, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 door rotate: false - xy: 35, 19 + xy: 1165, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +door-large + rotate: false + xy: 265, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +door-large-open + rotate: false + xy: 331, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 door-open rotate: false - xy: 69, 53 + xy: 1199, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 579, 223 + xy: 1607, 629 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +phase-wall-large + rotate: false + xy: 529, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 plastanium-wall rotate: false - xy: 613, 223 + xy: 1641, 595 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +plastanium-wall-large + rotate: false + xy: 265, 563 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-large1 + rotate: false + xy: 595, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-large2 + rotate: false + xy: 661, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-large3 + rotate: false + xy: 727, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-large4 + rotate: false + xy: 1, 167 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 scrap-wall2 rotate: false - xy: 613, 87 + xy: 2015, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 647, 121 + xy: 1845, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 681, 155 + xy: 1879, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 681, 155 + xy: 1879, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 715, 87 + xy: 1641, 561 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +surge-wall-large + rotate: false + xy: 331, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 thorium-wall rotate: false - xy: 817, 189 + xy: 1743, 539 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +thorium-wall-large + rotate: false + xy: 529, 629 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 titanium-wall rotate: false - xy: 885, 155 + xy: 1811, 505 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +titanium-wall-large + rotate: false + xy: 595, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +bullet + rotate: false + xy: 1737, 971 + size: 52, 52 + orig: 52, 52 + offset: 0, 0 + index: -1 +bullet-back + rotate: false + xy: 1791, 971 + size: 52, 52 + orig: 52, 52 + offset: 0, 0 + index: -1 casing rotate: false - xy: 361, 1 + xy: 497, 429 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 circle-mid rotate: false - xy: 1005, 30 + xy: 2045, 672 size: 1, 199 orig: 1, 199 offset: 0, 0 index: -1 +error + rotate: false + xy: 571, 473 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 laser rotate: false - xy: 877, 43 + xy: 469, 297 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser rotate: false - xy: 989, 121 + xy: 745, 605 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 +missile + rotate: false + xy: 893, 787 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +missile-back + rotate: false + xy: 1387, 829 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 parallax-laser rotate: false - xy: 995, 121 + xy: 751, 605 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 +particle + rotate: false + xy: 1219, 825 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 scale_marker rotate: false - xy: 879, 115 + xy: 1, 1 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 +shell + rotate: false + xy: 1425, 833 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +shell-back + rotate: false + xy: 1463, 833 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 transfer rotate: false - xy: 883, 53 + xy: 587, 579 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 919, 189 + xy: 1845, 499 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white rotate: false - xy: 1013, 252 + xy: 275, 1 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 +alpha-outline + rotate: false + xy: 1563, 919 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-wreck0 + rotate: false + xy: 1613, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-wreck1 + rotate: false + xy: 1663, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-wreck2 + rotate: false + xy: 1713, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +arc + rotate: false + xy: 2013, 941 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +arkyid-leg + rotate: false + xy: 463, 505 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +artillery-outline + rotate: false + xy: 1813, 913 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +atrax-foot + rotate: false + xy: 67, 1 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +atrax-joint + rotate: false + xy: 39, 7 + size: 26, 26 + orig: 26, 26 + offset: 0, 0 + index: -1 +atrax-leg + rotate: false + xy: 325, 14 + size: 36, 26 + orig: 36, 26 + offset: 0, 0 + index: -1 +atrax-leg-base + rotate: false + xy: 1, 7 + size: 36, 26 + orig: 36, 26 + offset: 0, 0 + index: -1 +beta-outline + rotate: false + xy: 595, 639 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-wreck0 + rotate: false + xy: 661, 705 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-wreck1 + rotate: false + xy: 727, 771 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-wreck2 + rotate: false + xy: 793, 837 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +block-arc-full + rotate: false + xy: 1829, 845 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-basalt-full + rotate: false + xy: 363, 8 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-boulder-full + rotate: false + xy: 1913, 923 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-char-full + rotate: false + xy: 431, 8 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conduit-full + rotate: false + xy: 1863, 839 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conveyor-full + rotate: false + xy: 1897, 839 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-0 + rotate: false + xy: 1897, 839 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-craters-full + rotate: false + xy: 1931, 839 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-boulder-full + rotate: false + xy: 1963, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dacite-full + rotate: false + xy: 1965, 841 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-wall-full + rotate: false + xy: 1727, 815 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-metal-full + rotate: false + xy: 1761, 811 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-full + rotate: false + xy: 1795, 811 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-full + rotate: false + xy: 1829, 811 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-full + rotate: false + xy: 1863, 805 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dune-wall-full + rotate: false + xy: 1897, 805 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-duo-full + rotate: false + xy: 1931, 805 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-grass-full + rotate: false + xy: 1965, 807 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hail-full + rotate: false + xy: 1999, 839 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hotrock-full + rotate: false + xy: 1999, 805 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-full + rotate: false + xy: 1373, 791 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-full + rotate: false + xy: 1407, 795 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-wall-full + rotate: false + xy: 1441, 799 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-router-full + rotate: false + xy: 1475, 799 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-magmarock-full + rotate: false + xy: 1509, 803 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-full + rotate: false + xy: 1543, 801 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-moss-full + rotate: false + xy: 721, 463 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mud-full + rotate: false + xy: 707, 429 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-coal-full + rotate: false + xy: 741, 429 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-copper-full + rotate: false + xy: 755, 463 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-lead-full + rotate: false + xy: 747, 395 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-scrap-full + rotate: false + xy: 747, 361 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-thorium-full + rotate: false + xy: 743, 327 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-titanium-full + rotate: false + xy: 775, 429 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pebbles-full + rotate: false + xy: 781, 395 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plated-conduit-full + rotate: false + xy: 781, 361 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulse-conduit-full + rotate: false + xy: 777, 327 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-full + rotate: false + xy: 1577, 799 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-repair-point-full + rotate: false + xy: 1611, 799 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-wall-full + rotate: false + xy: 1645, 799 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-boulder-full + rotate: false + xy: 1679, 799 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-full + rotate: false + xy: 1509, 769 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-wall-full + rotate: false + xy: 1543, 767 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scorch-full + rotate: false + xy: 1577, 765 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-full + rotate: false + xy: 1611, 765 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall1 + rotate: false + xy: 1611, 765 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-boulder-full + rotate: false + xy: 1679, 765 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-full + rotate: false + xy: 1713, 781 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-wall-full + rotate: false + xy: 1713, 747 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-full + rotate: false + xy: 1747, 777 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-boulder-full + rotate: false + xy: 397, 397 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-full + rotate: false + xy: 1781, 777 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-wall-full + rotate: false + xy: 1815, 777 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-cluster-full + rotate: false + xy: 109, 1 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-full + rotate: false + xy: 1747, 743 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-wall-full + rotate: false + xy: 1781, 743 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-full + rotate: false + xy: 1815, 743 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-full + rotate: false + xy: 1849, 771 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tendrils-full + rotate: false + xy: 1883, 771 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-conveyor-full + rotate: false + xy: 1917, 771 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-0 + rotate: false + xy: 1917, 771 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +command-center-team-crux + rotate: false + xy: 1, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center-team-sharded + rotate: false + xy: 67, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team-crux + rotate: false + xy: 67, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team-sharded + rotate: false + xy: 133, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +corvus-joint + rotate: false + xy: 331, 369 + size: 60, 60 + orig: 60, 60 + offset: 0, 0 + index: -1 +corvus-leg + rotate: false + xy: 1981, 463 + size: 30, 68 + orig: 30, 68 + offset: 0, 0 + index: -1 +corvus-leg-base + rotate: false + xy: 729, 539 + size: 30, 64 + orig: 30, 64 + offset: 0, 0 + index: -1 cracks-1-0 rotate: false - xy: 69, 121 + xy: 1063, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-1 rotate: false - xy: 103, 155 + xy: 1097, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-2 rotate: false - xy: 137, 189 + xy: 1131, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-3 rotate: false - xy: 171, 223 + xy: 1165, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-4 rotate: false - xy: 1, 19 + xy: 1233, 757 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-5 rotate: false - xy: 35, 53 + xy: 1097, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-6 rotate: false - xy: 69, 87 + xy: 1131, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-7 rotate: false - xy: 103, 121 + xy: 1165, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +cracks-2-0 + rotate: false + xy: 1, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-1 + rotate: false + xy: 67, 761 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-2 + rotate: false + xy: 133, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-3 + rotate: false + xy: 199, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-4 + rotate: false + xy: 265, 959 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-5 + rotate: false + xy: 1, 629 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-6 + rotate: false + xy: 67, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-7 + rotate: false + xy: 133, 761 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +crawler-leg + rotate: false + xy: 793, 787 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-outline + rotate: false + xy: 1863, 873 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck0 + rotate: false + xy: 1913, 873 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck1 + rotate: false + xy: 1963, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck2 + rotate: false + xy: 447, 397 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-leg + rotate: false + xy: 497, 373 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-outline + rotate: false + xy: 493, 323 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck0 + rotate: false + xy: 557, 423 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck1 + rotate: false + xy: 547, 373 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-wreck2 + rotate: false + xy: 543, 323 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 duo rotate: false - xy: 103, 87 + xy: 1233, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +eruption-outline + rotate: false + xy: 191, 109 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flamethrower-outline + rotate: false + xy: 225, 51 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flare-outline + rotate: false + xy: 225, 1 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck0 + rotate: false + xy: 607, 423 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck1 + rotate: false + xy: 597, 373 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck2 + rotate: false + xy: 593, 323 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 hail rotate: false - xy: 137, 121 + xy: 1301, 757 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +heal-shotgun-weapon-outline + rotate: false + xy: 1897, 973 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +heal-weapon-mount-outline + rotate: false + xy: 647, 373 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +heal-weapon-outline + rotate: false + xy: 643, 323 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-blast-compound-large + rotate: false + xy: 1559, 877 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-blast-compound-medium rotate: false - xy: 137, 87 + xy: 1199, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 885, 129 + xy: 1417, 941 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-blast-compound-tiny rotate: false - xy: 1, 1 + xy: 151, 25 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-blast-compound-xlarge + rotate: false + xy: 697, 373 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-coal-large + rotate: false + xy: 1601, 875 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-coal-medium rotate: false - xy: 205, 155 + xy: 1267, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-small rotate: false - xy: 919, 163 + xy: 365, 343 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-coal-tiny rotate: false - xy: 19, 1 + xy: 475, 329 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-coal-xlarge + rotate: false + xy: 693, 323 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-copper-large + rotate: false + xy: 1643, 875 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-copper-medium rotate: false - xy: 273, 223 + xy: 1369, 757 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-small rotate: false - xy: 953, 197 + xy: 2013, 507 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-copper-tiny rotate: false - xy: 37, 1 + xy: 1417, 923 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-copper-xlarge + rotate: false + xy: 265, 192 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-graphite-large + rotate: false + xy: 1685, 875 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-graphite-medium rotate: false - xy: 137, 53 + xy: 1267, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-small rotate: false - xy: 987, 231 + xy: 2013, 481 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-graphite-tiny rotate: false - xy: 55, 1 + xy: 815, 411 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-graphite-xlarge + rotate: false + xy: 257, 142 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-lead-large + rotate: false + xy: 861, 541 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-lead-medium rotate: false - xy: 205, 121 + xy: 1335, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-small rotate: false - xy: 817, 27 + xy: 761, 587 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-lead-tiny rotate: false - xy: 73, 1 + xy: 787, 595 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-lead-xlarge + rotate: false + xy: 917, 909 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-metaglass-large + rotate: false + xy: 903, 529 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-metaglass-medium rotate: false - xy: 273, 189 + xy: 1301, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-small rotate: false - xy: 817, 1 + xy: 761, 561 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-metaglass-tiny rotate: false - xy: 91, 1 + xy: 761, 543 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-metaglass-xlarge + rotate: false + xy: 967, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-phase-fabric-large + rotate: false + xy: 945, 529 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-phase-fabric-medium rotate: false - xy: 137, 19 + xy: 1369, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-small rotate: false - xy: 851, 67 + xy: 2013, 455 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-phase-fabric-tiny rotate: false - xy: 109, 1 + xy: 151, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-phase-fabric-xlarge + rotate: false + xy: 1017, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-plastanium-large + rotate: false + xy: 1517, 837 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-plastanium-medium rotate: false - xy: 205, 87 + xy: 1335, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-small rotate: false - xy: 851, 41 + xy: 2019, 779 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-plastanium-tiny rotate: false - xy: 127, 1 + xy: 815, 393 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-plastanium-xlarge + rotate: false + xy: 1067, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-pyratite-large + rotate: false + xy: 1559, 835 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-pyratite-medium rotate: false - xy: 273, 155 + xy: 1335, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-small rotate: false - xy: 843, 15 + xy: 2019, 753 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-pyratite-tiny rotate: false - xy: 145, 1 + xy: 787, 577 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-pyratite-xlarge + rotate: false + xy: 1117, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-sand-large + rotate: false + xy: 1601, 833 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-sand-medium rotate: false - xy: 341, 223 + xy: 1369, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-small rotate: false - xy: 885, 103 + xy: 2019, 727 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-sand-tiny rotate: false - xy: 163, 1 + xy: 815, 375 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-sand-xlarge + rotate: false + xy: 1167, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-scrap-large + rotate: false + xy: 1643, 833 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-scrap-medium rotate: false - xy: 205, 53 + xy: 1441, 765 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-small rotate: false - xy: 911, 129 + xy: 2019, 701 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-scrap-tiny rotate: false - xy: 181, 1 + xy: 787, 559 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-scrap-xlarge + rotate: false + xy: 1217, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-silicon-large + rotate: false + xy: 1685, 833 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-silicon-medium rotate: false - xy: 273, 121 + xy: 1403, 727 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-small rotate: false - xy: 911, 103 + xy: 2019, 675 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-silicon-tiny rotate: false - xy: 199, 1 + xy: 763, 525 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-silicon-xlarge + rotate: false + xy: 1267, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-spore-pod-large + rotate: false + xy: 851, 851 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-spore-pod-medium rotate: false - xy: 375, 223 + xy: 1403, 625 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-small rotate: false - xy: 945, 163 + xy: 241, 116 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-spore-pod-tiny rotate: false - xy: 217, 1 + xy: 763, 507 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-spore-pod-xlarge + rotate: false + xy: 1317, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-surge-alloy-large + rotate: false + xy: 721, 497 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-surge-alloy-medium rotate: false - xy: 239, 53 + xy: 1543, 733 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 937, 137 + xy: 365, 317 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-surge-alloy-tiny rotate: false - xy: 235, 1 + xy: 893, 883 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-surge-alloy-xlarge + rotate: false + xy: 1367, 917 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-thorium-large + rotate: false + xy: 967, 825 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-thorium-medium rotate: false - xy: 307, 121 + xy: 1611, 731 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 937, 111 + xy: 391, 321 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-thorium-tiny rotate: false - xy: 253, 1 + xy: 893, 865 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-thorium-xlarge + rotate: false + xy: 777, 721 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-titanium-large + rotate: false + xy: 1009, 825 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 item-titanium-medium rotate: false - xy: 375, 189 + xy: 1679, 731 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 979, 197 + xy: 417, 321 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-titanium-tiny rotate: false - xy: 271, 1 + xy: 475, 311 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +item-titanium-xlarge + rotate: false + xy: 843, 787 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +lancer + rotate: false + xy: 265, 761 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +large-artillery-outline + rotate: false + xy: 877, 719 + size: 48, 66 + orig: 48, 66 + offset: 0, 0 + index: -1 +large-weapon-outline + rotate: false + xy: 629, 539 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-cryofluid-large + rotate: false + xy: 1051, 825 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 liquid-cryofluid-medium rotate: false - xy: 307, 87 + xy: 1815, 709 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-small rotate: false - xy: 971, 171 + xy: 443, 321 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-cryofluid-tiny rotate: false - xy: 289, 1 + xy: 493, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +liquid-cryofluid-xlarge + rotate: false + xy: 679, 539 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-oil-large + rotate: false + xy: 1093, 825 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 liquid-oil-medium rotate: false - xy: 409, 189 + xy: 1917, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-small rotate: false - xy: 869, 15 + xy: 809, 429 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-oil-tiny rotate: false - xy: 307, 1 + xy: 511, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +liquid-oil-xlarge + rotate: false + xy: 671, 489 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-slag-large + rotate: false + xy: 1135, 825 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 liquid-slag-medium rotate: false - xy: 443, 189 + xy: 1471, 697 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-small rotate: false - xy: 963, 137 + xy: 835, 543 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-slag-tiny rotate: false - xy: 325, 1 + xy: 529, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +liquid-slag-xlarge + rotate: false + xy: 315, 192 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-water-large + rotate: false + xy: 1177, 825 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 liquid-water-medium rotate: false - xy: 375, 87 + xy: 1437, 595 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-small rotate: false - xy: 963, 111 + xy: 809, 543 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-water-tiny rotate: false - xy: 343, 1 + xy: 547, 305 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 +liquid-water-xlarge + rotate: false + xy: 307, 142 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mace-leg + rotate: false + xy: 199, 629 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-outline + rotate: false + xy: 265, 695 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck0 + rotate: false + xy: 331, 761 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck1 + rotate: false + xy: 397, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck2 + rotate: false + xy: 463, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +missiles-mount-outline + rotate: false + xy: 325, 92 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-outline + rotate: false + xy: 375, 92 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck0 + rotate: false + xy: 375, 42 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck1 + rotate: false + xy: 967, 867 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck2 + rotate: false + xy: 1017, 867 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-purple-weapon-outline + rotate: false + xy: 1067, 867 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-weapon-outline + rotate: false + xy: 1167, 867 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova-leg + rotate: false + xy: 1267, 867 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova-outline + rotate: false + xy: 133, 109 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-wreck0 + rotate: false + xy: 199, 175 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-wreck1 + rotate: false + xy: 265, 242 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-wreck2 + rotate: false + xy: 983, 967 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +parallax + rotate: false + xy: 463, 827 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +poly-outline + rotate: false + xy: 1157, 967 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck0 + rotate: false + xy: 1215, 967 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck1 + rotate: false + xy: 1273, 967 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck2 + rotate: false + xy: 1331, 967 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +pulsar-leg + rotate: false + xy: 595, 893 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 repair-point rotate: false - xy: 545, 53 + xy: 1917, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +salvo + rotate: false + xy: 265, 497 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scatter + rotate: false + xy: 529, 761 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scepter-weapon-outline + rotate: false + xy: 1505, 921 + size: 56, 102 + orig: 56, 102 + offset: 0, 0 + index: -1 scorch rotate: false - xy: 545, 19 + xy: 1947, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +segment + rotate: false + xy: 67, 233 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +small-basic-weapon-outline + rotate: false + xy: 1417, 871 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +small-mount-weapon-outline + rotate: false + xy: 711, 655 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spiroct-foot + rotate: false + xy: 911, 571 + size: 46, 46 + orig: 46, 46 + offset: 0, 0 + index: -1 +spiroct-joint + rotate: false + xy: 1743, 573 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spiroct-leg + rotate: false + xy: 275, 6 + size: 48, 34 + orig: 48, 34 + offset: 0, 0 + index: -1 +spiroct-leg-base + rotate: false + xy: 861, 683 + size: 48, 34 + orig: 48, 34 + offset: 0, 0 + index: -1 +spiroct-weapon-outline + rotate: false + xy: 761, 613 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 splash-0 rotate: false - xy: 715, 155 + xy: 1777, 573 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-1 rotate: false - xy: 749, 189 + xy: 1811, 573 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-10 rotate: false - xy: 647, 19 + xy: 1573, 561 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-11 rotate: false - xy: 681, 53 + xy: 1607, 561 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-2 rotate: false - xy: 783, 223 + xy: 1845, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-3 rotate: false - xy: 613, 19 + xy: 1879, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-4 rotate: false - xy: 647, 53 + xy: 1913, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-5 rotate: false - xy: 681, 87 + xy: 1947, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-6 rotate: false - xy: 715, 121 + xy: 1981, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-7 rotate: false - xy: 749, 155 + xy: 2015, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-8 rotate: false - xy: 783, 189 + xy: 1505, 565 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-9 rotate: false - xy: 817, 223 + xy: 1539, 563 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +swarmer + rotate: false + xy: 397, 497 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-alpha-full + rotate: false + xy: 365, 192 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-beta-full + rotate: false + xy: 1563, 969 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +unit-crawler-full + rotate: false + xy: 811, 619 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-dagger-full + rotate: false + xy: 861, 633 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-flare-full + rotate: false + xy: 407, 142 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-mace-full + rotate: false + xy: 661, 761 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-mono-full + rotate: false + xy: 425, 92 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-nova-full + rotate: false + xy: 1621, 967 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-poly-full + rotate: false + xy: 1679, 967 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +wave + rotate: false + xy: 67, 101 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +zenith-missiles-outline + rotate: false + xy: 811, 569 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 item-blast-compound rotate: false - xy: 103, 53 + xy: 1335, 757 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 171, 121 + xy: 1233, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 239, 189 + xy: 1301, 723 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 103, 19 + xy: 1233, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 171, 87 + xy: 1301, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 239, 155 + xy: 1267, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 307, 223 + xy: 1335, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 171, 53 + xy: 1301, 621 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 239, 121 + xy: 1369, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 307, 189 + xy: 1369, 655 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 171, 19 + xy: 1407, 761 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 239, 87 + xy: 1475, 765 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod rotate: false - xy: 341, 189 + xy: 1403, 659 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 205, 19 + xy: 1509, 735 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 273, 87 + xy: 1577, 731 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 341, 155 + xy: 1645, 731 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 273, 53 + xy: 1781, 709 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 375, 155 + xy: 1883, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 409, 155 + xy: 1437, 697 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 341, 53 + xy: 1471, 663 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blank rotate: false - xy: 843, 12 + xy: 1737, 968 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 -atrax-joint +shape-3 rotate: false - xy: 851, 93 - size: 26, 26 - orig: 26, 26 + xy: 265, 300 + size: 63, 63 + orig: 63, 63 offset: 0, 0 index: -1 -spiroct-joint +alpha rotate: false - xy: 681, 121 - size: 32, 32 - orig: 32, 32 + xy: 1949, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-cell + rotate: false + xy: 1999, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +beta + rotate: false + xy: 529, 573 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-cell + rotate: false + xy: 1863, 923 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler + rotate: false + xy: 595, 589 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-base + rotate: false + xy: 661, 655 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-cell + rotate: false + xy: 727, 721 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger + rotate: false + xy: 521, 473 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-base + rotate: false + xy: 507, 423 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare + rotate: false + xy: 175, 1 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +fortress-base + rotate: false + xy: 1, 497 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +gamma-cell + rotate: false + xy: 859, 901 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +mace + rotate: false + xy: 1, 431 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-base + rotate: false + xy: 67, 497 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-cell + rotate: false + xy: 133, 563 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mono + rotate: false + xy: 325, 42 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-cell + rotate: false + xy: 357, 142 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova + rotate: false + xy: 925, 967 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-base + rotate: false + xy: 1217, 867 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova-cell + rotate: false + xy: 67, 43 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly + rotate: false + xy: 1041, 967 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-cell + rotate: false + xy: 1099, 967 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +power-cell + rotate: false + xy: 1389, 967 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +pulsar-base + rotate: false + xy: 1317, 867 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +pulsar-cell + rotate: false + xy: 397, 447 + size: 58, 48 + orig: 58, 48 + offset: 0, 0 + index: -1 +vanguard + rotate: false + xy: 425, 42 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +vanguard-cell + rotate: false + xy: 911, 669 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +artillery + rotate: false + xy: 1763, 913 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +eruption + rotate: false + xy: 125, 43 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flakgun + rotate: false + xy: 579, 523 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flamethrower + rotate: false + xy: 175, 51 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +heal-shotgun-weapon + rotate: false + xy: 1845, 973 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +heal-weapon + rotate: false + xy: 621, 473 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +heal-weapon-mount + rotate: false + xy: 657, 423 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +large-artillery + rotate: false + xy: 827, 719 + size: 48, 66 + orig: 48, 66 + offset: 0, 0 + index: -1 +large-weapon + rotate: false + xy: 645, 589 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +missiles + rotate: false + xy: 275, 92 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +missiles-mount + rotate: false + xy: 275, 42 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-purple-weapon + rotate: false + xy: 917, 859 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-weapon + rotate: false + xy: 1117, 867 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +scepter-weapon + rotate: false + xy: 1447, 921 + size: 56, 102 + orig: 56, 102 + offset: 0, 0 + index: -1 +small-basic-weapon + rotate: false + xy: 1367, 867 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +small-mount-weapon + rotate: false + xy: 1467, 871 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +small-weapon + rotate: false + xy: 695, 605 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spiroct-weapon + rotate: false + xy: 323, 242 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +weapon + rotate: false + xy: 911, 619 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +zenith-missiles + rotate: false + xy: 861, 583 + size: 48, 48 + orig: 48, 48 offset: 0, 0 index: -1 -sprites4.png +sprites5.png size: 2048,1024 format: rgba8888 filter: nearest,nearest @@ -6771,3533 +7827,3708 @@ scorch-9-2 offset: 0, 0 index: -1 -sprites5.png +sprites6.png 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: 1561, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-2-edge +basalt2 rotate: false - xy: 1, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-3 - rotate: false - xy: 1995, 459 + xy: 1595, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-3-edge +basalt3 rotate: false - xy: 99, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-4 - rotate: false - xy: 753, 361 + xy: 1629, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-4-edge +char1 rotate: false - xy: 1, 199 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-5 - rotate: false - xy: 753, 327 + xy: 1663, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-5-edge +char2 rotate: false - xy: 99, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-6 - rotate: false - xy: 753, 293 + xy: 1697, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-6-edge +char3 rotate: false - xy: 197, 395 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-edge - rotate: false - xy: 1, 101 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-tainted-water - rotate: false - xy: 525, 1 + xy: 1731, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand-tainted-water-edge +cliff rotate: false - xy: 99, 199 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-tainted-water1 - rotate: false - xy: 655, 131 + xy: 1765, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand-tainted-water2 +coal1 rotate: false - xy: 753, 259 + xy: 1799, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand-tainted-water3 +coal2 rotate: false - xy: 689, 179 + xy: 1833, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand-water +coal3 rotate: false - xy: 689, 145 + xy: 1867, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand-water-edge +copper1 rotate: false - xy: 197, 297 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-water1 - rotate: false - xy: 737, 225 + xy: 1901, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand-water2 +copper2 rotate: false - xy: 1181, 409 + xy: 1935, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand-water3 +copper3 rotate: false - xy: 1215, 409 + xy: 1969, 459 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand1 +craters1 + rotate: false + xy: 2003, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters2 rotate: false xy: 491, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand2 +craters3 rotate: false xy: 557, 67 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand3 +craters4 rotate: false xy: 655, 165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -deepwater +craters5 rotate: false - xy: 1249, 409 + xy: 753, 263 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -deepwater-edge +craters6 rotate: false - xy: 295, 395 + xy: 851, 361 + 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 -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 - 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 +dacite-wall-large rotate: false xy: 491, 35 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -icerocks1 +dacite-wall1 rotate: false - xy: 1929, 425 + xy: 851, 327 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icerocks2 +dacite-wall2 rotate: false - xy: 1963, 425 + xy: 1411, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ignarock-edge +dacite1 rotate: false - xy: 99, 3 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ignarock1 - rotate: false - xy: 1997, 425 + xy: 525, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ignarock2 +dacite2 rotate: false - xy: 771, 225 + xy: 655, 131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ignarock3 +dacite3 rotate: false - xy: 1283, 391 + xy: 753, 229 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 +dark-metal-large rotate: false xy: 589, 133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -rocks1 +dark-metal1 rotate: false - xy: 659, 77 + xy: 1445, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -rocks2 +dark-metal2 rotate: false - xy: 693, 77 + xy: 1479, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -salt +dark-panel-1 rotate: false - xy: 659, 43 + xy: 1513, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -salt-edge +dark-panel-1-edge + rotate: false + xy: 99, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-2 + rotate: false + xy: 1561, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-2-edge + rotate: false + xy: 1, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-3 + rotate: false + xy: 1595, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-3-edge + rotate: false + xy: 99, 297 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-4 + rotate: false + xy: 1629, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-4-edge + rotate: false + xy: 197, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-5 + rotate: false + xy: 1663, 425 + 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 +dark-panel-6 + rotate: false + xy: 1697, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-6-edge + rotate: false + xy: 99, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +darksand-edge + rotate: false + xy: 197, 297 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +darksand-tainted-water + rotate: false + xy: 1833, 425 + 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: 1867, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water2 + rotate: false + xy: 1901, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water3 + rotate: false + xy: 1935, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water + rotate: false + xy: 1969, 425 + 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: 2003, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water2 + rotate: false + xy: 591, 99 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water3 + rotate: false + xy: 591, 65 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand1 + rotate: false + xy: 1731, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand2 + rotate: false + xy: 1765, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand3 + rotate: false + xy: 1799, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +deepwater + rotate: false + xy: 625, 97 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +deepwater-edge + rotate: false + xy: 99, 101 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dirt-edge + rotate: false + xy: 197, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dirt-wall-large + rotate: false + xy: 687, 231 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dirt-wall1 + rotate: false + xy: 787, 295 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-wall2 + rotate: false + xy: 787, 261 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt1 + rotate: false + xy: 625, 63 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt2 + rotate: false + xy: 659, 97 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt3 + rotate: false + xy: 659, 63 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dune-wall-large + rotate: false + xy: 785, 329 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dune-wall1 + rotate: false + xy: 787, 227 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dune-wall2 + rotate: false + xy: 821, 293 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +edge + rotate: false + xy: 821, 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: 821, 225 + 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: 855, 293 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass2 + rotate: false + xy: 855, 259 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass3 + rotate: false + xy: 855, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock1 + rotate: false + xy: 1547, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock2 + rotate: false + xy: 1581, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock3 + rotate: false + xy: 1615, 391 + 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: 1751, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-snow2 + rotate: false + xy: 1785, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-snow3 + rotate: false + xy: 1819, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall-large + rotate: false + xy: 883, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +ice-wall1 + rotate: false + xy: 1853, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall2 + rotate: false + xy: 1887, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice1 + rotate: false + xy: 1649, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice2 + rotate: false + xy: 1683, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice3 + rotate: false + xy: 1717, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead1 + rotate: false + xy: 1921, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead2 + rotate: false + xy: 1955, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead3 + rotate: false + xy: 1989, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock1 + rotate: false + xy: 689, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock2 + rotate: false + xy: 689, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock3 + rotate: false + xy: 723, 195 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor + rotate: false + xy: 723, 161 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-2 + rotate: false + xy: 757, 193 + 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: 757, 159 + 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: 791, 191 + 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: 825, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-damaged2 + rotate: false + xy: 791, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-damaged3 + rotate: false + xy: 825, 157 + 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: 859, 191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -saltrocks2 +moss2 rotate: false - xy: 727, 55 + xy: 859, 157 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -sand-edge +moss3 + rotate: false + xy: 885, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud-edge rotate: false xy: 491, 297 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -sand-water +mud1 rotate: false - xy: 761, 21 + xy: 885, 359 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -sand-water-edge +mud2 + rotate: false + xy: 919, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud3 + rotate: false + xy: 953, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-coal1 + rotate: false + xy: 919, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-coal2 + rotate: false + xy: 987, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-coal3 + rotate: false + xy: 953, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper1 + rotate: false + xy: 1021, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper2 + rotate: false + xy: 987, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper3 + rotate: false + xy: 1055, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead1 + rotate: false + xy: 1021, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead2 + rotate: false + xy: 1089, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead3 + rotate: false + xy: 1055, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-scrap1 + rotate: false + xy: 1123, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-scrap2 + rotate: false + xy: 1089, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-scrap3 + rotate: false + xy: 1157, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-thorium1 + rotate: false + xy: 1123, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-thorium2 + rotate: false + xy: 1191, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-thorium3 + rotate: false + xy: 1157, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-titanium1 + rotate: false + xy: 1225, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-titanium2 + rotate: false + xy: 1191, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-titanium3 + rotate: false + xy: 1259, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pebbles1 + rotate: false + xy: 1225, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pebbles2 + rotate: false + xy: 1293, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pebbles3 + rotate: false + xy: 1259, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pine + rotate: false + xy: 1411, 443 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +salt + rotate: false + xy: 1327, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +salt-edge rotate: false xy: 589, 395 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -sand-water1 +salt-wall-large 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 - rotate: false - xy: 851, 427 + xy: 949, 427 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sandrocks1 +salt-wall1 rotate: false - xy: 821, 393 + xy: 1293, 359 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -sandrocks2 +salt-wall2 rotate: false - xy: 787, 325 + xy: 1361, 393 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -scrap1 - rotate: false - xy: 855, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap2 - rotate: false - xy: 821, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap3 - rotate: false - xy: 787, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-edge +sand-edge rotate: false xy: 295, 3 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -shale1 +sand-wall-large rotate: false - xy: 889, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale2 - rotate: false - xy: 821, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale3 - rotate: false - xy: 855, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shalerocks-large - rotate: false - xy: 917, 427 + xy: 1015, 427 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -shalerocks1 +sand-wall1 rotate: false - xy: 923, 393 + xy: 1429, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shalerocks2 +sand-wall2 rotate: false - xy: 821, 291 + xy: 1463, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shrubs-large +sand-water rotate: false - xy: 983, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shrubs1 - rotate: false - xy: 855, 325 + xy: 1497, 375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shrubs2 - rotate: false - xy: 889, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -slag - rotate: false - xy: 957, 393 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -slag-edge +sand-water-edge rotate: false xy: 393, 101 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -snow-edge +sand-water1 + rotate: false + xy: 1395, 341 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-water2 + rotate: false + xy: 1429, 341 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-water3 + rotate: false + xy: 1463, 341 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand1 + rotate: false + xy: 1327, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand2 + rotate: false + xy: 1361, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand3 + rotate: false + xy: 1395, 375 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap1 + rotate: false + xy: 1497, 341 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap2 + rotate: false + xy: 1531, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap3 + rotate: false + xy: 1565, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-edge rotate: false xy: 491, 199 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -snow-pine +shale-wall-large 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 + xy: 1081, 427 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -snowrocks1 +shale-wall1 rotate: false - xy: 991, 393 + xy: 1701, 357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -snowrocks2 +shale-wall2 rotate: false - xy: 889, 291 + xy: 1735, 357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -spawn +shale1 rotate: false - xy: 923, 325 + xy: 1599, 357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -spore-moss-edge +shale2 + rotate: false + xy: 1633, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale3 + rotate: false + xy: 1667, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shrubs-large + rotate: false + xy: 1147, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +shrubs1 + rotate: false + xy: 1769, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shrubs2 + rotate: false + xy: 1803, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +slag + rotate: false + xy: 1837, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +slag-edge rotate: false xy: 589, 297 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -spore-moss1 - 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 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sporerocks-large - rotate: false - xy: 1115, 427 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sporerocks1 - rotate: false - xy: 957, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sporerocks2 - rotate: false - xy: 991, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone-edge +snow-edge rotate: false xy: 687, 395 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -stone1 +snow-pine rotate: false - xy: 1059, 393 + xy: 1461, 443 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +snow-wall-large + rotate: false + xy: 1213, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +snow-wall1 + rotate: false + xy: 1973, 357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -stone2 +snow-wall2 rotate: false - xy: 957, 291 + xy: 1531, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -stone3 +snow1 rotate: false - xy: 991, 325 + xy: 1871, 357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -tainted-water +snow2 rotate: false - xy: 1025, 359 + xy: 1905, 357 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -tainted-water-edge +snow3 + rotate: false + xy: 1939, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spawn + rotate: false + xy: 1565, 323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spore-moss-edge rotate: false xy: 393, 3 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -tar +spore-moss1 rotate: false - xy: 1093, 393 + xy: 1599, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -tar-edge +spore-moss2 + rotate: false + xy: 1633, 323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spore-moss3 + rotate: false + xy: 1667, 323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spore-pine + rotate: false + xy: 1511, 443 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spore-wall-large + rotate: false + xy: 1279, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-wall1 + rotate: false + xy: 1701, 323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spore-wall2 + rotate: false + xy: 1735, 323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone-edge rotate: false xy: 491, 101 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -tendrils1 +stone-wall-large rotate: false - xy: 991, 291 + xy: 1345, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall1 + rotate: false + xy: 1871, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -tendrils2 +stone-wall2 rotate: false - xy: 1025, 325 + xy: 1905, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -tendrils3 +stone1 rotate: false - xy: 1059, 359 + xy: 1769, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -thorium1 +stone2 rotate: false - xy: 1127, 393 + xy: 1803, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -thorium2 +stone3 rotate: false - xy: 1025, 291 + xy: 1837, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -thorium3 +tainted-water rotate: false - xy: 1059, 325 + xy: 1939, 323 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -titanium1 - rotate: false - xy: 1093, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium2 - rotate: false - xy: 1059, 291 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium3 - rotate: false - xy: 1093, 325 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water - rotate: false - xy: 1127, 359 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water-edge +tainted-water-edge rotate: false xy: 589, 199 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +tar + rotate: false + xy: 1973, 323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tar-edge + rotate: false + xy: 687, 297 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +tendrils1 + rotate: false + xy: 2007, 357 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tendrils2 + rotate: false + xy: 2007, 323 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tendrils3 + rotate: false + xy: 889, 325 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thorium1 + rotate: false + xy: 923, 325 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thorium2 + rotate: false + xy: 889, 291 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thorium3 + rotate: false + xy: 957, 325 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium1 + rotate: false + xy: 889, 257 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium2 + rotate: false + xy: 923, 291 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium3 + rotate: false + xy: 991, 325 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +water + rotate: false + xy: 923, 257 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +water-edge + rotate: false + xy: 785, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 -sprites6.png +sprites7.png size: 2048,1024 format: rgba8888 filter: nearest,nearest repeat: none additive-reconstructor-icon-editor rotate: false - xy: 485, 627 + xy: 613, 743 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory-icon-editor rotate: false - xy: 613, 755 + xy: 1717, 905 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-icon-editor rotate: false - xy: 1555, 917 + xy: 711, 743 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-icon-editor rotate: false - xy: 327, 103 + xy: 2011, 969 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-icon-editor rotate: false - xy: 375, 203 + xy: 1751, 665 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt-icon-editor + rotate: false + xy: 1793, 707 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt1 + rotate: false + xy: 1793, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-editor rotate: false - xy: 131, 13 + xy: 2011, 935 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-editor rotate: false - xy: 1653, 917 + xy: 1815, 905 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill-icon-editor rotate: false - xy: 1, 15 + xy: 1, 3 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-mixer-icon-editor rotate: false - xy: 1103, 721 + xy: 1103, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border-editor rotate: false - xy: 165, 13 + xy: 1827, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-forge-icon-editor rotate: false - xy: 1751, 917 + xy: 809, 743 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-loader-icon-editor rotate: false - xy: 1849, 917 + xy: 1913, 905 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader-icon-editor rotate: false - xy: 1947, 917 + xy: 227, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +boulder-icon-editor + rotate: false + xy: 1601, 691 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 bridge-conduit-icon-editor rotate: false - xy: 587, 363 + xy: 2011, 901 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 587, 329 + xy: 1861, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 587, 295 + xy: 2011, 867 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 587, 295 + xy: 2011, 867 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear-editor rotate: false - xy: 2045, 1012 + xy: 615, 544 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 cliff-icon-editor rotate: false - xy: 521, 231 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliffs-icon-editor - rotate: false - xy: 555, 231 + xy: 1895, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal-centrifuge-icon-editor rotate: false - xy: 1169, 721 + xy: 1169, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 combustion-generator-icon-editor rotate: false - xy: 649, 589 + xy: 2011, 833 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 command-center-icon-editor rotate: false - xy: 1235, 721 + xy: 1235, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conduit-icon-editor rotate: false - xy: 683, 589 + xy: 1929, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 1301, 721 + xy: 1301, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 1961, 719 + xy: 1963, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 1961, 685 + xy: 131, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 1367, 721 + xy: 1367, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-icon-editor rotate: false - xy: 323, 433 + xy: 323, 389 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-icon-editor rotate: false - xy: 323, 563 + xy: 613, 841 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-icon-editor rotate: false - xy: 227, 273 + xy: 227, 163 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 craters-icon-editor rotate: false - xy: 1961, 651 + xy: 165, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters1 rotate: false - xy: 1961, 651 + xy: 165, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cryofluidmixer-icon-editor rotate: false - xy: 1433, 721 + xy: 1433, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 1499, 721 + xy: 1499, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone-icon-editor rotate: false - xy: 227, 175 + xy: 517, 615 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +dacite-boulder-icon-editor + rotate: false + xy: 1601, 641 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-icon-editor + rotate: false + xy: 943, 447 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite1 + rotate: false + xy: 943, 447 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-wall-icon-editor + rotate: false + xy: 1601, 607 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 dark-metal-icon-editor rotate: false - xy: 1961, 617 + xy: 1635, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-editor rotate: false - xy: 1989, 791 + xy: 1669, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-1 rotate: false - xy: 1989, 791 + xy: 1669, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-editor rotate: false - xy: 1989, 757 + xy: 1703, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-2 rotate: false - xy: 1989, 757 + xy: 1703, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-editor rotate: false - xy: 1995, 723 + xy: 977, 447 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-3 rotate: false - xy: 1995, 723 + xy: 977, 447 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-editor rotate: false - xy: 1995, 689 + xy: 229, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-4 rotate: false - xy: 1995, 689 + xy: 229, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-editor rotate: false - xy: 1995, 655 + xy: 263, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-5 rotate: false - xy: 1995, 655 + xy: 263, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-editor rotate: false - xy: 1995, 621 + xy: 423, 355 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-6 rotate: false - xy: 1995, 621 + xy: 423, 355 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-editor rotate: false - xy: 409, 201 + xy: 423, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand1 rotate: false - xy: 409, 201 + xy: 423, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-editor rotate: false - xy: 443, 201 + xy: 423, 287 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-editor rotate: false - xy: 477, 201 + xy: 423, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 511, 197 + xy: 423, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 511, 197 + xy: 423, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-icon-editor rotate: false - xy: 131, 47 + xy: 131, 35 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode-icon-editor rotate: false - xy: 545, 197 + xy: 327, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-icon-editor + rotate: false + xy: 361, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt1 + rotate: false + xy: 361, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-wall-icon-editor + rotate: false + xy: 1997, 707 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 disassembler-icon-editor rotate: false - xy: 229, 77 + xy: 517, 517 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 distributor-icon-editor rotate: false - xy: 551, 463 + xy: 1565, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 633, 555 + xy: 649, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 1593, 753 + xy: 1631, 807 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -dunerocks-icon-editor +dune-wall-icon-editor rotate: false - xy: 667, 555 + xy: 683, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 717, 605 + xy: 717, 415 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt2 + rotate: false + xy: 751, 415 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt3 + rotate: false + xy: 785, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 765, 655 + xy: 819, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 799, 655 + xy: 853, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters2 rotate: false - xy: 833, 655 + xy: 887, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 867, 655 + xy: 395, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite2 + rotate: false + xy: 1751, 631 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite3 + rotate: false + xy: 921, 413 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water1 rotate: false - xy: 969, 655 + xy: 1737, 597 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water2 rotate: false - xy: 1003, 655 + xy: 1771, 597 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water3 rotate: false - xy: 1037, 655 + xy: 1785, 665 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water1 rotate: false - xy: 765, 621 + xy: 1785, 631 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water2 rotate: false - xy: 799, 621 + xy: 1819, 673 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water3 rotate: false - xy: 833, 621 + xy: 1819, 639 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand2 rotate: false - xy: 901, 655 + xy: 955, 413 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand3 rotate: false - xy: 935, 655 + xy: 989, 413 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt2 + rotate: false + xy: 1853, 673 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt3 + rotate: false + xy: 1853, 639 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 867, 621 + xy: 1887, 673 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 867, 621 + xy: 1887, 673 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 901, 621 + xy: 1887, 639 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 935, 621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone1 - rotate: false - xy: 969, 621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-icon-editor - rotate: false - xy: 969, 621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone2 - rotate: false - xy: 1003, 621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone3 - rotate: false - xy: 1037, 621 + xy: 1921, 673 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 361, 103 + xy: 1921, 639 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 361, 103 + xy: 1921, 639 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 701, 555 + xy: 1955, 673 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 633, 521 + xy: 1955, 639 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 617, 453 + xy: 1839, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 617, 453 + xy: 1839, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 651, 487 + xy: 1873, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 617, 419 + xy: 1907, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 667, 521 + xy: 1989, 673 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 667, 521 + xy: 1989, 673 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 701, 521 + xy: 1989, 639 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 617, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock1 - rotate: false - xy: 651, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock-icon-editor - rotate: false - xy: 651, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock2 - rotate: false - xy: 685, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock3 - rotate: false - xy: 651, 419 + xy: 1805, 597 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 685, 453 + xy: 1941, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 685, 453 + xy: 1941, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 685, 419 + xy: 1975, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 719, 487 + xy: 2009, 605 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 719, 453 + xy: 1839, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 719, 453 + xy: 1839, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 719, 419 + xy: 1873, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 719, 419 + xy: 1873, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 621, 385 + xy: 1907, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 621, 385 + xy: 1907, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 621, 351 + xy: 1941, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 621, 351 + xy: 1941, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 655, 385 + xy: 1975, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 655, 385 + xy: 1975, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 621, 317 + xy: 2009, 571 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 655, 351 + xy: 425, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss1 rotate: false - xy: 689, 385 + xy: 425, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-editor rotate: false - xy: 689, 385 + xy: 425, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss2 rotate: false - xy: 655, 317 + xy: 425, 117 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss3 rotate: false - xy: 689, 351 + xy: 429, 83 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud1 + rotate: false + xy: 429, 49 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud-icon-editor + rotate: false + xy: 429, 49 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud2 + rotate: false + xy: 1011, 477 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud3 + rotate: false + xy: 1045, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal1 rotate: false - xy: 689, 317 + xy: 457, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal2 rotate: false - xy: 723, 385 + xy: 457, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal3 rotate: false - xy: 723, 351 + xy: 491, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper1 rotate: false - xy: 723, 317 + xy: 457, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper2 rotate: false - xy: 621, 283 + xy: 525, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper3 rotate: false - xy: 655, 283 + xy: 491, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead1 rotate: false - xy: 689, 283 + xy: 457, 283 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead2 rotate: false - xy: 723, 283 + xy: 559, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead3 rotate: false - xy: 579, 197 + xy: 491, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap1 rotate: false - xy: 361, 69 + xy: 525, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap2 rotate: false - xy: 361, 35 + xy: 457, 249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap3 rotate: false - xy: 361, 1 + xy: 593, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium1 rotate: false - xy: 1995, 587 + xy: 491, 283 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium2 rotate: false - xy: 1071, 621 + xy: 525, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium3 rotate: false - xy: 1105, 621 + xy: 559, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium1 rotate: false - xy: 1139, 621 + xy: 491, 249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium2 rotate: false - xy: 1173, 621 + xy: 525, 283 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium3 rotate: false - xy: 1207, 621 + xy: 559, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles1 rotate: false - xy: 1241, 621 + xy: 593, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles2 rotate: false - xy: 1275, 621 + xy: 525, 249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles3 rotate: false - xy: 1309, 621 + xy: 559, 283 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-salt rotate: false - xy: 1343, 621 + xy: 593, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-editor rotate: false - xy: 1343, 621 + xy: 593, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water1 rotate: false - xy: 1479, 621 + xy: 627, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water2 rotate: false - xy: 1513, 621 + xy: 627, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water3 rotate: false - xy: 751, 587 + xy: 661, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand1 rotate: false - xy: 1377, 621 + xy: 559, 249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-editor rotate: false - xy: 1377, 621 + xy: 559, 249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand2 rotate: false - xy: 1411, 621 + xy: 593, 283 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand3 rotate: false - xy: 1445, 621 + xy: 593, 249 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale1 rotate: false - xy: 785, 587 + xy: 627, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-editor rotate: false - xy: 785, 587 + xy: 627, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale2 rotate: false - xy: 819, 587 + xy: 661, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale3 rotate: false - xy: 853, 587 + xy: 695, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-slag rotate: false - xy: 887, 587 + xy: 627, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-icon-editor rotate: false - xy: 887, 587 + xy: 627, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow1 rotate: false - xy: 921, 587 + xy: 661, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow2 rotate: false - xy: 955, 587 + xy: 695, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow3 rotate: false - xy: 989, 587 + xy: 729, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spawn rotate: false - xy: 1023, 587 + xy: 661, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss1 rotate: false - xy: 1057, 587 + xy: 695, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-editor rotate: false - xy: 1057, 587 + xy: 695, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss2 rotate: false - xy: 1091, 587 + xy: 729, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss3 rotate: false - xy: 1125, 587 + xy: 763, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 1159, 587 + xy: 695, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 1159, 587 + xy: 695, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 1193, 587 + xy: 729, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 1227, 587 + xy: 763, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tainted-water rotate: false - xy: 1261, 587 + xy: 797, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-editor rotate: false - xy: 1261, 587 + xy: 797, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 1295, 587 + xy: 729, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 1295, 587 + xy: 729, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils1 rotate: false - xy: 1329, 587 + xy: 763, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils2 rotate: false - xy: 1363, 587 + xy: 797, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils3 rotate: false - xy: 1397, 587 + xy: 831, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 1431, 587 + xy: 763, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 1431, 587 + xy: 763, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 exponential-reconstructor-icon-editor rotate: false - xy: 1, 145 + xy: 1, 133 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 force-projector-icon-editor rotate: false - xy: 485, 529 + xy: 325, 291 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fuse-icon-editor rotate: false - xy: 711, 755 + xy: 325, 193 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press-icon-editor rotate: false - xy: 1659, 753 + xy: 943, 481 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ground-factory-icon-editor rotate: false - xy: 809, 787 + xy: 615, 645 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hail-icon-editor rotate: false - xy: 1465, 587 + xy: 797, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hyper-processor-icon-editor rotate: false - xy: 907, 787 + xy: 615, 547 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -icerocks-icon-editor +ice-wall-icon-editor rotate: false - xy: 1499, 587 + xy: 831, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-icon-editor rotate: false - xy: 735, 553 + xy: 865, 381 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-editor rotate: false - xy: 775, 885 + xy: 937, 873 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 incinerator-icon-editor rotate: false - xy: 769, 553 + xy: 797, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter-icon-editor rotate: false - xy: 803, 553 + xy: 831, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 837, 553 + xy: 865, 347 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 871, 553 + xy: 831, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction-icon-editor rotate: false - xy: 905, 553 + xy: 865, 313 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-editor rotate: false - xy: 1725, 753 + xy: 1007, 709 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-editor rotate: false - xy: 1791, 753 + 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: 1005, 787 + xy: 713, 645 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-editor rotate: false - xy: 1103, 787 + xy: 713, 547 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large-icon-editor rotate: false - xy: 905, 885 + xy: 1067, 873 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 liquid-junction-icon-editor rotate: false - xy: 939, 553 + xy: 865, 279 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 973, 553 + xy: 627, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 1007, 553 + xy: 661, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 1201, 787 + xy: 811, 645 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-void-icon-editor rotate: false - xy: 1041, 553 + xy: 695, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-display-icon-editor rotate: false - xy: 1299, 787 + xy: 811, 547 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor-icon-editor rotate: false - xy: 1857, 753 + xy: 1007, 577 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 1397, 787 + xy: 229, 65 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 1923, 753 + xy: 1009, 511 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 1075, 553 + xy: 729, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-editor rotate: false - xy: 1035, 885 + xy: 1197, 873 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 melter-icon-editor rotate: false - xy: 1109, 553 + xy: 763, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +memory-bank-icon-editor + rotate: false + xy: 1103, 741 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 memory-cell-icon-editor rotate: false - xy: 1143, 553 + xy: 797, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 1103, 655 + xy: 1169, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-icon-editor rotate: false - xy: 1177, 553 + xy: 831, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 1211, 553 + xy: 865, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor-icon-editor rotate: false - xy: 1245, 553 + xy: 899, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 453, 431 + xy: 327, 95 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor-icon-editor rotate: false - xy: 613, 853 + xy: 775, 841 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory-icon-editor rotate: false - xy: 1495, 787 + xy: 453, 419 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 1593, 819 + xy: 551, 419 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-icon-editor rotate: false - xy: 1691, 819 + xy: 649, 449 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 1169, 655 + xy: 1235, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 1279, 553 + xy: 899, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 parallax-icon-editor rotate: false - xy: 1235, 655 + xy: 1301, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 payload-conveyor-icon-editor rotate: false - xy: 1789, 819 + xy: 747, 449 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon-editor rotate: false - xy: 1887, 819 + xy: 845, 449 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 1313, 553 + xy: 933, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 1347, 553 + xy: 899, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 1381, 553 + xy: 933, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 1415, 553 + xy: 967, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 1301, 655 + xy: 1367, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 1367, 655 + xy: 1433, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 325, 187 + xy: 1651, 691 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 1433, 655 + xy: 1499, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-conveyor-icon-editor rotate: false - xy: 1449, 553 + xy: 899, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-icon-editor rotate: false - xy: 1483, 553 + xy: 933, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large-icon-editor rotate: false - xy: 1499, 655 + xy: 1565, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plated-conduit-icon-editor rotate: false - xy: 1533, 587 + xy: 967, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 1565, 687 + xy: 1631, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 1517, 553 + xy: 933, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 1631, 687 + xy: 1697, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 1567, 587 + xy: 967, 311 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 1551, 553 + xy: 967, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 1601, 587 + xy: 899, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 1585, 553 + xy: 933, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 1697, 687 + xy: 1763, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 1635, 587 + xy: 967, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point-icon-editor rotate: false - xy: 1763, 687 + xy: 1829, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ripple-icon-editor rotate: false - xy: 325, 335 + xy: 1717, 807 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -rock-icon-editor - rotate: false - xy: 1985, 867 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rocks-icon-editor - rotate: false - xy: 1619, 553 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 rotary-pump-icon-editor rotate: false - xy: 1829, 687 + xy: 1895, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 1669, 587 + xy: 1001, 379 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 1895, 687 + xy: 1961, 741 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -saltrocks-icon-editor +salt-wall-icon-editor rotate: false - xy: 1653, 553 + xy: 1001, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 551, 397 + xy: 1073, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-editor rotate: false - xy: 1703, 587 + xy: 1001, 311 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-wall-icon-editor + rotate: false + xy: 1001, 277 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 1687, 553 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-icon-editor - rotate: false - xy: 1737, 587 + xy: 1001, 243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-editor rotate: false - xy: 521, 331 + xy: 1073, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-icon-editor rotate: false - xy: 1721, 553 + xy: 459, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-editor rotate: false - xy: 1165, 885 + xy: 1327, 873 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge-icon-editor rotate: false - xy: 325, 237 + xy: 1815, 807 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 1771, 587 + xy: 493, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 521, 265 + xy: 1139, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 segment-icon-editor rotate: false - xy: 1565, 621 + xy: 1139, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 1631, 621 + xy: 1205, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-editor rotate: false - xy: 1755, 553 + xy: 459, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shalerocks-icon-editor +shale-wall-icon-editor rotate: false - xy: 1805, 587 + xy: 527, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 1789, 553 + xy: 459, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 1839, 587 + xy: 493, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-crucible-icon-editor rotate: false - xy: 423, 333 + xy: 1913, 807 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 1697, 621 + xy: 1205, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +snow-boulder-icon-editor + rotate: false + xy: 1651, 641 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 snow-icon-editor rotate: false - xy: 1823, 553 + xy: 561, 215 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-editor rotate: false - xy: 583, 543 + xy: 1701, 691 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -snowrock-icon-editor +snow-wall-icon-editor rotate: false - xy: 715, 639 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrocks-icon-editor - rotate: false - xy: 1873, 587 + xy: 493, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 1857, 553 + xy: 527, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 423, 235 + xy: 907, 743 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 1907, 587 + xy: 527, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 1891, 553 + xy: 561, 181 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-editor rotate: false - xy: 1295, 885 + xy: 1457, 873 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spore-cluster-icon-editor rotate: false - xy: 1985, 825 + xy: 1751, 699 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-pine-icon-editor rotate: false - xy: 327, 137 + xy: 1701, 641 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 1763, 621 + xy: 1271, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks-icon-editor +spore-wall-icon-editor rotate: false - xy: 1925, 553 + xy: 561, 147 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +steam-generator-icon-editor + rotate: false + xy: 1271, 609 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall-icon-editor + rotate: false + xy: 1023, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 1829, 621 + xy: 1337, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 753, 519 + xy: 1057, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 1895, 621 + xy: 1337, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 229, 11 + xy: 1403, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 switch-icon-editor rotate: false - xy: 753, 485 + xy: 463, 113 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils-icon-editor rotate: false - xy: 787, 519 + xy: 463, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tetrative-reconstructor-icon-editor rotate: false - xy: 323, 725 + xy: 323, 713 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 thermal-generator-icon-editor rotate: false - xy: 295, 11 + xy: 1403, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 809, 689 + xy: 909, 645 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 907, 689 + xy: 909, 547 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 753, 451 + xy: 497, 113 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 583, 659 + xy: 1469, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster-icon-editor rotate: false - xy: 1425, 885 + xy: 1587, 873 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-conveyor-icon-editor rotate: false - xy: 787, 485 + xy: 497, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 821, 519 + xy: 531, 113 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 583, 593 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-icon-editor - rotate: false - xy: 649, 689 + xy: 1469, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 underflow-gate-icon-editor rotate: false - xy: 787, 451 + xy: 531, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 821, 485 + xy: 463, 45 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 1005, 689 + xy: 1005, 775 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 649, 623 + xy: 1535, 675 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 715, 689 + xy: 1535, 609 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 white-tree-dead-icon-editor rotate: false - xy: 1, 693 + xy: 1, 681 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-icon-editor rotate: false - xy: 1, 371 + xy: 1, 359 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 -sprites7.png +sprites8.png size: 2048,1024 format: rgba8888 filter: nearest,nearest @@ -10311,7 +11542,7 @@ alpha-bg index: -1 bar rotate: false - xy: 1446, 235 + xy: 752, 86 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -10319,7 +11550,7 @@ bar index: -1 bar-top rotate: false - xy: 751, 578 + xy: 723, 86 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 @@ -10334,14 +11565,14 @@ block-additive-reconstructor-large index: -1 block-additive-reconstructor-medium rotate: false - xy: 569, 82 + xy: 877, 371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-additive-reconstructor-small rotate: false - xy: 781, 690 + xy: 1029, 555 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -10369,14 +11600,14 @@ block-air-factory-large index: -1 block-air-factory-medium rotate: false - xy: 1109, 647 + xy: 915, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-air-factory-small rotate: false - xy: 80, 2 + xy: 2023, 881 size: 24, 24 orig: 24, 24 offset: 0, 0 @@ -10397,28 +11628,28 @@ block-air-factory-xlarge index: -1 block-alloy-smelter-large rotate: false - xy: 651, 374 + xy: 651, 307 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-alloy-smelter-medium rotate: false - xy: 1143, 647 + xy: 949, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-alloy-smelter-small rotate: false - xy: 1475, 247 + xy: 2023, 855 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-alloy-smelter-tiny rotate: false - xy: 337, 1 + xy: 331, 598 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10432,28 +11663,28 @@ block-alloy-smelter-xlarge index: -1 block-arc-large rotate: false - xy: 701, 424 + xy: 551, 174 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-arc-medium rotate: false - xy: 1177, 647 + xy: 913, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-small rotate: false - xy: 1625, 456 + xy: 2023, 829 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-arc-tiny rotate: false - xy: 309, 698 + xy: 309, 672 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10467,28 +11698,28 @@ block-arc-xlarge index: -1 block-armored-conveyor-large rotate: false - xy: 351, 24 + xy: 546, 132 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-armored-conveyor-medium rotate: false - xy: 1211, 647 + xy: 947, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-small rotate: false - xy: 106, 2 + xy: 2023, 803 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-armored-conveyor-tiny rotate: false - xy: 331, 598 + xy: 1426, 214 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10500,352 +11731,422 @@ block-armored-conveyor-xlarge orig: 48, 48 offset: 0, 0 index: -1 -block-battery-large +block-basalt-large rotate: false - xy: 401, 74 + xy: 451, 74 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-battery-large-large +block-basalt-medium rotate: false - xy: 451, 124 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-medium - rotate: false - xy: 1245, 647 + xy: 1589, 647 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-battery-large-small +block-basalt-small rotate: false - xy: 1501, 247 + xy: 419, 7 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-battery-large-tiny - rotate: false - xy: 911, 372 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-large-xlarge - rotate: false - xy: 51, 478 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-battery-medium - rotate: false - xy: 1279, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-battery-small - rotate: false - xy: 1625, 430 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-battery-tiny - rotate: false - xy: 132, 10 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-battery-xlarge - rotate: false - xy: 131, 558 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-drill-large - rotate: false - xy: 501, 174 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-drill-medium - rotate: false - xy: 1313, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-small - rotate: false - xy: 1527, 247 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-drill-tiny - rotate: false - xy: 1023, 231 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-drill-xlarge - rotate: false - xy: 181, 608 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-blast-mixer-large - rotate: false - xy: 551, 224 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-mixer-medium - rotate: false - xy: 1347, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-mixer-small - rotate: false - xy: 1625, 404 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-blast-mixer-tiny - rotate: false - xy: 1551, 650 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-blast-mixer-xlarge - rotate: false - xy: 259, 769 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-block-forge-large - rotate: false - xy: 601, 274 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-forge-medium - rotate: false - xy: 1381, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-forge-small - rotate: false - xy: 1553, 247 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-forge-tiny - rotate: false - xy: 1659, 638 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-block-forge-xlarge - rotate: false - xy: 1, 378 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-block-loader-large - rotate: false - xy: 651, 332 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-loader-medium - rotate: false - xy: 1415, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-loader-small - rotate: false - xy: 1625, 378 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-loader-tiny - rotate: false - xy: 997, 205 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-block-loader-xlarge - rotate: false - xy: 51, 428 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-block-unloader-large - rotate: false - xy: 651, 290 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-unloader-medium - rotate: false - xy: 1449, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-unloader-small - rotate: false - xy: 1579, 247 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-unloader-tiny - rotate: false - xy: 941, 72 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-block-unloader-xlarge - rotate: false - xy: 181, 558 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conduit-large - rotate: false - xy: 751, 536 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conduit-medium - rotate: false - xy: 1483, 647 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conduit-small - rotate: false - xy: 1625, 352 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conduit-tiny - rotate: false - xy: 309, 680 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-bridge-conduit-xlarge - rotate: false - xy: 259, 719 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-bridge-conveyor-large - rotate: false - xy: 751, 494 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-bridge-conveyor-medium - rotate: false - xy: 1033, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-bridge-conveyor-small - rotate: false - xy: 1625, 326 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-bridge-conveyor-tiny +block-basalt-tiny rotate: false xy: 331, 580 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-bridge-conveyor-xlarge +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: 446, 32 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-large + rotate: false + xy: 651, 265 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-medium + rotate: false + xy: 1623, 658 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-battery-large-small + rotate: false + xy: 722, 26 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-battery-large-tiny + rotate: false + xy: 1444, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-battery-large-xlarge + rotate: false + xy: 131, 558 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-battery-medium + rotate: false + xy: 1657, 661 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-battery-small + rotate: false + xy: 810, 98 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-battery-tiny + rotate: false + xy: 1462, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-battery-xlarge + rotate: false + xy: 181, 608 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-blast-drill-large + rotate: false + xy: 644, 223 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-blast-drill-medium + rotate: false + xy: 1691, 660 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-blast-drill-small + rotate: false + xy: 752, 60 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-blast-drill-tiny + rotate: false + xy: 1480, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-blast-drill-xlarge + rotate: false + xy: 259, 769 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-blast-mixer-large + rotate: false + xy: 701, 334 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-blast-mixer-medium + rotate: false + xy: 1979, 899 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-blast-mixer-small + rotate: false + xy: 836, 98 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-blast-mixer-tiny + rotate: false + xy: 1498, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-blast-mixer-xlarge + rotate: false + xy: 1, 378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-block-forge-large + rotate: false + xy: 693, 292 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-block-forge-medium + rotate: false + xy: 2013, 907 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-block-forge-small + rotate: false + xy: 810, 72 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-block-forge-tiny + rotate: false + xy: 1516, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-block-forge-xlarge + rotate: false + xy: 51, 428 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-block-loader-large + rotate: false + xy: 693, 250 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-block-loader-medium + rotate: false + xy: 1989, 865 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-block-loader-small + rotate: false + xy: 862, 98 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-block-loader-tiny + rotate: false + xy: 856, 2 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-block-loader-xlarge + rotate: false + xy: 181, 558 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-block-unloader-large + rotate: false + xy: 686, 208 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-block-unloader-medium + rotate: false + xy: 1989, 831 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-block-unloader-small + rotate: false + xy: 836, 72 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-block-unloader-tiny + rotate: false + xy: 874, 2 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-block-unloader-xlarge + rotate: false + xy: 259, 719 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-boulder-large + rotate: false + xy: 751, 536 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-boulder-medium + rotate: false + xy: 1989, 797 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-boulder-small + rotate: false + xy: 888, 98 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-boulder-tiny + rotate: false + xy: 892, 2 + 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-char-large +block-bridge-conduit-large + rotate: false + xy: 751, 494 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-bridge-conduit-medium + rotate: false + xy: 1985, 763 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-bridge-conduit-small + rotate: false + xy: 862, 72 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-bridge-conduit-tiny + rotate: false + xy: 910, 2 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-bridge-conduit-xlarge + rotate: false + xy: 51, 378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-bridge-conveyor-large rotate: false xy: 793, 536 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 +block-bridge-conveyor-medium + rotate: false + xy: 1741, 703 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-bridge-conveyor-small + rotate: false + xy: 914, 98 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-bridge-conveyor-tiny + rotate: false + xy: 928, 2 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-bridge-conveyor-xlarge + rotate: false + xy: 259, 669 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-char-large + rotate: false + xy: 751, 452 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 block-char-medium rotate: false - xy: 1071, 618 + xy: 1133, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-char-small rotate: false - xy: 1625, 300 + xy: 888, 72 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-char-tiny rotate: false - xy: 959, 72 + xy: 946, 2 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-char-xlarge rotate: false - xy: 51, 378 + xy: 1, 278 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -10859,133 +12160,98 @@ block-cliff-large index: -1 block-cliff-medium rotate: false - xy: 1105, 613 + xy: 1167, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliff-small rotate: false - xy: 1625, 274 + xy: 940, 98 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cliff-tiny rotate: false - xy: 977, 72 + xy: 964, 2 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: 1139, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-small - rotate: false - xy: 1605, 247 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-cliffs-tiny - rotate: false - xy: 355, 6 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-cliffs-xlarge - rotate: false - xy: 1, 278 + xy: 51, 328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-coal-centrifuge-large rotate: false - xy: 835, 494 + xy: 835, 536 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-coal-centrifuge-medium rotate: false - xy: 1173, 613 + xy: 1201, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-coal-centrifuge-small rotate: false - xy: 1631, 248 + xy: 914, 72 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-coal-centrifuge-tiny rotate: false - xy: 373, 6 + xy: 1943, 757 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-coal-centrifuge-xlarge rotate: false - xy: 51, 328 + xy: 1, 228 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-combustion-generator-large rotate: false - xy: 751, 452 + xy: 751, 410 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-combustion-generator-medium rotate: false - xy: 1207, 613 + xy: 1235, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-combustion-generator-small rotate: false - xy: 1965, 865 + xy: 966, 98 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-combustion-generator-tiny rotate: false - xy: 391, 6 + xy: 1961, 757 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-combustion-generator-xlarge rotate: false - xy: 1, 228 + xy: 51, 278 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -10999,6685 +12265,6860 @@ block-command-center-large index: -1 block-command-center-medium rotate: false - xy: 1241, 613 + xy: 1269, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-command-center-small rotate: false - xy: 1971, 839 + xy: 940, 72 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-command-center-tiny rotate: false - xy: 409, 6 + xy: 1722, 183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-command-center-xlarge rotate: false - xy: 51, 278 + xy: 1, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-conduit-large rotate: false - xy: 835, 452 + xy: 835, 494 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conduit-medium rotate: false - xy: 1275, 613 + xy: 1303, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conduit-small rotate: false - xy: 971, 228 + xy: 966, 72 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conduit-tiny rotate: false - xy: 993, 98 + xy: 1945, 739 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-conduit-xlarge rotate: false - xy: 1, 178 + xy: 51, 228 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-container-large rotate: false - xy: 743, 410 + xy: 793, 410 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-container-medium rotate: false - xy: 1309, 613 + xy: 1337, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-container-small rotate: false - xy: 971, 202 + xy: 445, 6 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-container-tiny rotate: false - xy: 681, 52 + xy: 1945, 721 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-container-xlarge rotate: false - xy: 51, 228 + xy: 1, 128 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-conveyor-large rotate: false - xy: 785, 410 + xy: 835, 452 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conveyor-medium rotate: false - xy: 1343, 613 + xy: 1371, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conveyor-small rotate: false - xy: 1991, 873 + xy: 992, 87 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conveyor-tiny rotate: false - xy: 1023, 213 + xy: 1963, 739 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-conveyor-xlarge rotate: false - xy: 1, 128 + xy: 51, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-copper-wall-large rotate: false - xy: 827, 410 + xy: 835, 410 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-large rotate: false - xy: 701, 382 + xy: 751, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-medium rotate: false - xy: 1377, 613 + xy: 1405, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-large-small rotate: false - xy: 2017, 881 + xy: 1018, 87 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-large-tiny rotate: false - xy: 1041, 226 + xy: 1963, 721 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-copper-wall-large-xlarge rotate: false - xy: 51, 178 + xy: 1, 78 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-copper-wall-medium rotate: false - xy: 1411, 613 + xy: 1439, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-small rotate: false - xy: 1475, 221 + xy: 1929, 568 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-tiny rotate: false - xy: 1059, 226 + xy: 1962, 703 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-copper-wall-xlarge rotate: false - xy: 1, 78 + xy: 51, 128 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-foundation-large rotate: false - xy: 693, 340 + xy: 793, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-foundation-medium rotate: false - xy: 1445, 613 + xy: 1473, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-foundation-small rotate: false - xy: 1501, 221 + xy: 992, 61 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-foundation-tiny rotate: false - xy: 1041, 208 + xy: 1962, 685 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-foundation-xlarge rotate: false - xy: 51, 128 + xy: 1, 28 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-nucleus-large rotate: false - xy: 693, 298 + xy: 835, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-nucleus-medium rotate: false - xy: 1479, 613 + xy: 1507, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-nucleus-small rotate: false - xy: 1527, 221 + xy: 1018, 61 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-nucleus-tiny rotate: false - xy: 1059, 208 + xy: 1962, 667 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-nucleus-xlarge rotate: false - xy: 1, 28 + xy: 51, 78 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-shard-large rotate: false - xy: 743, 368 + xy: 743, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-shard-medium rotate: false - xy: 1067, 584 + xy: 1541, 618 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-shard-small rotate: false - xy: 1553, 221 + xy: 810, 46 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-shard-tiny rotate: false - xy: 1077, 221 + xy: 1962, 649 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-shard-xlarge rotate: false - xy: 51, 78 + xy: 51, 28 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-craters-large rotate: false - xy: 785, 368 + xy: 785, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-craters-medium rotate: false - xy: 1101, 579 + xy: 1125, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-craters-small rotate: false - xy: 1579, 221 + xy: 836, 46 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-craters-tiny rotate: false - xy: 1095, 221 + xy: 1962, 631 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-craters-xlarge rotate: false - xy: 51, 28 + xy: 857, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cryofluidmixer-large rotate: false - xy: 827, 368 + xy: 827, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cryofluidmixer-medium rotate: false - xy: 1135, 579 + xy: 1159, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cryofluidmixer-small rotate: false - xy: 1605, 221 + xy: 862, 46 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cryofluidmixer-tiny rotate: false - xy: 1113, 221 + xy: 1960, 613 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cryofluidmixer-xlarge rotate: false - xy: 857, 975 + xy: 907, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cultivator-large rotate: false - xy: 735, 326 + xy: 735, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cultivator-medium rotate: false - xy: 1169, 579 + xy: 1193, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cultivator-small rotate: false - xy: 1631, 222 + xy: 888, 46 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cultivator-tiny rotate: false - xy: 1131, 221 + xy: 1960, 595 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cultivator-xlarge rotate: false - xy: 907, 975 + xy: 957, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cyclone-large rotate: false - xy: 777, 326 + xy: 777, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cyclone-medium rotate: false - xy: 1203, 579 + xy: 1227, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cyclone-small rotate: false - xy: 1997, 847 + xy: 914, 46 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cyclone-tiny rotate: false - xy: 1149, 221 + xy: 1981, 745 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cyclone-xlarge - rotate: false - xy: 957, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-metal-large - rotate: false - xy: 819, 326 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-metal-medium - rotate: false - xy: 1237, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-metal-small - rotate: false - xy: 2023, 855 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-metal-tiny - rotate: false - xy: 1167, 221 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-metal-xlarge rotate: false xy: 1007, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-1-large - rotate: false - xy: 735, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-1-medium - rotate: false - xy: 1271, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-1-small - rotate: false - xy: 2023, 829 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-1-tiny - rotate: false - xy: 1185, 221 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-1-xlarge - rotate: false - xy: 1057, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-2-large - rotate: false - xy: 777, 284 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-2-medium - rotate: false - xy: 1305, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-2-small - rotate: false - xy: 1997, 821 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-2-tiny - rotate: false - xy: 1203, 221 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-2-xlarge - rotate: false - xy: 1107, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-3-large +block-dacite-boulder-large rotate: false xy: 819, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-3-medium +block-dacite-boulder-medium rotate: false - xy: 1339, 579 + xy: 1261, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-3-small +block-dacite-boulder-small rotate: false - xy: 2023, 803 + xy: 940, 46 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-3-tiny +block-dacite-boulder-tiny rotate: false - xy: 1221, 221 + xy: 1981, 727 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-3-xlarge +block-dacite-boulder-xlarge rotate: false - xy: 1157, 975 + xy: 1057, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-4-large - rotate: false - xy: 693, 256 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-4-medium - rotate: false - xy: 1373, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-4-small - rotate: false - xy: 1971, 813 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-4-tiny - rotate: false - xy: 1239, 221 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-4-xlarge - rotate: false - xy: 1207, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-5-large +block-dacite-large rotate: false xy: 735, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-5-medium +block-dacite-medium rotate: false - xy: 1407, 579 + xy: 1295, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-5-small +block-dacite-small rotate: false - xy: 1997, 795 + xy: 966, 46 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-5-tiny +block-dacite-tiny rotate: false - xy: 1257, 221 + xy: 1999, 745 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-5-xlarge - rotate: false - xy: 1257, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dark-panel-6-large +block-dacite-wall-large rotate: false xy: 777, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-6-medium +block-dacite-wall-medium rotate: false - xy: 1441, 579 + xy: 1329, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-6-small +block-dacite-wall-small rotate: false - xy: 2023, 777 + xy: 992, 35 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-6-tiny +block-dacite-wall-tiny rotate: false - xy: 1275, 221 + xy: 1999, 727 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-6-xlarge +block-dacite-wall-xlarge rotate: false - xy: 1307, 975 + xy: 1107, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-large +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: 819, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-darksand-medium +block-dark-metal-medium rotate: false - xy: 1475, 579 + xy: 1363, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-darksand-small +block-dark-metal-small rotate: false - xy: 997, 223 + xy: 1018, 35 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-darksand-tainted-water-large +block-dark-metal-tiny rotate: false - xy: 393, 24 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-medium - rotate: false - xy: 1979, 899 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-small - rotate: false - xy: 435, 6 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-tiny - rotate: false - xy: 1293, 221 + xy: 2017, 737 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-darksand-tainted-water-xlarge +block-dark-metal-xlarge + rotate: false + xy: 1207, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-1-large + rotate: false + xy: 728, 200 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-1-medium + rotate: false + xy: 1397, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-1-small + rotate: false + xy: 752, 34 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-1-tiny + rotate: false + xy: 2017, 719 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-1-xlarge + rotate: false + xy: 1257, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-2-large + rotate: false + xy: 770, 200 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-2-medium + rotate: false + xy: 1431, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-2-small + rotate: false + xy: 778, 35 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-2-tiny + rotate: false + xy: 1166, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-2-xlarge + rotate: false + xy: 1307, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-3-large + rotate: false + xy: 812, 200 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-3-medium + rotate: false + xy: 1465, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-3-small + rotate: false + xy: 1044, 79 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-3-tiny + rotate: false + xy: 1184, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-3-xlarge rotate: false xy: 1357, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-tiny +block-dark-panel-4-large rotate: false - xy: 1311, 221 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-large - rotate: false - xy: 443, 74 + xy: 601, 184 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-darksand-water-medium +block-dark-panel-4-medium rotate: false - xy: 2013, 907 + xy: 1499, 584 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-darksand-water-small +block-dark-panel-4-small rotate: false - xy: 461, 6 + xy: 1044, 53 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-darksand-water-tiny +block-dark-panel-4-tiny rotate: false - xy: 1329, 221 + xy: 1166, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-darksand-water-xlarge +block-dark-panel-4-xlarge rotate: false xy: 1407, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-xlarge +block-dark-panel-5-large + rotate: false + xy: 643, 181 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-5-medium + rotate: false + xy: 1533, 584 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-5-small + rotate: false + xy: 1070, 79 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-5-tiny + rotate: false + xy: 1202, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-5-xlarge rotate: false xy: 1457, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-deepwater-large +block-dark-panel-6-large rotate: false - xy: 435, 32 + xy: 685, 166 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-deepwater-medium +block-dark-panel-6-medium rotate: false - xy: 881, 560 + xy: 1575, 613 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-deepwater-small +block-dark-panel-6-small rotate: false - xy: 487, 6 + xy: 1070, 53 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-deepwater-tiny +block-dark-panel-6-tiny rotate: false - xy: 1077, 203 + xy: 1166, 152 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-deepwater-xlarge +block-dark-panel-6-xlarge rotate: false xy: 1507, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-differential-generator-large +block-darksand-large rotate: false - xy: 493, 124 + xy: 727, 158 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-differential-generator-medium +block-darksand-medium rotate: false - xy: 915, 560 + xy: 1567, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-differential-generator-small +block-darksand-small rotate: false - xy: 519, 14 + xy: 1096, 79 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-differential-generator-tiny +block-darksand-tainted-water-large rotate: false - xy: 1095, 203 + xy: 769, 158 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-medium + rotate: false + xy: 1609, 613 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-small + rotate: false + xy: 1096, 53 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-tiny + rotate: false + xy: 1184, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-differential-generator-xlarge +block-darksand-tainted-water-xlarge rotate: false xy: 1557, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-diode-large +block-darksand-tiny rotate: false - xy: 485, 82 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-diode-medium - rotate: false - xy: 949, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-diode-small - rotate: false - xy: 545, 14 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-diode-tiny - rotate: false - xy: 1113, 203 + xy: 1166, 134 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-diode-xlarge +block-darksand-water-large + rotate: false + xy: 811, 158 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-water-medium + rotate: false + xy: 1601, 579 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-water-small + rotate: false + xy: 1122, 79 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-water-tiny + rotate: false + xy: 1202, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-xlarge rotate: false xy: 1607, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-disassembler-large - rotate: false - xy: 543, 174 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-disassembler-medium - rotate: false - xy: 983, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-disassembler-small - rotate: false - xy: 571, 14 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-disassembler-tiny - rotate: false - xy: 1131, 203 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-disassembler-xlarge +block-darksand-xlarge rotate: false xy: 1657, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-distributor-large +block-deepwater-large rotate: false - xy: 535, 132 + xy: 501, 83 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-distributor-medium +block-deepwater-medium rotate: false - xy: 877, 526 + xy: 1725, 660 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-distributor-small +block-deepwater-small rotate: false - xy: 597, 14 + xy: 1122, 53 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-distributor-tiny +block-deepwater-tiny rotate: false - xy: 1149, 203 + xy: 1184, 152 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-distributor-xlarge +block-deepwater-xlarge rotate: false xy: 1707, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-door-large +block-differential-generator-large rotate: false - xy: 869, 410 + xy: 869, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-door-large-large +block-differential-generator-medium rotate: false - xy: 869, 368 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-medium - rotate: false - xy: 911, 526 + xy: 995, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-door-large-small +block-differential-generator-small rotate: false - xy: 1551, 668 + xy: 1044, 27 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-door-large-tiny +block-differential-generator-tiny rotate: false - xy: 1167, 203 + xy: 1166, 116 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-door-large-xlarge +block-differential-generator-xlarge rotate: false xy: 1757, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-door-medium - rotate: false - xy: 945, 526 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-door-small - rotate: false - xy: 1577, 676 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-door-tiny - rotate: false - xy: 1185, 203 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-door-xlarge - rotate: false - xy: 1807, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-dunerocks-large - rotate: false - xy: 861, 326 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dunerocks-medium - rotate: false - xy: 877, 492 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dunerocks-small - rotate: false - xy: 1577, 650 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dunerocks-tiny - rotate: false - xy: 1203, 203 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dunerocks-xlarge - rotate: false - xy: 1857, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-duo-large +block-diode-large rotate: false xy: 861, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-duo-medium +block-diode-medium rotate: false - xy: 911, 492 + xy: 987, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-duo-small +block-diode-small rotate: false - xy: 1581, 624 + xy: 1070, 27 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-duo-tiny +block-diode-tiny rotate: false - xy: 1221, 203 + xy: 1202, 152 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-duo-xlarge +block-diode-xlarge rotate: false - xy: 1907, 975 + xy: 1807, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-exponential-reconstructor-large +block-dirt-large rotate: false xy: 861, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-exponential-reconstructor-medium +block-dirt-medium rotate: false - xy: 945, 492 + xy: 983, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-exponential-reconstructor-small +block-dirt-small rotate: false - xy: 1607, 710 + xy: 1096, 27 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-exponential-reconstructor-tiny +block-dirt-tiny rotate: false - xy: 1239, 203 + xy: 1184, 134 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-exponential-reconstructor-xlarge +block-dirt-wall-large + rotate: false + xy: 854, 200 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dirt-wall-medium + rotate: false + xy: 981, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-small + rotate: false + xy: 1122, 27 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dirt-wall-tiny + rotate: false + xy: 1202, 134 + 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: 853, 158 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-disassembler-medium + rotate: false + xy: 1775, 703 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-disassembler-small + rotate: false + xy: 1148, 79 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-disassembler-tiny + rotate: false + xy: 1184, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-disassembler-xlarge rotate: false xy: 1957, 975 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-force-projector-large - rotate: false - xy: 593, 224 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-force-projector-medium - rotate: false - xy: 979, 526 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-force-projector-small - rotate: false - xy: 1607, 684 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-force-projector-tiny - rotate: false - xy: 1257, 203 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-force-projector-xlarge - rotate: false - xy: 345, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-fuse-large - rotate: false - xy: 585, 182 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-fuse-medium - rotate: false - xy: 877, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-fuse-small - rotate: false - xy: 1603, 658 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-fuse-tiny - rotate: false - xy: 1275, 203 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-fuse-xlarge - rotate: false - xy: 395, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-graphite-press-large - rotate: false - xy: 643, 248 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-graphite-press-medium - rotate: false - xy: 911, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-graphite-press-small - rotate: false - xy: 1607, 632 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-graphite-press-tiny - rotate: false - xy: 1293, 203 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-graphite-press-xlarge - rotate: false - xy: 445, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-grass-large - rotate: false - xy: 635, 206 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-grass-medium - rotate: false - xy: 945, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-grass-small - rotate: false - xy: 1633, 718 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-grass-tiny - rotate: false - xy: 1311, 203 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-grass-xlarge - rotate: false - xy: 495, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ground-factory-large - rotate: false - xy: 627, 164 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ground-factory-medium - rotate: false - xy: 979, 492 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ground-factory-small - rotate: false - xy: 1633, 692 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ground-factory-tiny - rotate: false - xy: 1329, 203 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ground-factory-xlarge - rotate: false - xy: 545, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hail-large - rotate: false - xy: 585, 140 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hail-medium - rotate: false - xy: 979, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hail-small - rotate: false - xy: 1629, 658 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hail-tiny - rotate: false - xy: 1347, 215 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hail-xlarge - rotate: false - xy: 595, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-holostone-large - rotate: false - xy: 627, 122 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-holostone-medium - rotate: false - xy: 911, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-small - rotate: false - xy: 1633, 632 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-holostone-tiny - rotate: false - xy: 1365, 215 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-holostone-xlarge - rotate: false - xy: 645, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hotrock-large - rotate: false - xy: 477, 32 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hotrock-medium - rotate: false - xy: 945, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-small - rotate: false - xy: 1611, 606 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hotrock-tiny - rotate: false - xy: 1383, 215 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hotrock-xlarge - rotate: false - xy: 695, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-hyper-processor-large - rotate: false - xy: 903, 326 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-hyper-processor-medium - rotate: false - xy: 911, 390 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hyper-processor-small - rotate: false - xy: 1611, 580 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-hyper-processor-tiny - rotate: false - xy: 1401, 215 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-hyper-processor-xlarge - rotate: false - xy: 101, 478 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-large +block-distributor-large rotate: false xy: 903, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ice-medium +block-distributor-medium rotate: false - xy: 945, 390 + xy: 1809, 705 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ice-small +block-distributor-small rotate: false - xy: 1637, 606 + xy: 1148, 53 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ice-snow-large +block-distributor-tiny + rotate: false + xy: 1202, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-distributor-xlarge + rotate: false + xy: 345, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-door-large rotate: false xy: 903, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ice-snow-medium +block-door-large-large rotate: false - xy: 979, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 1637, 580 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 1419, 215 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-snow-xlarge - rotate: false - xy: 101, 428 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-ice-tiny - rotate: false - xy: 1347, 197 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ice-xlarge - rotate: false - xy: 101, 378 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-icerocks-large - rotate: false - xy: 677, 206 + xy: 896, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-icerocks-medium +block-door-large-medium rotate: false - xy: 979, 390 + xy: 1759, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-icerocks-small +block-door-large-small rotate: false - xy: 1629, 554 + xy: 1148, 27 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-icerocks-tiny +block-door-large-tiny rotate: false - xy: 1365, 197 + xy: 1426, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-icerocks-xlarge +block-door-large-xlarge rotate: false - xy: 101, 328 + xy: 395, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ignarock-large +block-door-medium rotate: false - xy: 669, 164 + xy: 1843, 705 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-door-small + rotate: false + xy: 1955, 568 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-door-tiny + rotate: false + xy: 1444, 196 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-door-xlarge + rotate: false + xy: 445, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dune-wall-large + rotate: false + xy: 895, 158 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ignarock-medium +block-dune-wall-medium rotate: false - xy: 1517, 647 + xy: 1877, 711 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ignarock-small +block-dune-wall-small rotate: false - xy: 1655, 554 + xy: 804, 20 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ignarock-tiny +block-dune-wall-tiny rotate: false - xy: 1383, 197 + xy: 1462, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ignarock-xlarge +block-dune-wall-xlarge rotate: false - xy: 101, 278 + xy: 495, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-illuminator-large +block-duo-large rotate: false - xy: 669, 122 + xy: 546, 90 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-illuminator-medium +block-duo-medium rotate: false - xy: 1513, 613 + xy: 1793, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-illuminator-small +block-duo-small rotate: false - xy: 1654, 528 + xy: 830, 20 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-illuminator-tiny +block-duo-tiny rotate: false - xy: 1401, 197 + xy: 1480, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-illuminator-xlarge +block-duo-xlarge rotate: false - xy: 101, 228 + xy: 545, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-impact-reactor-large +block-exponential-reconstructor-large rotate: false - xy: 719, 200 + xy: 938, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-impact-reactor-medium +block-exponential-reconstructor-medium rotate: false - xy: 1509, 579 + xy: 1827, 671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-impact-reactor-small +block-exponential-reconstructor-small rotate: false - xy: 1654, 502 + xy: 856, 20 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-impact-reactor-tiny +block-exponential-reconstructor-tiny rotate: false - xy: 1419, 197 + xy: 1498, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-impact-reactor-xlarge +block-exponential-reconstructor-xlarge rotate: false - xy: 101, 178 + xy: 595, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-incinerator-large +block-force-projector-large rotate: false - xy: 761, 200 + xy: 937, 158 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-incinerator-medium +block-force-projector-medium rotate: false - xy: 1699, 828 + xy: 1861, 671 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-incinerator-small +block-force-projector-small rotate: false - xy: 1654, 476 + xy: 882, 20 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-incinerator-tiny +block-force-projector-tiny rotate: false - xy: 1663, 620 + xy: 1516, 196 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-incinerator-xlarge +block-force-projector-xlarge rotate: false - xy: 101, 128 + xy: 645, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-inverted-sorter-large - rotate: false - xy: 803, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-inverted-sorter-medium - rotate: false - xy: 1733, 828 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-inverted-sorter-small - rotate: false - xy: 1651, 450 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-inverted-sorter-tiny - rotate: false - xy: 1663, 602 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-inverted-sorter-xlarge - rotate: false - xy: 101, 78 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-source-large - rotate: false - xy: 845, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-source-medium - rotate: false - xy: 1767, 828 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-source-small - rotate: false - xy: 1651, 424 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-source-tiny - rotate: false - xy: 1663, 584 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-source-xlarge - rotate: false - xy: 101, 28 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-item-void-large - rotate: false - xy: 887, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-item-void-medium - rotate: false - xy: 1801, 828 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-item-void-small - rotate: false - xy: 1651, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-item-void-tiny - rotate: false - xy: 941, 54 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-item-void-xlarge - rotate: false - xy: 231, 608 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-junction-large - rotate: false - xy: 711, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-junction-medium - rotate: false - xy: 1835, 828 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-junction-small - rotate: false - xy: 1651, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-junction-tiny - rotate: false - xy: 959, 54 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-junction-xlarge - rotate: false - xy: 231, 558 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-kiln-large - rotate: false - xy: 753, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-kiln-medium - rotate: false - xy: 1869, 828 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-kiln-small - rotate: false - xy: 1651, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-kiln-tiny - rotate: false - xy: 977, 54 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-kiln-xlarge - rotate: false - xy: 745, 866 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-lancer-large - rotate: false - xy: 795, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-lancer-medium - rotate: false - xy: 1903, 828 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-lancer-small - rotate: false - xy: 1651, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-lancer-tiny - rotate: false - xy: 995, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-lancer-xlarge - rotate: false - xy: 151, 508 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-laser-drill-large - rotate: false - xy: 837, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-laser-drill-medium - rotate: false - xy: 1937, 828 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-laser-drill-small - rotate: false - xy: 1651, 294 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-laser-drill-tiny - rotate: false - xy: 995, 62 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-laser-drill-xlarge - rotate: false - xy: 151, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-large - rotate: false - xy: 879, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-large - rotate: false - xy: 711, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 1657, 786 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-large-small - rotate: false - xy: 1695, 802 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-large-tiny - rotate: false - xy: 995, 44 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-large-xlarge - rotate: false - xy: 201, 508 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-launch-pad-medium - rotate: false - xy: 1615, 744 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-launch-pad-small - rotate: false - xy: 1721, 802 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-launch-pad-tiny - rotate: false - xy: 1977, 795 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-launch-pad-xlarge - rotate: false - xy: 151, 408 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-junction-large - rotate: false - xy: 753, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-junction-medium - rotate: false - xy: 1573, 702 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-junction-small - rotate: false - xy: 1747, 802 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-junction-tiny - rotate: false - xy: 1977, 777 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-junction-xlarge - rotate: false - xy: 201, 458 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-router-large - rotate: false - xy: 795, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-router-medium - rotate: false - xy: 1017, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-router-small - rotate: false - xy: 1773, 802 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-router-tiny - rotate: false - xy: 1681, 628 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-router-xlarge - rotate: false - xy: 151, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-source-large - rotate: false - xy: 837, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-source-medium - rotate: false - xy: 1013, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-source-small - rotate: false - xy: 1799, 802 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-source-tiny - rotate: false - xy: 1699, 628 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-source-xlarge - rotate: false - xy: 201, 408 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-tank-large - rotate: false - xy: 879, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-tank-medium - rotate: false - xy: 1013, 487 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-small - rotate: false - xy: 1825, 802 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-tank-tiny - rotate: false - xy: 1681, 610 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-tank-xlarge - rotate: false - xy: 151, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-liquid-void-large - rotate: false - xy: 929, 200 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-void-medium - rotate: false - xy: 1013, 453 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-void-small - rotate: false - xy: 1851, 802 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-liquid-void-tiny - rotate: false - xy: 1717, 628 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-liquid-void-xlarge - rotate: false - xy: 201, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-display-large - rotate: false - xy: 921, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-display-medium - rotate: false - xy: 1013, 419 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-display-small - rotate: false - xy: 1877, 802 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-display-tiny - rotate: false - xy: 1735, 628 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-display-xlarge - rotate: false - xy: 151, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-logic-processor-large - rotate: false - xy: 921, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-logic-processor-medium - rotate: false - xy: 1013, 385 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-logic-processor-small - rotate: false - xy: 1903, 802 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-logic-processor-tiny - rotate: false - xy: 1681, 592 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-logic-processor-xlarge - rotate: false - xy: 201, 308 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-magmarock-large - rotate: false - xy: 527, 82 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-magmarock-medium - rotate: false - xy: 1051, 550 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-magmarock-small - rotate: false - xy: 1929, 802 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-magmarock-tiny - rotate: false - xy: 1699, 610 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-magmarock-xlarge - rotate: false - xy: 151, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mass-driver-large - rotate: false - xy: 519, 40 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mass-driver-medium - rotate: false - xy: 1047, 516 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-small - rotate: false - xy: 1691, 776 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mass-driver-tiny - rotate: false - xy: 1753, 628 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mass-driver-xlarge - rotate: false - xy: 201, 258 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-drill-large - rotate: false - xy: 963, 158 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-drill-medium - rotate: false - xy: 1047, 482 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-drill-small - rotate: false - xy: 1717, 776 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-drill-tiny - rotate: false - xy: 1717, 610 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-drill-xlarge - rotate: false - xy: 151, 158 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-mechanical-pump-large - rotate: false - xy: 963, 116 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-mechanical-pump-medium - rotate: false - xy: 1047, 448 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mechanical-pump-small - rotate: false - xy: 1743, 776 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-mechanical-pump-tiny - rotate: false - xy: 1735, 610 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-mechanical-pump-xlarge - rotate: false - xy: 201, 208 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-meltdown-large - rotate: false - xy: 561, 40 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-meltdown-medium - rotate: false - xy: 1047, 414 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-meltdown-small - rotate: false - xy: 1769, 776 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-meltdown-tiny - rotate: false - xy: 1699, 592 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-meltdown-xlarge - rotate: false - xy: 151, 108 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-melter-large +block-fuse-large rotate: false xy: 821, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-melter-medium +block-fuse-medium rotate: false - xy: 1047, 380 + xy: 1895, 677 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-melter-small +block-fuse-small rotate: false - xy: 1795, 776 + xy: 908, 20 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-melter-tiny +block-fuse-tiny rotate: false - xy: 1771, 628 + xy: 1534, 209 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-melter-xlarge +block-fuse-xlarge rotate: false - xy: 201, 158 + xy: 695, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-memory-cell-large +block-graphite-press-large rotate: false xy: 863, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-memory-cell-medium +block-graphite-press-medium rotate: false - xy: 1085, 545 + xy: 1759, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-memory-cell-small +block-graphite-press-small rotate: false - xy: 1821, 776 + xy: 934, 20 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-memory-cell-tiny +block-graphite-press-tiny rotate: false - xy: 1753, 610 + xy: 1552, 209 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-memory-cell-xlarge +block-graphite-press-xlarge rotate: false - xy: 151, 58 + xy: 101, 478 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mend-projector-large +block-grass-large rotate: false xy: 905, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mend-projector-medium +block-grass-medium rotate: false - xy: 1119, 545 + xy: 1793, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mend-projector-small +block-grass-small rotate: false - xy: 1847, 776 + xy: 960, 20 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mend-projector-tiny +block-grass-tiny rotate: false - xy: 1717, 592 + xy: 1570, 209 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mend-projector-xlarge +block-grass-xlarge rotate: false - xy: 201, 108 + xy: 101, 428 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mender-large +block-ground-factory-large rotate: false xy: 947, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mender-medium +block-ground-factory-medium rotate: false - xy: 1153, 545 + xy: 1827, 637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mender-small +block-ground-factory-small rotate: false - xy: 1873, 776 + xy: 778, 9 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mender-tiny +block-ground-factory-tiny rotate: false - xy: 1735, 592 + xy: 1588, 209 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mender-xlarge +block-ground-factory-xlarge rotate: false - xy: 201, 58 + xy: 101, 378 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-message-large +block-hail-large rotate: false xy: 989, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-message-medium +block-hail-medium rotate: false - xy: 1187, 545 + xy: 1861, 637 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-message-small +block-hail-small rotate: false - xy: 1899, 776 + xy: 986, 9 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-message-tiny +block-hail-tiny rotate: false - xy: 1789, 628 + xy: 1606, 209 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-message-xlarge +block-hail-xlarge rotate: false - xy: 251, 508 + xy: 101, 328 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-2-large +block-hotrock-large rotate: false xy: 1031, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-2-medium +block-hotrock-medium rotate: false - xy: 1221, 545 + xy: 1895, 643 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-2-small +block-hotrock-small rotate: false - xy: 1925, 776 + xy: 1012, 9 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-2-tiny +block-hotrock-tiny rotate: false - xy: 1771, 610 + xy: 1624, 209 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-2-xlarge +block-hotrock-xlarge rotate: false - xy: 251, 458 + xy: 101, 278 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-3-large +block-hyper-processor-large rotate: false xy: 1073, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-3-medium +block-hyper-processor-medium rotate: false - xy: 1255, 545 + xy: 1635, 579 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-3-small +block-hyper-processor-small rotate: false - xy: 1653, 760 + xy: 1038, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-3-tiny +block-hyper-processor-tiny rotate: false - xy: 1753, 592 + xy: 1534, 191 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-3-xlarge +block-hyper-processor-xlarge rotate: false - xy: 251, 408 + xy: 101, 228 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-5-large +block-ice-large rotate: false xy: 1115, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-5-medium +block-ice-medium rotate: false - xy: 1289, 545 + xy: 1021, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-5-small +block-ice-small rotate: false - xy: 1951, 776 + xy: 1064, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-5-tiny - rotate: false - xy: 1807, 628 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-metal-floor-5-xlarge - rotate: false - xy: 251, 358 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-large +block-ice-snow-large rotate: false xy: 1157, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-damaged-medium +block-ice-snow-medium rotate: false - xy: 1323, 545 + xy: 1017, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-damaged-small +block-ice-snow-small rotate: false - xy: 1659, 734 + xy: 1090, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-damaged-tiny +block-ice-snow-tiny rotate: false - xy: 1789, 610 + xy: 1552, 191 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-damaged-xlarge +block-ice-snow-xlarge rotate: false - xy: 251, 308 + xy: 101, 178 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-large +block-ice-tiny + rotate: false + xy: 1570, 191 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-wall-large rotate: false xy: 1199, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-medium +block-ice-wall-medium rotate: false - xy: 1357, 545 + xy: 1015, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-small +block-ice-wall-small rotate: false - xy: 1659, 708 + xy: 1116, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-tiny +block-ice-wall-tiny rotate: false - xy: 1771, 592 + xy: 1588, 191 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-xlarge +block-ice-wall-xlarge rotate: false - xy: 251, 258 + xy: 101, 128 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-micro-processor-large +block-ice-xlarge + rotate: false + xy: 101, 78 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-illuminator-large rotate: false xy: 1241, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-micro-processor-medium +block-illuminator-medium rotate: false - xy: 1391, 545 + xy: 1055, 547 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-micro-processor-small +block-illuminator-small rotate: false - xy: 1659, 682 + xy: 1142, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-micro-processor-tiny +block-illuminator-tiny rotate: false - xy: 1825, 628 + xy: 1606, 191 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-micro-processor-xlarge +block-illuminator-xlarge rotate: false - xy: 251, 208 + xy: 101, 28 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-moss-large +block-impact-reactor-large rotate: false xy: 1283, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-moss-medium +block-impact-reactor-medium rotate: false - xy: 1425, 545 + xy: 1089, 547 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-moss-small +block-impact-reactor-small rotate: false - xy: 1685, 750 + xy: 1168, 1 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-moss-tiny +block-impact-reactor-tiny rotate: false - xy: 1807, 610 + xy: 1624, 191 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-moss-xlarge +block-impact-reactor-xlarge rotate: false - xy: 251, 158 + xy: 231, 608 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-multi-press-large +block-incinerator-large rotate: false xy: 1325, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-multi-press-medium +block-incinerator-medium rotate: false - xy: 1459, 545 + xy: 1055, 513 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-multi-press-small +block-incinerator-small rotate: false - xy: 1685, 724 + xy: 748, 8 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-multi-press-tiny +block-incinerator-tiny rotate: false - xy: 1789, 592 + xy: 1642, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-multi-press-xlarge +block-incinerator-xlarge rotate: false - xy: 251, 108 + xy: 231, 558 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-large +block-inverted-sorter-large rotate: false xy: 1367, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-medium +block-inverted-sorter-medium rotate: false - xy: 1493, 545 + xy: 1089, 513 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-small +block-inverted-sorter-small rotate: false - xy: 1711, 750 + xy: 1151, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-tiny +block-inverted-sorter-tiny rotate: false - xy: 1843, 628 + xy: 1660, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-xlarge +block-inverted-sorter-xlarge rotate: false - xy: 251, 58 + xy: 745, 866 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-naval-factory-large +block-item-source-large rotate: false xy: 1409, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-naval-factory-medium +block-item-source-medium rotate: false - xy: 1081, 511 + xy: 1051, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-naval-factory-small +block-item-source-small rotate: false - xy: 1685, 698 + xy: 1177, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-naval-factory-tiny +block-item-source-tiny rotate: false - xy: 1825, 610 + xy: 1678, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-naval-factory-xlarge +block-item-source-xlarge rotate: false - xy: 151, 8 + xy: 151, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-oil-extractor-large +block-item-void-large rotate: false xy: 1451, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-oil-extractor-medium +block-item-void-medium rotate: false - xy: 1081, 477 + xy: 1085, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-oil-extractor-small +block-item-void-small rotate: false - xy: 1711, 724 + xy: 1203, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-oil-extractor-tiny +block-item-void-tiny rotate: false - xy: 1807, 592 + xy: 1740, 183 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-oil-extractor-xlarge +block-item-void-xlarge rotate: false - xy: 201, 8 + xy: 151, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-coal-large +block-junction-large rotate: false xy: 1493, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-coal-medium +block-junction-medium rotate: false - xy: 1115, 511 + xy: 1049, 445 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-coal-small +block-junction-small rotate: false - xy: 1737, 750 + xy: 1229, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-coal-tiny +block-junction-tiny rotate: false - xy: 1861, 628 + xy: 1220, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-coal-xlarge +block-junction-xlarge rotate: false - xy: 251, 8 + xy: 201, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-copper-large +block-kiln-large rotate: false xy: 1535, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-copper-medium +block-kiln-medium rotate: false - xy: 1081, 443 + xy: 1083, 445 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-copper-small +block-kiln-small rotate: false - xy: 1711, 698 + xy: 1255, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-copper-tiny +block-kiln-tiny rotate: false - xy: 1843, 610 + xy: 1220, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-copper-xlarge +block-kiln-xlarge rotate: false - xy: 281, 619 + xy: 151, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-lead-large +block-lancer-large rotate: false xy: 1577, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-lead-medium +block-lancer-medium rotate: false - xy: 1115, 477 + xy: 1895, 609 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-lead-small +block-lancer-small rotate: false - xy: 1737, 724 + xy: 1281, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-lead-tiny +block-lancer-tiny rotate: false - xy: 1825, 592 + xy: 1220, 152 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-lead-xlarge +block-lancer-xlarge rotate: false - xy: 281, 569 + xy: 201, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-scrap-large +block-large-logic-display-large rotate: false xy: 1619, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-scrap-medium +block-large-logic-display-medium rotate: false - xy: 1149, 511 + xy: 488, 40 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-scrap-small +block-large-logic-display-small rotate: false - xy: 1763, 750 + xy: 1307, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-scrap-tiny +block-large-logic-display-tiny rotate: false - xy: 1879, 628 + xy: 1220, 134 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-scrap-xlarge +block-large-logic-display-xlarge rotate: false - xy: 301, 519 + xy: 151, 358 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-thorium-large +block-laser-drill-large rotate: false xy: 1661, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-thorium-medium +block-laser-drill-medium rotate: false - xy: 1081, 409 + xy: 522, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-thorium-small +block-laser-drill-small rotate: false - xy: 1737, 698 + xy: 1333, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-thorium-tiny +block-laser-drill-tiny rotate: false - xy: 1861, 610 + xy: 1220, 116 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-thorium-xlarge +block-laser-drill-xlarge rotate: false - xy: 301, 469 + xy: 201, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-titanium-large +block-launch-pad-large rotate: false xy: 1703, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-titanium-medium - rotate: false - xy: 1115, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-small - rotate: false - xy: 1763, 724 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ore-titanium-tiny - rotate: false - xy: 1843, 592 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-ore-titanium-xlarge - rotate: false - xy: 301, 419 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-overdrive-dome-large +block-launch-pad-large-large rotate: false xy: 1745, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-dome-medium +block-launch-pad-large-medium rotate: false - xy: 1149, 477 + xy: 556, 56 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-dome-small +block-launch-pad-large-small rotate: false - xy: 1789, 750 + xy: 1359, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-dome-tiny +block-launch-pad-large-tiny rotate: false - xy: 1897, 628 + xy: 1174, 98 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-dome-xlarge +block-launch-pad-large-xlarge rotate: false - xy: 301, 369 + xy: 151, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-projector-large +block-launch-pad-medium + rotate: false + xy: 522, 15 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-launch-pad-small + rotate: false + xy: 1385, 388 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-launch-pad-tiny + rotate: false + xy: 1174, 80 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-launch-pad-xlarge + rotate: false + xy: 201, 358 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-junction-large rotate: false xy: 1787, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-projector-medium +block-liquid-junction-medium rotate: false - xy: 1183, 511 + xy: 556, 22 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-projector-small +block-liquid-junction-small rotate: false - xy: 1763, 698 + xy: 1411, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-projector-tiny +block-liquid-junction-tiny rotate: false - xy: 1879, 610 + xy: 1192, 98 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-projector-xlarge +block-liquid-junction-xlarge rotate: false - xy: 301, 319 + xy: 151, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overflow-gate-large +block-liquid-router-large rotate: false xy: 1829, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overflow-gate-medium +block-liquid-router-medium rotate: false - xy: 1115, 409 + xy: 488, 6 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overflow-gate-small +block-liquid-router-small rotate: false - xy: 1789, 724 + xy: 1437, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overflow-gate-tiny +block-liquid-router-tiny rotate: false - xy: 1861, 592 + xy: 1174, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overflow-gate-xlarge +block-liquid-router-xlarge rotate: false - xy: 301, 269 + xy: 201, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-parallax-large +block-liquid-source-large rotate: false xy: 1871, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-parallax-medium +block-liquid-source-medium rotate: false - xy: 1149, 443 + xy: 588, 140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-parallax-small +block-liquid-source-small rotate: false - xy: 1815, 750 + xy: 1463, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-parallax-tiny +block-liquid-source-tiny rotate: false - xy: 1915, 628 + xy: 1210, 98 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-parallax-xlarge +block-liquid-source-xlarge rotate: false - xy: 301, 219 + xy: 151, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-payload-conveyor-large +block-liquid-tank-large rotate: false xy: 1913, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-payload-conveyor-medium +block-liquid-tank-medium rotate: false - xy: 1183, 477 + xy: 588, 106 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-payload-conveyor-small +block-liquid-tank-small rotate: false - xy: 1789, 698 + xy: 1489, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-payload-conveyor-tiny +block-liquid-tank-tiny rotate: false - xy: 1897, 610 + xy: 1192, 80 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-payload-conveyor-xlarge +block-liquid-tank-xlarge rotate: false - xy: 301, 169 + xy: 201, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-payload-router-large +block-liquid-void-large rotate: false xy: 1955, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-payload-router-medium +block-liquid-void-medium rotate: false - xy: 1217, 511 + xy: 590, 72 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-payload-router-small +block-liquid-void-small rotate: false - xy: 1815, 724 + xy: 1515, 388 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-payload-router-tiny +block-liquid-void-tiny rotate: false - xy: 1879, 592 + xy: 1174, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-payload-router-xlarge +block-liquid-void-xlarge rotate: false - xy: 301, 119 + xy: 151, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pebbles-large +block-logic-display-large rotate: false xy: 845, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pebbles-medium +block-logic-display-medium rotate: false - xy: 1149, 409 + xy: 590, 38 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pebbles-small +block-logic-display-small rotate: false - xy: 1841, 750 + xy: 1150, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pebbles-tiny +block-logic-display-tiny rotate: false - xy: 1933, 628 + xy: 1210, 80 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pebbles-xlarge +block-logic-display-xlarge rotate: false - xy: 301, 69 + xy: 201, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conduit-large +block-logic-processor-large rotate: false xy: 887, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conduit-medium +block-logic-processor-medium rotate: false - xy: 1183, 443 + xy: 590, 4 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conduit-small +block-logic-processor-small rotate: false - xy: 1815, 698 + xy: 1176, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conduit-tiny +block-logic-processor-tiny rotate: false - xy: 1915, 610 + xy: 1192, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conduit-xlarge +block-logic-processor-xlarge rotate: false - xy: 301, 19 + xy: 151, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conveyor-large +block-magmarock-large rotate: false xy: 929, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conveyor-medium +block-magmarock-medium rotate: false - xy: 1217, 477 + xy: 622, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conveyor-small +block-magmarock-small rotate: false - xy: 1841, 724 + xy: 1202, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conveyor-tiny +block-magmarock-tiny rotate: false - xy: 1897, 592 + xy: 1210, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conveyor-xlarge +block-magmarock-xlarge rotate: false - xy: 795, 878 + xy: 201, 158 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-large +block-mass-driver-large rotate: false xy: 971, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-wall-large-large +block-mass-driver-medium + rotate: false + xy: 622, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mass-driver-small + rotate: false + xy: 1228, 362 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mass-driver-tiny + rotate: false + xy: 1192, 44 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mass-driver-xlarge + rotate: false + xy: 151, 58 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mechanical-drill-large rotate: false xy: 1013, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-wall-large-medium +block-mechanical-drill-medium rotate: false - xy: 1251, 511 + xy: 624, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-wall-large-small +block-mechanical-drill-small rotate: false - xy: 1867, 750 + xy: 1254, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-wall-large-tiny +block-mechanical-drill-tiny rotate: false - xy: 1951, 628 + xy: 1210, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-wall-large-xlarge +block-mechanical-drill-xlarge rotate: false - xy: 309, 816 + xy: 201, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-medium - rotate: false - xy: 1183, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-wall-small - rotate: false - xy: 1841, 698 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-phase-wall-tiny - rotate: false - xy: 1933, 610 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-phase-wall-xlarge - rotate: false - xy: 309, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-phase-weaver-large +block-mechanical-pump-large rotate: false xy: 1055, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-weaver-medium +block-mechanical-pump-medium rotate: false - xy: 1217, 443 + xy: 624, 45 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-weaver-small +block-mechanical-pump-small rotate: false - xy: 1867, 724 + xy: 1280, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-weaver-tiny +block-mechanical-pump-tiny rotate: false - xy: 1915, 592 + xy: 1228, 98 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-weaver-xlarge +block-mechanical-pump-xlarge rotate: false - xy: 359, 816 + xy: 201, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pine-large +block-meltdown-large rotate: false xy: 1097, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pine-medium +block-meltdown-medium rotate: false - xy: 1251, 477 + xy: 624, 11 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pine-small +block-meltdown-small rotate: false - xy: 1893, 750 + xy: 1306, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pine-tiny +block-meltdown-tiny rotate: false - xy: 1969, 628 + xy: 1228, 80 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pine-xlarge +block-meltdown-xlarge rotate: false - xy: 309, 716 + xy: 251, 508 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-compressor-large +block-melter-large rotate: false xy: 1139, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-compressor-medium +block-melter-medium rotate: false - xy: 1285, 511 + xy: 656, 132 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-compressor-small +block-melter-small rotate: false - xy: 1867, 698 + xy: 1332, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-compressor-tiny +block-melter-tiny rotate: false - xy: 1951, 610 + xy: 1228, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-compressor-xlarge +block-melter-xlarge rotate: false - xy: 359, 766 + xy: 251, 458 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-conveyor-large +block-memory-bank-large rotate: false xy: 1181, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-conveyor-medium +block-memory-bank-medium rotate: false - xy: 1217, 409 + xy: 690, 132 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-conveyor-small +block-memory-bank-small rotate: false - xy: 1893, 724 + xy: 1358, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-conveyor-tiny +block-memory-bank-tiny rotate: false - xy: 1933, 592 + xy: 1228, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-conveyor-xlarge +block-memory-bank-xlarge rotate: false - xy: 409, 816 + xy: 251, 408 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-large +block-memory-cell-large rotate: false xy: 1223, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-wall-large-large +block-memory-cell-medium + rotate: false + xy: 724, 124 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-memory-cell-small + rotate: false + xy: 1384, 362 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-memory-cell-tiny + rotate: false + xy: 1981, 709 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-memory-cell-xlarge + rotate: false + xy: 251, 358 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mend-projector-large rotate: false xy: 1265, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-wall-large-medium +block-mend-projector-medium rotate: false - xy: 1251, 443 + xy: 758, 124 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-wall-large-small +block-mend-projector-small rotate: false - xy: 1919, 750 + xy: 1410, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-wall-large-tiny +block-mend-projector-tiny rotate: false - xy: 1969, 610 + xy: 1999, 709 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-wall-large-xlarge +block-mend-projector-xlarge rotate: false - xy: 359, 716 + xy: 251, 308 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-medium - rotate: false - xy: 1285, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-plastanium-wall-small - rotate: false - xy: 1893, 698 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-plastanium-wall-tiny - rotate: false - xy: 1951, 592 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-plastanium-wall-xlarge - rotate: false - xy: 409, 766 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-plated-conduit-large +block-mender-large rotate: false xy: 1307, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plated-conduit-medium +block-mender-medium rotate: false - xy: 1319, 511 + xy: 792, 124 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plated-conduit-small +block-mender-small rotate: false - xy: 1919, 724 + xy: 1436, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plated-conduit-tiny +block-mender-tiny rotate: false - xy: 1969, 592 + xy: 1980, 691 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plated-conduit-xlarge +block-mender-xlarge rotate: false - xy: 459, 816 + xy: 251, 258 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pneumatic-drill-large +block-message-large rotate: false xy: 1349, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pneumatic-drill-medium +block-message-medium rotate: false - xy: 1251, 409 + xy: 826, 124 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pneumatic-drill-small +block-message-small rotate: false - xy: 1945, 750 + xy: 1462, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pneumatic-drill-tiny +block-message-tiny rotate: false - xy: 1681, 574 + xy: 1980, 673 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pneumatic-drill-xlarge +block-message-xlarge rotate: false - xy: 409, 716 + xy: 251, 208 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-large +block-metal-floor-2-large rotate: false xy: 1391, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-node-large-large +block-metal-floor-2-medium + rotate: false + xy: 860, 124 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-2-small + rotate: false + xy: 1488, 362 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-2-tiny + rotate: false + xy: 1998, 691 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-2-xlarge + rotate: false + xy: 251, 158 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-3-large rotate: false xy: 1433, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-node-large-medium +block-metal-floor-3-medium rotate: false - xy: 1285, 443 + xy: 894, 124 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-node-large-small +block-metal-floor-3-small rotate: false - xy: 1919, 698 + xy: 1514, 362 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-node-large-tiny +block-metal-floor-3-tiny rotate: false - xy: 1681, 556 + xy: 1980, 655 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-node-large-xlarge +block-metal-floor-3-xlarge rotate: false - xy: 459, 766 + xy: 251, 108 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-medium - rotate: false - xy: 1319, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-power-node-small - rotate: false - xy: 1945, 724 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-power-node-tiny - rotate: false - xy: 1699, 574 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-power-node-xlarge - rotate: false - xy: 509, 816 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-power-source-large +block-metal-floor-5-large rotate: false xy: 1475, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-source-medium +block-metal-floor-5-medium rotate: false - xy: 1353, 511 + xy: 928, 124 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-source-small +block-metal-floor-5-small rotate: false - xy: 1945, 698 + xy: 1149, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-source-tiny +block-metal-floor-5-tiny rotate: false - xy: 1717, 574 + xy: 1998, 673 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-source-xlarge +block-metal-floor-5-xlarge rotate: false - xy: 459, 716 + xy: 251, 58 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-void-large +block-metal-floor-damaged-large rotate: false xy: 1517, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-void-medium +block-metal-floor-damaged-medium rotate: false - xy: 1285, 409 + xy: 962, 124 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-void-small +block-metal-floor-damaged-small rotate: false - xy: 1685, 672 + xy: 1149, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-void-tiny +block-metal-floor-damaged-tiny rotate: false - xy: 1735, 574 + xy: 1980, 637 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-void-xlarge +block-metal-floor-damaged-xlarge rotate: false - xy: 509, 766 + xy: 151, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulse-conduit-large +block-metal-floor-large rotate: false xy: 1559, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulse-conduit-medium +block-metal-floor-medium rotate: false - xy: 1319, 443 + xy: 658, 98 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulse-conduit-small +block-metal-floor-small rotate: false - xy: 1711, 672 + xy: 1175, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulse-conduit-tiny +block-metal-floor-tiny rotate: false - xy: 1699, 556 + xy: 1998, 655 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulse-conduit-xlarge +block-metal-floor-xlarge rotate: false - xy: 559, 816 + xy: 201, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulverizer-large +block-micro-processor-large rotate: false xy: 1601, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulverizer-medium +block-micro-processor-medium rotate: false - xy: 1353, 477 + xy: 658, 64 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulverizer-small +block-micro-processor-small rotate: false - xy: 1737, 672 + xy: 1149, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulverizer-tiny +block-micro-processor-tiny rotate: false - xy: 1753, 574 + xy: 1998, 637 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulverizer-xlarge +block-micro-processor-xlarge rotate: false - xy: 509, 716 + xy: 251, 8 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pyratite-mixer-large +block-moss-large rotate: false xy: 1643, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pyratite-mixer-medium +block-moss-medium rotate: false - xy: 1387, 511 + xy: 658, 30 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pyratite-mixer-small +block-moss-small rotate: false - xy: 1763, 672 + xy: 1201, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pyratite-mixer-tiny +block-moss-tiny rotate: false - xy: 1717, 556 + xy: 2017, 701 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pyratite-mixer-xlarge +block-moss-xlarge rotate: false - xy: 559, 766 + xy: 281, 619 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-repair-point-large +block-mud-large rotate: false xy: 1685, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-repair-point-medium +block-mud-medium rotate: false - xy: 1319, 409 + xy: 1657, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-repair-point-small +block-mud-small rotate: false - xy: 1789, 672 + xy: 1175, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-repair-point-tiny +block-mud-tiny rotate: false - xy: 1735, 556 + xy: 2016, 683 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-repair-point-xlarge +block-mud-xlarge rotate: false - xy: 609, 816 + xy: 281, 569 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-resupply-point-large +block-multi-press-large rotate: false xy: 1727, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-resupply-point-medium +block-multi-press-medium rotate: false - xy: 1353, 443 + xy: 1691, 626 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-resupply-point-small +block-multi-press-small rotate: false - xy: 1815, 672 + xy: 1227, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-resupply-point-tiny +block-multi-press-tiny rotate: false - xy: 1771, 574 + xy: 2016, 665 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-resupply-point-xlarge +block-multi-press-xlarge rotate: false - xy: 559, 716 + xy: 301, 519 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ripple-large +block-multiplicative-reconstructor-large rotate: false xy: 1769, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ripple-medium +block-multiplicative-reconstructor-medium rotate: false - xy: 1387, 477 + xy: 1725, 626 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ripple-small +block-multiplicative-reconstructor-small rotate: false - xy: 1841, 672 + xy: 1201, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ripple-tiny +block-multiplicative-reconstructor-tiny rotate: false - xy: 1753, 556 + xy: 2016, 647 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ripple-xlarge +block-multiplicative-reconstructor-xlarge rotate: false - xy: 609, 766 + xy: 301, 469 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rock-large +block-naval-factory-large rotate: false xy: 1811, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rock-medium +block-naval-factory-medium rotate: false - xy: 1421, 511 + xy: 1759, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rock-small +block-naval-factory-small rotate: false - xy: 1867, 672 + xy: 1175, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rock-tiny +block-naval-factory-tiny rotate: false - xy: 1789, 574 + xy: 2016, 629 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rock-xlarge +block-naval-factory-xlarge rotate: false - xy: 659, 816 + xy: 301, 419 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rocks-large +block-oil-extractor-large rotate: false xy: 1853, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rocks-medium +block-oil-extractor-medium rotate: false - xy: 1353, 409 + xy: 1793, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rocks-small +block-oil-extractor-small rotate: false - xy: 1893, 672 + xy: 1253, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rocks-tiny +block-oil-extractor-tiny rotate: false - xy: 1771, 556 + xy: 1980, 619 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rocks-xlarge +block-oil-extractor-xlarge rotate: false - xy: 609, 716 + xy: 301, 369 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rotary-pump-large +block-ore-coal-large rotate: false xy: 1895, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rotary-pump-medium +block-ore-coal-medium rotate: false - xy: 1387, 443 + xy: 1827, 603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rotary-pump-small +block-ore-coal-small rotate: false - xy: 1919, 672 + xy: 1227, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rotary-pump-tiny +block-ore-coal-tiny rotate: false - xy: 1807, 574 + xy: 1998, 619 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rotary-pump-xlarge +block-ore-coal-xlarge rotate: false - xy: 659, 766 + xy: 301, 319 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-router-large +block-ore-copper-large rotate: false xy: 1937, 891 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-router-medium +block-ore-copper-medium rotate: false - xy: 1421, 477 + xy: 1861, 603 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-router-small +block-ore-copper-small rotate: false - xy: 1945, 672 + xy: 1201, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-router-tiny +block-ore-copper-tiny rotate: false - xy: 1789, 556 + xy: 1978, 601 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-router-xlarge +block-ore-copper-xlarge rotate: false - xy: 709, 816 + xy: 301, 269 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rtg-generator-large +block-ore-lead-large rotate: false xy: 859, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rtg-generator-medium +block-ore-lead-medium rotate: false - xy: 1455, 511 + xy: 1895, 575 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rtg-generator-small +block-ore-lead-small rotate: false - xy: 1659, 656 + xy: 1279, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rtg-generator-tiny +block-ore-lead-tiny rotate: false - xy: 1825, 574 + xy: 1996, 601 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rtg-generator-xlarge +block-ore-lead-xlarge rotate: false - xy: 659, 716 + xy: 301, 219 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salt-large +block-ore-scrap-large rotate: false xy: 859, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salt-medium +block-ore-scrap-medium rotate: false - xy: 1387, 409 + xy: 1119, 479 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salt-small +block-ore-scrap-small rotate: false - xy: 1685, 646 + xy: 1253, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salt-tiny +block-ore-scrap-tiny rotate: false - xy: 1807, 556 + xy: 1981, 583 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salt-xlarge +block-ore-scrap-xlarge rotate: false - xy: 709, 766 + xy: 301, 169 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-saltrocks-large +block-ore-thorium-large rotate: false xy: 901, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-saltrocks-medium +block-ore-thorium-medium rotate: false - xy: 1421, 443 + xy: 1117, 445 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-saltrocks-small +block-ore-thorium-small rotate: false - xy: 1711, 646 + xy: 1227, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-saltrocks-tiny +block-ore-thorium-tiny rotate: false - xy: 1843, 574 + xy: 1981, 565 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-saltrocks-xlarge +block-ore-thorium-xlarge rotate: false - xy: 709, 716 + xy: 301, 119 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salvo-large +block-ore-titanium-large rotate: false xy: 859, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salvo-medium +block-ore-titanium-medium rotate: false - xy: 1455, 477 + xy: 913, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salvo-small +block-ore-titanium-small rotate: false - xy: 1737, 646 + xy: 1305, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salvo-tiny +block-ore-titanium-tiny rotate: false - xy: 1825, 556 + xy: 1999, 583 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salvo-xlarge +block-ore-titanium-xlarge rotate: false - xy: 759, 816 + xy: 301, 69 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-boulder-large +block-overdrive-dome-large rotate: false xy: 943, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-boulder-medium +block-overdrive-dome-medium rotate: false - xy: 1489, 511 + xy: 947, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-boulder-small +block-overdrive-dome-small rotate: false - xy: 1763, 646 + xy: 1279, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-boulder-tiny +block-overdrive-dome-tiny rotate: false - xy: 1861, 574 + xy: 1999, 565 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-boulder-xlarge +block-overdrive-dome-xlarge rotate: false - xy: 759, 766 + xy: 301, 19 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-large +block-overdrive-projector-large rotate: false xy: 901, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-medium +block-overdrive-projector-medium rotate: false - xy: 1421, 409 + xy: 981, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-small +block-overdrive-projector-small rotate: false - xy: 1789, 646 + xy: 1253, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-tiny +block-overdrive-projector-tiny rotate: false - xy: 1843, 556 + xy: 2016, 611 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-water-large +block-overdrive-projector-xlarge + rotate: false + xy: 795, 878 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-overflow-gate-large rotate: false xy: 859, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-water-medium +block-overflow-gate-medium rotate: false - xy: 1455, 443 + xy: 1015, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-water-small +block-overflow-gate-small rotate: false - xy: 1815, 646 + xy: 1331, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-water-tiny +block-overflow-gate-tiny rotate: false - xy: 1879, 574 + xy: 2017, 593 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-water-xlarge +block-overflow-gate-xlarge rotate: false - xy: 759, 716 + xy: 309, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-xlarge - rotate: false - xy: 809, 828 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sandrocks-large +block-parallax-large rotate: false xy: 985, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sandrocks-medium +block-parallax-medium rotate: false - xy: 1489, 477 + xy: 1049, 411 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sandrocks-small +block-parallax-small rotate: false - xy: 1841, 646 + xy: 1305, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sandrocks-tiny +block-parallax-tiny rotate: false - xy: 1861, 556 + xy: 2017, 575 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sandrocks-xlarge +block-parallax-xlarge rotate: false - xy: 809, 778 + xy: 309, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scatter-large +block-payload-conveyor-large rotate: false xy: 943, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scatter-medium +block-payload-conveyor-medium rotate: false - xy: 1455, 409 + xy: 1083, 411 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scatter-small +block-payload-conveyor-small rotate: false - xy: 1867, 646 + xy: 1279, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scatter-tiny +block-payload-conveyor-tiny rotate: false - xy: 1897, 574 + xy: 2017, 557 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scatter-xlarge +block-payload-conveyor-xlarge rotate: false - xy: 809, 728 + xy: 359, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scorch-large +block-payload-router-large rotate: false xy: 901, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scorch-medium +block-payload-router-medium rotate: false - xy: 1489, 443 + xy: 1117, 411 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scorch-small +block-payload-router-small rotate: false - xy: 1893, 646 + xy: 1357, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scorch-tiny +block-payload-router-tiny rotate: false - xy: 1879, 556 + xy: 1280, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scorch-xlarge +block-payload-router-xlarge rotate: false - xy: 809, 678 + xy: 309, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-large +block-pebbles-large rotate: false xy: 859, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-medium +block-pebbles-medium rotate: false - xy: 1489, 409 + xy: 912, 390 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-small +block-pebbles-small rotate: false - xy: 1919, 646 + xy: 1331, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-tiny +block-pebbles-tiny rotate: false - xy: 1915, 574 + xy: 1298, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-xlarge +block-pebbles-xlarge rotate: false - xy: 331, 666 + xy: 359, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-huge-large +block-phase-conduit-large rotate: false xy: 1027, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-huge-medium +block-phase-conduit-medium rotate: false - xy: 1081, 375 + xy: 946, 390 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-huge-small +block-phase-conduit-small rotate: false - xy: 1945, 646 + xy: 1305, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-huge-tiny +block-phase-conduit-tiny rotate: false - xy: 1897, 556 + xy: 1669, 609 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-huge-xlarge +block-phase-conduit-xlarge rotate: false - xy: 331, 616 + xy: 409, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-large +block-phase-conveyor-large rotate: false xy: 985, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-large-large +block-phase-conveyor-medium + rotate: false + xy: 911, 356 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conveyor-small + rotate: false + xy: 1383, 336 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-conveyor-tiny + rotate: false + xy: 1669, 591 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-conveyor-xlarge + rotate: false + xy: 359, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-wall-large rotate: false xy: 943, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 1115, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-large-small - rotate: false - xy: 1971, 750 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-large-tiny - rotate: false - xy: 1933, 574 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-large-xlarge - rotate: false - xy: 381, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-scrap-wall-medium - rotate: false - xy: 1149, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-small - rotate: false - xy: 1971, 724 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-tiny - rotate: false - xy: 1915, 556 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-xlarge - rotate: false - xy: 381, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-segment-large +block-phase-wall-large-large rotate: false xy: 901, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-segment-medium - rotate: false - xy: 1183, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-segment-small - rotate: false - xy: 1971, 698 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-segment-tiny - rotate: false - xy: 1951, 574 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-segment-xlarge - rotate: false - xy: 431, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-separator-large - rotate: false - xy: 1069, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-separator-medium - rotate: false - xy: 1217, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-separator-small - rotate: false - xy: 1971, 672 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-separator-tiny - rotate: false - xy: 1933, 556 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-separator-xlarge - rotate: false - xy: 431, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-boulder-large - rotate: false - xy: 1027, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-boulder-medium - rotate: false - xy: 1251, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-boulder-small - rotate: false - xy: 1971, 646 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-boulder-tiny - rotate: false - xy: 1969, 574 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-boulder-xlarge - rotate: false - xy: 481, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shale-large - rotate: false - xy: 985, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shale-medium - rotate: false - xy: 1285, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-small - rotate: false - xy: 1997, 769 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shale-tiny - rotate: false - xy: 1951, 556 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shale-xlarge - rotate: false - xy: 481, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shalerocks-large - rotate: false - xy: 943, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shalerocks-medium - rotate: false - xy: 1319, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shalerocks-small - rotate: false - xy: 2023, 751 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shalerocks-tiny - rotate: false - xy: 1969, 556 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shalerocks-xlarge - rotate: false - xy: 531, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shock-mine-large - rotate: false - xy: 901, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shock-mine-medium - rotate: false - xy: 1353, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shock-mine-small - rotate: false - xy: 1997, 743 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shock-mine-tiny - rotate: false - xy: 1706, 538 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shock-mine-xlarge - rotate: false - xy: 531, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-shrubs-large - rotate: false - xy: 1111, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shrubs-medium - rotate: false - xy: 1387, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-small - rotate: false - xy: 2023, 725 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-shrubs-tiny - rotate: false - xy: 1706, 520 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-shrubs-xlarge - rotate: false - xy: 581, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-crucible-large - rotate: false - xy: 1069, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-crucible-medium - rotate: false - xy: 1421, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-crucible-small - rotate: false - xy: 1997, 717 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-crucible-tiny - rotate: false - xy: 1724, 538 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-crucible-xlarge - rotate: false - xy: 581, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-silicon-smelter-large - rotate: false - xy: 1027, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-silicon-smelter-medium - rotate: false - xy: 1455, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-silicon-smelter-small - rotate: false - xy: 2023, 699 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-silicon-smelter-tiny - rotate: false - xy: 1706, 502 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-silicon-smelter-xlarge - rotate: false - xy: 631, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-slag-large - rotate: false - xy: 985, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-slag-medium - rotate: false - xy: 1489, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-slag-small - rotate: false - xy: 1997, 691 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-slag-tiny - rotate: false - xy: 1742, 538 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-slag-xlarge - rotate: false - xy: 631, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-large - rotate: false - xy: 943, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-medium - rotate: false - xy: 1527, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-large - rotate: false - xy: 1153, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 1523, 511 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 2023, 673 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-pine-tiny - rotate: false - xy: 1724, 520 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-pine-xlarge - rotate: false - xy: 681, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snow-small - rotate: false - xy: 1997, 665 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snow-tiny - rotate: false - xy: 1706, 484 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snow-xlarge - rotate: false - xy: 681, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrock-large - rotate: false - xy: 1111, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrock-medium - rotate: false - xy: 1523, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-small - rotate: false - xy: 2023, 647 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrock-tiny - rotate: false - xy: 1760, 538 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrock-xlarge - rotate: false - xy: 731, 666 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrocks-large - rotate: false - xy: 1069, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snowrocks-medium - rotate: false - xy: 1523, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrocks-small - rotate: false - xy: 1997, 639 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-snowrocks-tiny - rotate: false - xy: 1742, 520 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-snowrocks-xlarge - rotate: false - xy: 731, 616 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-large - rotate: false - xy: 1027, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-large - rotate: false - xy: 985, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 1523, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-large-small - rotate: false - xy: 2023, 621 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-large-tiny - rotate: false - xy: 1724, 502 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-large-xlarge - rotate: false - xy: 781, 628 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-solar-panel-medium - rotate: false - xy: 1523, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-solar-panel-small - rotate: false - xy: 1677, 450 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-solar-panel-tiny - rotate: false - xy: 1778, 538 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-solar-panel-xlarge - rotate: false - xy: 831, 628 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sorter-large - rotate: false - xy: 1195, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sorter-medium - rotate: false - xy: 1543, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sorter-small - rotate: false - xy: 1677, 424 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sorter-tiny - rotate: false - xy: 1760, 520 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sorter-xlarge - rotate: false - xy: 781, 578 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spawn-large - rotate: false - xy: 1153, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 1547, 613 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spawn-small - rotate: false - xy: 1677, 398 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spawn-tiny - rotate: false - xy: 1742, 502 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spawn-xlarge - rotate: false - xy: 831, 578 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spectre-large - rotate: false - xy: 1111, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spectre-medium - rotate: false - xy: 1561, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-small - rotate: false - xy: 1677, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spectre-tiny - rotate: false - xy: 1724, 484 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spectre-xlarge - rotate: false - xy: 351, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-cluster-large - rotate: false - xy: 1069, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-cluster-medium - rotate: false - xy: 1557, 511 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-cluster-small - rotate: false - xy: 1677, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-cluster-tiny - rotate: false - xy: 1796, 538 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-cluster-xlarge - rotate: false - xy: 351, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-moss-large - rotate: false - xy: 1027, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-medium - rotate: false - xy: 1557, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-moss-small - rotate: false - xy: 1677, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-moss-tiny - rotate: false - xy: 1778, 520 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-moss-xlarge - rotate: false - xy: 401, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-pine-large - rotate: false - xy: 1237, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-pine-medium - rotate: false - xy: 1557, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-pine-small - rotate: false - xy: 1677, 294 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-pine-tiny - rotate: false - xy: 1760, 502 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-pine-xlarge - rotate: false - xy: 351, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-spore-press-large - rotate: false - xy: 1195, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-press-medium - rotate: false - xy: 1557, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-small - rotate: false - xy: 1657, 268 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spore-press-tiny - rotate: false - xy: 1742, 484 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spore-press-xlarge - rotate: false - xy: 401, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-sporerocks-large - rotate: false - xy: 1153, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sporerocks-medium - rotate: false - xy: 1557, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sporerocks-small - rotate: false - xy: 1657, 242 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sporerocks-tiny - rotate: false - xy: 1814, 538 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sporerocks-xlarge - rotate: false - xy: 451, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-stone-large - rotate: false - xy: 1111, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-stone-medium - rotate: false - xy: 1577, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-small - rotate: false - xy: 1683, 268 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-stone-tiny - rotate: false - xy: 1796, 520 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-stone-xlarge - rotate: false - xy: 351, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-tower-large - rotate: false - xy: 1069, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-tower-medium - rotate: false - xy: 1595, 545 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-tower-small - rotate: false - xy: 1683, 242 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-tower-tiny - rotate: false - xy: 1778, 502 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-tower-xlarge - rotate: false - xy: 401, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-large - rotate: false - xy: 1279, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-large - rotate: false - xy: 1237, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 1591, 511 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-large-small - rotate: false - xy: 1657, 216 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-large-tiny - rotate: false - xy: 1760, 484 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-large-xlarge - rotate: false - xy: 451, 516 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-surge-wall-medium - rotate: false - xy: 1591, 477 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-surge-wall-small - rotate: false - xy: 1683, 216 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-surge-wall-tiny - rotate: false - xy: 1832, 538 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-surge-wall-xlarge - rotate: false - xy: 501, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-swarmer-large - rotate: false - xy: 1195, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-swarmer-medium - rotate: false - xy: 1591, 443 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-small - rotate: false - xy: 1631, 196 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-swarmer-tiny - rotate: false - xy: 1814, 520 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-swarmer-xlarge - rotate: false - xy: 351, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-switch-large - rotate: false - xy: 1153, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-switch-medium - rotate: false - xy: 1591, 409 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-switch-small - rotate: false - xy: 1657, 190 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-switch-tiny - rotate: false - xy: 1796, 502 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-switch-xlarge - rotate: false - xy: 401, 416 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tainted-water-large - rotate: false - xy: 1111, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tainted-water-medium - rotate: false - xy: 1591, 375 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tainted-water-small - rotate: false - xy: 1683, 190 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tainted-water-tiny - rotate: false - xy: 1778, 484 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tainted-water-xlarge - rotate: false - xy: 451, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-tar-large - rotate: false - xy: 1321, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tar-medium +block-phase-wall-large-medium rotate: false xy: 945, 356 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tar-small +block-phase-wall-large-small rotate: false - xy: 1446, 209 + xy: 1357, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tar-tiny +block-phase-wall-large-tiny rotate: false - xy: 1850, 538 + xy: 1669, 573 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tar-xlarge +block-phase-wall-large-xlarge rotate: false - xy: 501, 516 + xy: 409, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tendrils-large +block-phase-wall-medium rotate: false - xy: 1279, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tendrils-medium - rotate: false - xy: 979, 356 + xy: 980, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tendrils-small +block-phase-wall-small rotate: false - xy: 1472, 195 + xy: 1331, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tendrils-tiny +block-phase-wall-tiny rotate: false - xy: 1832, 520 + xy: 1669, 555 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tendrils-xlarge +block-phase-wall-xlarge rotate: false - xy: 551, 566 + xy: 459, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tetrative-reconstructor-large +block-phase-weaver-large rotate: false - xy: 1237, 765 + xy: 1069, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tetrative-reconstructor-medium +block-phase-weaver-medium rotate: false - xy: 945, 322 + xy: 1014, 385 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tetrative-reconstructor-small +block-phase-weaver-small rotate: false - xy: 1498, 195 + xy: 1409, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tetrative-reconstructor-tiny +block-phase-weaver-tiny rotate: false - xy: 1814, 502 + xy: 1687, 608 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tetrative-reconstructor-xlarge +block-phase-weaver-xlarge rotate: false - xy: 351, 316 + xy: 409, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-generator-large +block-pine-large rotate: false - xy: 1195, 723 + xy: 1027, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-generator-medium +block-pine-medium + rotate: false + xy: 979, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pine-small + rotate: false + xy: 1383, 310 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pine-tiny + rotate: false + xy: 1705, 608 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pine-xlarge + rotate: false + xy: 459, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-compressor-large + rotate: false + xy: 985, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-compressor-medium rotate: false xy: 1013, 351 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-generator-small +block-plastanium-compressor-small rotate: false - xy: 1524, 195 + xy: 1357, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-generator-tiny +block-plastanium-compressor-tiny rotate: false - xy: 1796, 484 + xy: 1687, 590 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-generator-xlarge +block-plastanium-compressor-xlarge rotate: false - xy: 401, 366 + xy: 509, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-pump-large +block-plastanium-conveyor-large rotate: false - xy: 1153, 681 + xy: 943, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-pump-medium +block-plastanium-conveyor-medium rotate: false - xy: 979, 322 + xy: 1048, 377 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-pump-small +block-plastanium-conveyor-small rotate: false - xy: 1550, 195 + xy: 1435, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-pump-tiny +block-plastanium-conveyor-tiny rotate: false - xy: 1868, 538 + xy: 1723, 608 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-pump-xlarge +block-plastanium-conveyor-xlarge rotate: false - xy: 451, 416 + xy: 459, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-reactor-large +block-plastanium-wall-large rotate: false - xy: 1363, 849 + xy: 901, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-reactor-medium +block-plastanium-wall-large-large + rotate: false + xy: 1111, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-medium + rotate: false + xy: 1082, 377 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-small + rotate: false + xy: 1409, 310 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-tiny + rotate: false + xy: 1741, 608 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-xlarge + rotate: false + xy: 509, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-wall-medium + rotate: false + xy: 1116, 377 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-wall-small + rotate: false + xy: 1383, 284 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-wall-tiny + rotate: false + xy: 1687, 572 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-wall-xlarge + rotate: false + xy: 559, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plated-conduit-large + rotate: false + xy: 1069, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plated-conduit-medium + rotate: false + xy: 1047, 343 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plated-conduit-small + rotate: false + xy: 1461, 336 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plated-conduit-tiny + rotate: false + xy: 1705, 590 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plated-conduit-xlarge + rotate: false + xy: 509, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pneumatic-drill-large + rotate: false + xy: 1027, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pneumatic-drill-medium + rotate: false + xy: 1081, 343 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pneumatic-drill-small + rotate: false + xy: 1435, 310 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pneumatic-drill-tiny + rotate: false + xy: 1705, 572 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pneumatic-drill-xlarge + rotate: false + xy: 559, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-large + rotate: false + xy: 985, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-large + rotate: false + xy: 943, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-medium + rotate: false + xy: 1115, 343 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-large-small + rotate: false + xy: 1409, 284 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-large-tiny + rotate: false + xy: 1723, 590 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-large-xlarge + rotate: false + xy: 609, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-medium + rotate: false + xy: 945, 322 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-small + rotate: false + xy: 1487, 336 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-tiny + rotate: false + xy: 1741, 590 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-xlarge + rotate: false + xy: 559, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-source-large + rotate: false + xy: 1153, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-source-medium rotate: false xy: 945, 288 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-reactor-small +block-power-source-small rotate: false - xy: 1576, 195 + xy: 1461, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-reactor-tiny +block-power-source-tiny rotate: false - xy: 1850, 520 + xy: 1723, 572 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-reactor-xlarge +block-power-source-xlarge rotate: false - xy: 501, 466 + xy: 609, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-large +block-power-void-large rotate: false - xy: 1321, 807 + xy: 1111, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-wall-large-large +block-power-void-medium rotate: false - xy: 1279, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 1047, 346 + xy: 979, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-large-small +block-power-void-small rotate: false - xy: 1602, 195 + xy: 1435, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-large-tiny +block-power-void-tiny rotate: false - xy: 1832, 502 + xy: 1741, 572 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-large-xlarge +block-power-void-xlarge rotate: false - xy: 551, 516 + xy: 659, 816 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-medium +block-pulse-conduit-large rotate: false - xy: 945, 254 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thorium-wall-small - rotate: false - xy: 1680, 528 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thorium-wall-tiny - rotate: false - xy: 1814, 484 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thorium-wall-xlarge - rotate: false - xy: 601, 566 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-thruster-large - rotate: false - xy: 1237, 723 + xy: 1069, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thruster-medium - rotate: false - xy: 979, 288 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-thruster-small - rotate: false - xy: 1680, 502 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-thruster-tiny - rotate: false - xy: 1886, 538 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-thruster-xlarge - rotate: false - xy: 351, 266 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-titanium-conveyor-large - rotate: false - xy: 1195, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-conveyor-medium +block-pulse-conduit-medium rotate: false xy: 1013, 317 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-conveyor-small +block-pulse-conduit-small rotate: false - xy: 1680, 476 + xy: 1513, 336 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-conveyor-tiny +block-pulse-conduit-tiny rotate: false - xy: 1868, 520 + xy: 1759, 583 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-conveyor-xlarge +block-pulse-conduit-xlarge rotate: false - xy: 401, 316 + xy: 609, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-large +block-pulverizer-large rotate: false - xy: 1405, 849 + xy: 1027, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-wall-large-large +block-pulverizer-medium rotate: false - xy: 1363, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 979, 254 + xy: 945, 254 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-large-small +block-pulverizer-small rotate: false - xy: 1703, 450 + xy: 1487, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-large-tiny +block-pulverizer-tiny rotate: false - xy: 1850, 502 + xy: 1777, 583 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-large-xlarge +block-pulverizer-xlarge rotate: false - xy: 451, 366 + xy: 659, 766 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-medium +block-pyratite-mixer-large + rotate: false + xy: 985, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pyratite-mixer-medium + rotate: false + xy: 979, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pyratite-mixer-small + rotate: false + xy: 1461, 284 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pyratite-mixer-tiny + rotate: false + xy: 1795, 583 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pyratite-mixer-xlarge + rotate: false + xy: 709, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-repair-point-large + rotate: false + xy: 1195, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-repair-point-medium rotate: false xy: 1013, 283 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-small +block-repair-point-small rotate: false - xy: 1703, 424 + xy: 1513, 310 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-tiny +block-repair-point-tiny rotate: false - xy: 1832, 484 + xy: 1687, 554 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-xlarge +block-repair-point-xlarge rotate: false - xy: 501, 416 + xy: 659, 716 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-turbine-generator-large +block-resupply-point-large + rotate: false + xy: 1153, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-resupply-point-medium + rotate: false + xy: 1047, 309 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-resupply-point-small + rotate: false + xy: 1487, 284 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-resupply-point-tiny + rotate: false + xy: 1705, 554 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-resupply-point-xlarge + rotate: false + xy: 709, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ripple-large + rotate: false + xy: 1111, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ripple-medium + rotate: false + xy: 1081, 309 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ripple-small + rotate: false + xy: 1513, 284 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ripple-tiny + rotate: false + xy: 1723, 554 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ripple-xlarge + rotate: false + xy: 709, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rotary-pump-large + rotate: false + xy: 1069, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rotary-pump-medium + rotate: false + xy: 1115, 309 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rotary-pump-small + rotate: false + xy: 1150, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rotary-pump-tiny + rotate: false + xy: 1741, 554 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rotary-pump-xlarge + rotate: false + xy: 759, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-router-large + rotate: false + xy: 1027, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-router-medium + rotate: false + xy: 979, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-router-small + rotate: false + xy: 1150, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-router-tiny + rotate: false + xy: 1759, 565 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-router-xlarge + rotate: false + xy: 759, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rtg-generator-large + rotate: false + xy: 1237, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rtg-generator-medium + rotate: false + xy: 1013, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rtg-generator-small + rotate: false + xy: 1176, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rtg-generator-tiny + rotate: false + xy: 1777, 565 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rtg-generator-xlarge + rotate: false + xy: 759, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salt-large + rotate: false + xy: 1195, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salt-medium + rotate: false + xy: 1047, 275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-small + rotate: false + xy: 1202, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salt-tiny + rotate: false + xy: 1795, 565 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salt-wall-large + rotate: false + xy: 1153, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salt-wall-medium + rotate: false + xy: 1081, 275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-wall-small + rotate: false + xy: 1176, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salt-wall-tiny + rotate: false + xy: 1813, 583 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salt-wall-xlarge + rotate: false + xy: 809, 828 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salt-xlarge + rotate: false + xy: 809, 778 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salvo-large + rotate: false + xy: 1111, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salvo-medium + rotate: false + xy: 1115, 275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-small + rotate: false + xy: 1228, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salvo-tiny + rotate: false + xy: 1813, 565 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salvo-xlarge + rotate: false + xy: 809, 728 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-boulder-large + rotate: false + xy: 1069, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-boulder-medium + rotate: false + xy: 980, 215 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-boulder-small + rotate: false + xy: 1202, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-boulder-tiny + rotate: false + xy: 1831, 585 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-boulder-xlarge + rotate: false + xy: 809, 678 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-large + rotate: false + xy: 1279, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-medium + rotate: false + xy: 1014, 215 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-small + rotate: false + xy: 1254, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-tiny + rotate: false + xy: 1831, 567 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-wall-large + rotate: false + xy: 1237, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-wall-medium + rotate: false + xy: 980, 181 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-wall-small + rotate: false + xy: 1228, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-wall-tiny + rotate: false + xy: 1849, 585 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-wall-xlarge + rotate: false + xy: 331, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-water-large + rotate: false + xy: 1195, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-water-medium + rotate: false + xy: 1014, 181 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-water-small + rotate: false + xy: 1280, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-water-tiny + rotate: false + xy: 1849, 567 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-water-xlarge + rotate: false + xy: 331, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-xlarge + rotate: false + xy: 381, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scatter-large + rotate: false + xy: 1153, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scatter-medium + rotate: false + xy: 996, 147 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scatter-small + rotate: false + xy: 1254, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scatter-tiny + rotate: false + xy: 1867, 585 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scatter-xlarge + rotate: false + xy: 381, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scorch-large + rotate: false + xy: 1111, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scorch-medium + rotate: false + xy: 996, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scorch-small + rotate: false + xy: 1306, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scorch-tiny + rotate: false + xy: 1867, 567 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scorch-xlarge + rotate: false + xy: 431, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-large + rotate: false + xy: 1321, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-medium + rotate: false + xy: 1030, 147 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-small + rotate: false + xy: 1280, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-tiny + rotate: false + xy: 1759, 547 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-xlarge + rotate: false + xy: 431, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-large + rotate: false + xy: 1279, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-medium + rotate: false + xy: 1030, 113 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-small + rotate: false + xy: 1332, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-tiny + rotate: false + xy: 1777, 547 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-xlarge + rotate: false + xy: 481, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-large + rotate: false + xy: 1237, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-large + rotate: false + xy: 1195, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-medium + rotate: false + xy: 1048, 241 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-large-small + rotate: false + xy: 1306, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-large-tiny + rotate: false + xy: 1795, 547 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-large-xlarge + rotate: false + xy: 481, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-medium + rotate: false + xy: 1048, 207 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-small + rotate: false + xy: 1358, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-tiny + rotate: false + xy: 1813, 547 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-xlarge + rotate: false + xy: 531, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-segment-large + rotate: false + xy: 1153, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-segment-medium + rotate: false + xy: 1082, 241 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-segment-small + rotate: false + xy: 1332, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-segment-tiny + rotate: false + xy: 1831, 549 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-segment-xlarge + rotate: false + xy: 531, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-separator-large + rotate: false + xy: 1363, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-separator-medium + rotate: false + xy: 1082, 207 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-separator-small + rotate: false + xy: 1384, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-separator-tiny + rotate: false + xy: 1849, 549 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-separator-xlarge + rotate: false + xy: 581, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-boulder-large + rotate: false + xy: 1321, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-boulder-medium + rotate: false + xy: 1116, 241 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-boulder-small + rotate: false + xy: 1358, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-boulder-tiny + rotate: false + xy: 1867, 549 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-boulder-xlarge + rotate: false + xy: 581, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-large + rotate: false + xy: 1279, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-medium + rotate: false + xy: 1116, 207 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-small + rotate: false + xy: 1410, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-tiny + rotate: false + xy: 1701, 536 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-wall-large + rotate: false + xy: 1237, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-wall-medium + rotate: false + xy: 1064, 173 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-wall-small + rotate: false + xy: 1384, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-wall-tiny + rotate: false + xy: 1701, 518 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-wall-xlarge + rotate: false + xy: 631, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-xlarge + rotate: false + xy: 631, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shock-mine-large + rotate: false + xy: 1195, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shock-mine-medium + rotate: false + xy: 1064, 139 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shock-mine-small + rotate: false + xy: 1436, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shock-mine-tiny + rotate: false + xy: 1719, 536 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shock-mine-xlarge + rotate: false + xy: 681, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shrubs-large + rotate: false + xy: 1405, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shrubs-medium + rotate: false + xy: 1098, 173 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-small + rotate: false + xy: 1410, 232 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shrubs-tiny + rotate: false + xy: 1737, 536 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shrubs-xlarge + rotate: false + xy: 681, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-silicon-crucible-large + rotate: false + xy: 1363, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-silicon-crucible-medium + rotate: false + xy: 1098, 139 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-silicon-crucible-small + rotate: false + xy: 1462, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-silicon-crucible-tiny + rotate: false + xy: 1719, 518 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-silicon-crucible-xlarge + rotate: false + xy: 731, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-silicon-smelter-large rotate: false xy: 1321, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-turbine-generator-medium +block-silicon-smelter-medium rotate: false - xy: 1047, 312 + xy: 1064, 105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-turbine-generator-small +block-silicon-smelter-small rotate: false - xy: 1703, 398 + xy: 1436, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-turbine-generator-tiny +block-silicon-smelter-tiny rotate: false - xy: 1904, 538 + xy: 1737, 518 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-turbine-generator-xlarge +block-silicon-smelter-xlarge rotate: false - xy: 551, 466 + xy: 731, 616 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-underflow-gate-large +block-slag-large rotate: false xy: 1279, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-underflow-gate-medium +block-slag-medium rotate: false - xy: 1081, 341 + xy: 1098, 105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-underflow-gate-small +block-slag-small rotate: false - xy: 1703, 372 + xy: 1488, 258 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-underflow-gate-tiny +block-slag-tiny rotate: false - xy: 1886, 520 + xy: 1755, 529 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-underflow-gate-xlarge +block-slag-xlarge rotate: false - xy: 601, 516 + xy: 781, 628 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-unloader-large +block-snow-boulder-large rotate: false xy: 1237, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-unloader-medium +block-snow-boulder-medium rotate: false - xy: 1115, 341 + xy: 1132, 173 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-unloader-small +block-snow-boulder-small rotate: false - xy: 1703, 346 + xy: 1462, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-unloader-tiny +block-snow-boulder-tiny rotate: false - xy: 1868, 502 + xy: 1773, 529 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-unloader-xlarge +block-snow-boulder-xlarge rotate: false - xy: 651, 566 + xy: 831, 628 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-vault-large +block-snow-large rotate: false xy: 1447, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-vault-medium +block-snow-medium rotate: false - xy: 1149, 341 + xy: 1132, 139 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-vault-small - rotate: false - xy: 1703, 320 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-vault-tiny - rotate: false - xy: 1850, 484 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-vault-xlarge - rotate: false - xy: 351, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-water-extractor-large +block-snow-pine-large rotate: false xy: 1405, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-extractor-medium +block-snow-pine-medium rotate: false - xy: 1183, 341 + xy: 1132, 105 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-extractor-small +block-snow-pine-small rotate: false - xy: 1703, 294 + xy: 1488, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-extractor-tiny +block-snow-pine-tiny rotate: false - xy: 1922, 538 + xy: 1791, 529 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-extractor-xlarge +block-snow-pine-xlarge rotate: false - xy: 401, 266 + xy: 781, 578 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-large +block-snow-small + rotate: false + xy: 1514, 258 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-tiny + rotate: false + xy: 1809, 529 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-wall-large rotate: false xy: 1363, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-medium +block-snow-wall-medium rotate: false - xy: 1217, 341 + xy: 1125, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-small +block-snow-wall-small rotate: false - xy: 1709, 268 + xy: 1514, 232 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-tiny +block-snow-wall-tiny rotate: false - xy: 1904, 520 + xy: 1731, 500 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-xlarge +block-snow-wall-xlarge rotate: false - xy: 451, 316 + xy: 831, 578 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-wave-large +block-snow-xlarge + rotate: false + xy: 351, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-solar-panel-large rotate: false xy: 1321, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-wave-medium - rotate: false - xy: 1251, 341 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-wave-small - rotate: false - xy: 1709, 242 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-wave-tiny - rotate: false - xy: 1886, 502 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-wave-xlarge - rotate: false - xy: 501, 366 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-white-tree-dead-large +block-solar-panel-large-large rotate: false xy: 1279, 681 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-dead-medium +block-solar-panel-large-medium rotate: false - xy: 1285, 341 + xy: 1159, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-dead-small +block-solar-panel-large-small rotate: false - xy: 1709, 216 + xy: 1541, 383 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-dead-tiny +block-solar-panel-large-tiny rotate: false - xy: 1868, 484 + xy: 1731, 482 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-dead-xlarge +block-solar-panel-large-xlarge rotate: false - xy: 551, 416 + xy: 351, 516 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-large +block-solar-panel-medium + rotate: false + xy: 1193, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-small + rotate: false + xy: 1567, 383 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-solar-panel-tiny + rotate: false + xy: 1731, 464 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-solar-panel-xlarge + rotate: false + xy: 401, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sorter-large rotate: false xy: 1489, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-medium +block-sorter-medium rotate: false - xy: 1319, 341 + xy: 1227, 550 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-small +block-sorter-small rotate: false - xy: 1709, 190 + xy: 1593, 383 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-tiny +block-sorter-tiny rotate: false - xy: 1940, 538 + xy: 1731, 446 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-xlarge +block-sorter-xlarge + rotate: false + xy: 351, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spawn-large + rotate: false + xy: 1447, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spawn-medium + rotate: false + xy: 1261, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spawn-small + rotate: false + xy: 1619, 383 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spawn-tiny + rotate: false + xy: 1755, 511 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spawn-xlarge + rotate: false + xy: 401, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spectre-large + rotate: false + xy: 1405, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spectre-medium + rotate: false + xy: 1295, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spectre-small + rotate: false + xy: 1645, 383 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spectre-tiny + rotate: false + xy: 1773, 511 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spectre-xlarge + rotate: false + xy: 451, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-cluster-large + rotate: false + xy: 1363, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-cluster-medium + rotate: false + xy: 1329, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-cluster-small + rotate: false + xy: 1671, 383 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-cluster-tiny + rotate: false + xy: 1791, 511 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-cluster-xlarge + rotate: false + xy: 351, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-moss-large + rotate: false + xy: 1321, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-medium + rotate: false + xy: 1363, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-moss-small + rotate: false + xy: 1697, 383 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-moss-tiny + rotate: false + xy: 1809, 511 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-moss-xlarge + rotate: false + xy: 401, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-pine-large + rotate: false + xy: 1531, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-pine-medium + rotate: false + xy: 1397, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-pine-small + rotate: false + xy: 1540, 357 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-pine-tiny + rotate: false + xy: 1749, 493 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-pine-xlarge + rotate: false + xy: 451, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-press-large + rotate: false + xy: 1489, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-press-medium + rotate: false + xy: 1431, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-press-small + rotate: false + xy: 1566, 357 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-press-tiny + rotate: false + xy: 1767, 493 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-press-xlarge + rotate: false + xy: 501, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-wall-large + rotate: false + xy: 1447, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-wall-medium + rotate: false + xy: 1465, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-wall-small + rotate: false + xy: 1592, 357 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-wall-tiny + rotate: false + xy: 1749, 475 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-wall-xlarge + rotate: false + xy: 351, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-steam-generator-large + rotate: false + xy: 1405, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-steam-generator-medium + rotate: false + xy: 1499, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-steam-generator-small + rotate: false + xy: 1618, 357 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-steam-generator-tiny + rotate: false + xy: 1785, 493 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-steam-generator-xlarge + rotate: false + xy: 401, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-stone-large + rotate: false + xy: 1363, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-medium + rotate: false + xy: 1533, 550 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-small + rotate: false + xy: 1644, 357 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-tiny + rotate: false + xy: 1767, 475 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-wall-large + rotate: false + xy: 1573, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-wall-medium + rotate: false + xy: 1123, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-small + rotate: false + xy: 1670, 357 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-wall-tiny + rotate: false + xy: 1749, 457 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-wall-xlarge + rotate: false + xy: 451, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-stone-xlarge + rotate: false + xy: 501, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-tower-large + rotate: false + xy: 1531, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-tower-medium + rotate: false + xy: 1157, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-tower-small + rotate: false + xy: 1696, 357 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-tower-tiny + rotate: false + xy: 1803, 493 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-tower-xlarge + rotate: false + xy: 551, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-large + rotate: false + xy: 1489, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-large + rotate: false + xy: 1447, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-medium + rotate: false + xy: 1191, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-large-small + rotate: false + xy: 1539, 331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-large-tiny + rotate: false + xy: 1785, 475 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-large-xlarge + rotate: false + xy: 351, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-medium + rotate: false + xy: 1225, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-small + rotate: false + xy: 1539, 305 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-tiny + rotate: false + xy: 1767, 457 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-xlarge + rotate: false + xy: 401, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-swarmer-large + rotate: false + xy: 1405, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-swarmer-medium + rotate: false + xy: 1259, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-swarmer-small + rotate: false + xy: 1565, 331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-swarmer-tiny + rotate: false + xy: 1803, 475 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-swarmer-xlarge + rotate: false + xy: 451, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-switch-large + rotate: false + xy: 1615, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-switch-medium + rotate: false + xy: 1293, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-switch-small + rotate: false + xy: 1565, 305 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-switch-tiny + rotate: false + xy: 1785, 457 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-switch-xlarge + rotate: false + xy: 501, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tainted-water-large + rotate: false + xy: 1573, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tainted-water-medium + rotate: false + xy: 1327, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tainted-water-small + rotate: false + xy: 1591, 331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tainted-water-tiny + rotate: false + xy: 1803, 457 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tainted-water-xlarge + rotate: false + xy: 551, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tar-large + rotate: false + xy: 1531, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tar-medium + rotate: false + xy: 1361, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tar-small + rotate: false + xy: 1591, 305 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tar-tiny + rotate: false + xy: 1885, 557 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tar-xlarge + rotate: false + xy: 601, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tendrils-large + rotate: false + xy: 1489, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tendrils-medium + rotate: false + xy: 1395, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tendrils-small + rotate: false + xy: 1617, 331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tendrils-tiny + rotate: false + xy: 1903, 557 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tendrils-xlarge + rotate: false + xy: 351, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-large + rotate: false + xy: 1447, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-medium + rotate: false + xy: 1429, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-small + rotate: false + xy: 1617, 305 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-tiny + rotate: false + xy: 1885, 539 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-xlarge + rotate: false + xy: 401, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-generator-large + rotate: false + xy: 1657, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-generator-medium + rotate: false + xy: 1463, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-generator-small + rotate: false + xy: 1643, 331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-generator-tiny + rotate: false + xy: 1903, 539 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-generator-xlarge + rotate: false + xy: 451, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-pump-large + rotate: false + xy: 1615, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-pump-medium + rotate: false + xy: 1497, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-pump-small + rotate: false + xy: 1643, 305 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-pump-tiny + rotate: false + xy: 1921, 550 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-pump-xlarge + rotate: false + xy: 501, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-reactor-large + rotate: false + xy: 1573, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-reactor-medium + rotate: false + xy: 1531, 516 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-reactor-small + rotate: false + xy: 1669, 331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-reactor-tiny + rotate: false + xy: 1939, 550 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-reactor-xlarge + rotate: false + xy: 551, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-large + rotate: false + xy: 1531, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-large + rotate: false + xy: 1489, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-medium + rotate: false + xy: 1153, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-large-small + rotate: false + xy: 1669, 305 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-large-tiny + rotate: false + xy: 1957, 550 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-large-xlarge + rotate: false + xy: 601, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-medium + rotate: false + xy: 1187, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-small + rotate: false + xy: 1695, 331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-tiny + rotate: false + xy: 1921, 532 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-xlarge + rotate: false + xy: 651, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thruster-large + rotate: false + xy: 1699, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thruster-medium + rotate: false + xy: 1221, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thruster-small + rotate: false + xy: 1695, 305 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thruster-tiny + rotate: false + xy: 1939, 532 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thruster-xlarge + rotate: false + xy: 351, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-conveyor-large + rotate: false + xy: 1657, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-conveyor-medium + rotate: false + xy: 1255, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-conveyor-small + rotate: false + xy: 1723, 383 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-conveyor-tiny + rotate: false + xy: 1957, 532 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-conveyor-xlarge + rotate: false + xy: 401, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-large + rotate: false + xy: 1615, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-large + rotate: false + xy: 1573, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-medium + rotate: false + xy: 1289, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-large-small + rotate: false + xy: 1722, 357 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-large-tiny + rotate: false + xy: 1975, 547 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-large-xlarge + rotate: false + xy: 451, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-medium + rotate: false + xy: 1323, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-small + rotate: false + xy: 1721, 331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-tiny + rotate: false + xy: 1993, 547 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-xlarge + rotate: false + xy: 501, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-underflow-gate-large + rotate: false + xy: 1531, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-underflow-gate-medium + rotate: false + xy: 1357, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-underflow-gate-small + rotate: false + xy: 1721, 305 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-underflow-gate-tiny + rotate: false + xy: 1975, 529 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-underflow-gate-xlarge + rotate: false + xy: 551, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-unloader-large + rotate: false + xy: 1741, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-unloader-medium + rotate: false + xy: 1391, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-unloader-small + rotate: false + xy: 1540, 279 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-unloader-tiny + rotate: false + xy: 1993, 529 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-unloader-xlarge rotate: false xy: 601, 466 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +block-vault-large + rotate: false + xy: 1699, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-vault-medium + rotate: false + xy: 1425, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-vault-small + rotate: false + xy: 1540, 253 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-vault-tiny + rotate: false + xy: 2011, 539 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-vault-xlarge + rotate: false + xy: 651, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-extractor-large + rotate: false + xy: 1657, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-extractor-medium + rotate: false + xy: 1459, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-extractor-small + rotate: false + xy: 1566, 279 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-extractor-tiny + rotate: false + xy: 2011, 521 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-extractor-xlarge + rotate: false + xy: 701, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-large + rotate: false + xy: 1615, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-medium + rotate: false + xy: 1493, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-small + rotate: false + xy: 1566, 253 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-tiny + rotate: false + xy: 1821, 493 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-xlarge + rotate: false + xy: 351, 166 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wave-large + rotate: false + xy: 1573, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wave-medium + rotate: false + xy: 1527, 482 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wave-small + rotate: false + xy: 1592, 279 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wave-tiny + rotate: false + xy: 1821, 475 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wave-xlarge + rotate: false + xy: 401, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-dead-large + rotate: false + xy: 1783, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-dead-medium + rotate: false + xy: 1567, 545 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-dead-small + rotate: false + xy: 1592, 253 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-dead-tiny + rotate: false + xy: 1821, 457 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-dead-xlarge + rotate: false + xy: 451, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-large + rotate: false + xy: 1741, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-medium + rotate: false + xy: 1601, 545 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-small + rotate: false + xy: 1618, 279 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-tiny + rotate: false + xy: 1827, 511 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-xlarge + rotate: false + xy: 501, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 button rotate: false - xy: 919, 623 + xy: 1699, 694 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17685,7 +19126,7 @@ button index: -1 button-disabled rotate: false - xy: 1699, 862 + xy: 1867, 745 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17693,7 +19134,7 @@ button-disabled index: -1 button-down rotate: false - xy: 1657, 820 + xy: 1909, 778 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17701,7 +19142,7 @@ button-down index: -1 button-edge-1 rotate: false - xy: 1615, 778 + xy: 1049, 610 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17709,7 +19150,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 1573, 736 + xy: 1133, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17717,7 +19158,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 1531, 694 + xy: 1087, 610 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17725,7 +19166,15 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 1737, 862 + xy: 1171, 652 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-disabled + rotate: false + xy: 1171, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17733,7 +19182,7 @@ button-edge-4 index: -1 button-edge-over-4 rotate: false - xy: 1775, 862 + xy: 1209, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17741,7 +19190,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 1813, 862 + xy: 1247, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17749,7 +19198,7 @@ button-over index: -1 button-red rotate: false - xy: 1851, 862 + xy: 1285, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17757,7 +19206,7 @@ button-red index: -1 button-right rotate: false - xy: 881, 652 + xy: 1399, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17765,7 +19214,7 @@ button-right index: -1 button-right-down rotate: false - xy: 1889, 862 + xy: 1323, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17773,7 +19222,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 1927, 862 + xy: 1361, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17781,7 +19230,7 @@ button-right-over index: -1 button-select rotate: false - xy: 603, 90 + xy: 1618, 253 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -17789,7 +19238,7 @@ button-select index: -1 button-square rotate: false - xy: 881, 594 + xy: 1513, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17797,7 +19246,7 @@ button-square index: -1 button-square-down rotate: false - xy: 881, 623 + xy: 1437, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17805,7 +19254,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 919, 652 + xy: 1475, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17813,7 +19262,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 957, 652 + xy: 1551, 652 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17821,49 +19270,49 @@ button-trans index: -1 check-disabled rotate: false - xy: 1353, 341 + xy: 1635, 545 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 1387, 341 + xy: 1565, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 1421, 341 + xy: 1599, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 1455, 341 + xy: 1633, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 1489, 341 + xy: 1561, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 1523, 341 + xy: 1595, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 771, 916 + xy: 795, 866 size: 10, 10 orig: 10, 10 offset: 0, 0 @@ -17877,7 +19326,7 @@ crater index: -1 cursor rotate: false - xy: 1347, 233 + xy: 1867, 739 size: 4, 4 orig: 4, 4 offset: 0, 0 @@ -17891,7 +19340,7 @@ discord-banner index: -1 flat-down-base rotate: false - xy: 995, 652 + xy: 1049, 581 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17906,7 +19355,7 @@ info-banner index: -1 inventory rotate: false - xy: 603, 48 + xy: 1644, 263 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -17914,147 +19363,147 @@ inventory index: -1 item-blast-compound-icon rotate: false - xy: 1557, 341 + xy: 1629, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-icon rotate: false - xy: 1591, 341 + xy: 1663, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-icon rotate: false - xy: 1013, 249 + xy: 1667, 511 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-icon rotate: false - xy: 1047, 278 + xy: 1697, 477 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-icon rotate: false - xy: 1081, 307 + xy: 1153, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-icon rotate: false - xy: 1115, 307 + xy: 1187, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-icon rotate: false - xy: 1149, 307 + xy: 1221, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-icon rotate: false - xy: 1183, 307 + xy: 1255, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-icon rotate: false - xy: 1217, 307 + xy: 1289, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-icon rotate: false - xy: 1251, 307 + xy: 1323, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-icon rotate: false - xy: 1285, 307 + xy: 1357, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-icon rotate: false - xy: 1319, 307 + xy: 1391, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-icon rotate: false - xy: 1353, 307 + xy: 1425, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-icon rotate: false - xy: 1387, 307 + xy: 1459, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-icon rotate: false - xy: 1421, 307 + xy: 1493, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-icon rotate: false - xy: 1455, 307 + xy: 1527, 448 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-icon rotate: false - xy: 1489, 307 + xy: 1151, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-icon rotate: false - xy: 1523, 307 + xy: 1185, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-icon rotate: false - xy: 1557, 307 + xy: 1219, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-icon rotate: false - xy: 1591, 307 + xy: 1253, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-node rotate: false - xy: 1047, 244 + xy: 1287, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18075,7 +19524,7 @@ nomap index: -1 pane rotate: false - xy: 919, 594 + xy: 1951, 862 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18083,7 +19532,7 @@ pane index: -1 pane-2 rotate: false - xy: 957, 623 + xy: 1087, 581 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18091,7 +19540,7 @@ pane-2 index: -1 scroll rotate: false - xy: 655, 85 + xy: 1696, 268 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -18114,14 +19563,14 @@ scroll-knob-horizontal-black index: -1 scroll-knob-vertical-black rotate: false - xy: 629, 80 + xy: 1670, 263 size: 24, 40 orig: 24, 40 offset: 0, 0 index: -1 scroll-knob-vertical-thin rotate: false - xy: 1729, 370 + xy: 2035, 713 size: 12, 40 orig: 12, 40 offset: 0, 0 @@ -18135,28 +19584,28 @@ selection index: -1 slider rotate: false - xy: 1472, 225 + xy: 2014, 601 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 1353, 233 + xy: 692, 92 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 1384, 233 + xy: 1929, 594 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 1415, 233 + xy: 692, 52 size: 29, 38 orig: 29, 38 offset: 0, 0 @@ -18170,7 +19619,7 @@ slider-vertical index: -1 underline rotate: false - xy: 1033, 623 + xy: 919, 568 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18178,7 +19627,7 @@ underline index: -1 underline-2 rotate: false - xy: 1033, 652 + xy: 1951, 833 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18186,7 +19635,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 995, 623 + xy: 1951, 804 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18194,7 +19643,7 @@ underline-disabled index: -1 underline-red rotate: false - xy: 957, 594 + xy: 1947, 775 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18202,7 +19651,7 @@ underline-red index: -1 underline-white rotate: false - xy: 1071, 652 + xy: 881, 568 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18210,847 +19659,1170 @@ underline-white index: -1 unit-alpha-large rotate: false - xy: 1447, 807 + xy: 1699, 765 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-alpha-medium rotate: false - xy: 1081, 273 + xy: 1321, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-alpha-small rotate: false - xy: 629, 54 + xy: 1722, 279 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-alpha-tiny rotate: false - xy: 1922, 520 + xy: 1827, 529 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-alpha-xlarge rotate: false - xy: 651, 516 + xy: 551, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-antumbra-large rotate: false - xy: 1405, 765 - size: 40, 40 - orig: 40, 40 + xy: 877, 526 + size: 36, 40 + orig: 36, 40 offset: 0, 0 index: -1 unit-antumbra-medium rotate: false - xy: 1115, 273 - 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: 655, 59 - size: 24, 24 - orig: 24, 24 + xy: 1358, 206 + size: 21, 24 + orig: 21, 24 offset: 0, 0 index: -1 unit-antumbra-tiny rotate: false - xy: 1904, 502 - size: 16, 16 - orig: 16, 16 + xy: 1048, 189 + size: 14, 16 + orig: 14, 16 offset: 0, 0 index: -1 unit-antumbra-xlarge rotate: false - xy: 701, 566 - size: 48, 48 - orig: 48, 48 + xy: 401, 33 + size: 43, 48 + orig: 43, 48 offset: 0, 0 index: -1 unit-arkyid-large rotate: false - xy: 1363, 723 + xy: 1657, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-arkyid-medium rotate: false - xy: 1149, 273 + xy: 1355, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-arkyid-small rotate: false - xy: 681, 96 + xy: 1540, 227 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-arkyid-tiny rotate: false - xy: 1886, 484 + xy: 1845, 531 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-arkyid-xlarge rotate: false - xy: 351, 166 + xy: 601, 416 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-atrax-large rotate: false - xy: 1321, 681 - size: 40, 40 - orig: 40, 40 + xy: 1615, 692 + size: 40, 29 + orig: 40, 29 offset: 0, 0 index: -1 unit-atrax-medium rotate: false - xy: 1183, 273 - size: 32, 32 - orig: 32, 32 + xy: 911, 331 + size: 32, 23 + orig: 32, 23 offset: 0, 0 index: -1 unit-atrax-small rotate: false - xy: 681, 70 - size: 24, 24 - orig: 24, 24 + xy: 804, 1 + size: 24, 17 + orig: 24, 17 offset: 0, 0 index: -1 unit-atrax-tiny rotate: false - xy: 1958, 538 - size: 16, 16 - orig: 16, 16 + xy: 656, 168 + size: 16, 11 + orig: 16, 11 offset: 0, 0 index: -1 unit-atrax-xlarge rotate: false - xy: 401, 216 - size: 48, 48 - orig: 48, 48 + xy: 651, 480 + size: 48, 34 + orig: 48, 34 offset: 0, 0 index: -1 unit-beta-large rotate: false - xy: 1531, 849 - size: 40, 40 - orig: 40, 40 + xy: 1825, 851 + size: 40, 38 + orig: 40, 38 offset: 0, 0 index: -1 unit-beta-medium rotate: false - xy: 1217, 273 - size: 32, 32 - orig: 32, 32 + xy: 351, 1 + size: 32, 30 + orig: 32, 30 offset: 0, 0 index: -1 unit-beta-small rotate: false - xy: 707, 90 - size: 24, 24 - orig: 24, 24 + xy: 722, 1 + size: 24, 23 + orig: 24, 23 offset: 0, 0 index: -1 unit-beta-tiny rotate: false - xy: 1940, 520 - size: 16, 16 - orig: 16, 16 + xy: 1174, 27 + size: 16, 15 + orig: 16, 15 offset: 0, 0 index: -1 unit-beta-xlarge rotate: false - xy: 451, 266 - size: 48, 48 - orig: 48, 48 + xy: 701, 518 + size: 48, 46 + orig: 48, 46 offset: 0, 0 index: -1 unit-bryde-large rotate: false - xy: 1489, 807 + xy: 1783, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-bryde-medium rotate: false - xy: 1251, 273 + xy: 1389, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-bryde-small rotate: false - xy: 733, 90 + xy: 1566, 227 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-bryde-tiny rotate: false - xy: 1922, 502 + xy: 1863, 531 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-bryde-xlarge rotate: false - xy: 501, 316 + xy: 351, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +unit-corvus-large + rotate: false + xy: 1741, 779 + size: 40, 26 + orig: 40, 26 + offset: 0, 0 + index: -1 +unit-corvus-medium + rotate: false + xy: 114, 6 + size: 31, 20 + orig: 31, 20 + offset: 0, 0 + index: -1 +unit-corvus-small + rotate: false + xy: 692, 1 + size: 24, 15 + orig: 24, 15 + offset: 0, 0 + index: -1 +unit-corvus-tiny + rotate: false + xy: 771, 916 + size: 15, 10 + orig: 15, 10 + offset: 0, 0 + index: -1 +unit-corvus-xlarge + rotate: false + xy: 401, 183 + size: 48, 31 + orig: 48, 31 + offset: 0, 0 + index: -1 unit-crawler-large rotate: false - xy: 1447, 765 + xy: 1699, 723 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-crawler-medium rotate: false - xy: 1285, 273 + xy: 1423, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-crawler-small rotate: false - xy: 759, 90 + xy: 1592, 227 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-crawler-tiny rotate: false - xy: 1904, 484 + xy: 1845, 513 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-crawler-xlarge rotate: false - xy: 551, 366 + xy: 451, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-large rotate: false - xy: 1405, 723 + xy: 1825, 809 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-dagger-medium rotate: false - xy: 1319, 273 + xy: 1457, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-dagger-small rotate: false - xy: 785, 90 + xy: 1618, 227 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-dagger-tiny rotate: false - xy: 1958, 520 + xy: 1863, 513 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-dagger-xlarge rotate: false - xy: 601, 416 + xy: 501, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-eclipse-large rotate: false - xy: 1363, 681 + xy: 1867, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-eclipse-medium rotate: false - xy: 1353, 273 + xy: 1491, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-eclipse-small rotate: false - xy: 811, 90 + xy: 1644, 237 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-eclipse-tiny rotate: false - xy: 1940, 502 + xy: 1881, 521 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-eclipse-xlarge rotate: false - xy: 651, 466 + xy: 551, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-flare-large rotate: false - xy: 1573, 849 + xy: 1741, 737 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-flare-medium rotate: false - xy: 1387, 273 + xy: 1525, 414 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-flare-small rotate: false - xy: 837, 90 + xy: 1670, 237 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-flare-tiny rotate: false - xy: 1922, 484 + xy: 1899, 521 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-flare-xlarge rotate: false - xy: 701, 516 + xy: 601, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-fortress-large rotate: false - xy: 1531, 807 - size: 40, 40 - orig: 40, 40 + xy: 1783, 773 + size: 40, 32 + orig: 40, 32 offset: 0, 0 index: -1 unit-fortress-medium rotate: false - xy: 1421, 273 - size: 32, 32 - orig: 32, 32 + xy: 80, 1 + size: 32, 25 + orig: 32, 25 offset: 0, 0 index: -1 unit-fortress-small rotate: false - xy: 863, 90 - size: 24, 24 - orig: 24, 24 + xy: 556, 1 + size: 24, 19 + orig: 24, 19 offset: 0, 0 index: -1 unit-fortress-tiny rotate: false - xy: 1958, 502 - size: 16, 16 - orig: 16, 16 + xy: 522, 1 + size: 16, 12 + orig: 16, 12 offset: 0, 0 index: -1 unit-fortress-xlarge rotate: false - xy: 351, 116 - size: 48, 48 - orig: 48, 48 + xy: 651, 440 + size: 48, 38 + orig: 48, 38 offset: 0, 0 index: -1 unit-gamma-large rotate: false - xy: 1489, 765 + xy: 1909, 849 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-gamma-medium rotate: false - xy: 1455, 273 + xy: 1561, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-gamma-small rotate: false - xy: 889, 90 + xy: 1696, 242 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-gamma-tiny rotate: false - xy: 1940, 484 + xy: 1881, 503 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-gamma-xlarge rotate: false - xy: 401, 166 + xy: 701, 468 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-horizon-large rotate: false - xy: 1447, 723 + xy: 1867, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-horizon-medium rotate: false - xy: 1489, 273 + xy: 1595, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-horizon-small rotate: false - xy: 915, 90 + xy: 1722, 253 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-horizon-tiny rotate: false - xy: 1958, 484 + xy: 1899, 503 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-horizon-xlarge rotate: false - xy: 451, 216 + xy: 351, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mace-large rotate: false - xy: 1405, 681 + xy: 1909, 807 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mace-medium rotate: false - xy: 1523, 273 + xy: 1629, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mace-small rotate: false - xy: 941, 90 + xy: 1722, 227 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mace-tiny rotate: false - xy: 1976, 538 + xy: 1917, 514 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mace-xlarge rotate: false - xy: 501, 266 + xy: 401, 133 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mega-large rotate: false - xy: 1615, 849 + xy: 881, 639 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mega-medium rotate: false - xy: 1557, 273 + xy: 1663, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mega-small rotate: false - xy: 967, 90 + xy: 1696, 216 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mega-tiny rotate: false - xy: 1976, 520 + xy: 1935, 514 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mega-xlarge rotate: false - xy: 551, 316 + xy: 451, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-minke-large rotate: false - xy: 1573, 807 - size: 40, 40 - orig: 40, 40 + xy: 877, 455 + size: 34, 40 + orig: 34, 40 offset: 0, 0 index: -1 unit-minke-medium rotate: false - xy: 1591, 273 - size: 32, 32 - orig: 32, 32 + xy: 723, 52 + size: 27, 32 + orig: 27, 32 offset: 0, 0 index: -1 unit-minke-small rotate: false - xy: 707, 64 - 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: 1976, 502 - size: 16, 16 - orig: 16, 16 + xy: 2034, 683 + size: 13, 16 + orig: 13, 16 offset: 0, 0 index: -1 unit-minke-xlarge rotate: false - xy: 601, 366 - size: 48, 48 - orig: 48, 48 + xy: 601, 226 + size: 41, 48 + orig: 41, 48 offset: 0, 0 index: -1 unit-mono-large rotate: false - xy: 1531, 765 + xy: 881, 597 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mono-medium rotate: false - xy: 1081, 239 + xy: 1697, 443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mono-small rotate: false - xy: 733, 64 + xy: 1722, 201 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mono-tiny rotate: false - xy: 1976, 484 + xy: 1953, 514 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mono-xlarge rotate: false - xy: 651, 416 + xy: 501, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-nova-large rotate: false - xy: 1489, 723 + xy: 923, 639 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-nova-medium rotate: false - xy: 1115, 239 + xy: 1559, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-nova-small rotate: false - xy: 759, 64 + xy: 1644, 211 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-nova-tiny rotate: false - xy: 1729, 466 + xy: 1917, 496 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-nova-xlarge - rotate: false - xy: 701, 466 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-poly-large - rotate: false - xy: 1447, 681 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-poly-medium - rotate: false - xy: 1149, 239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-poly-small - rotate: false - xy: 785, 64 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-poly-tiny - rotate: false - xy: 1729, 448 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-poly-xlarge - rotate: false - xy: 351, 66 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-pulsar-large - rotate: false - xy: 1657, 849 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-pulsar-medium - rotate: false - xy: 1183, 239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-pulsar-small - rotate: false - xy: 811, 64 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-pulsar-tiny - rotate: false - xy: 1747, 466 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-pulsar-xlarge - rotate: false - xy: 401, 116 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-quasar-large - rotate: false - xy: 1615, 807 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-quasar-medium - rotate: false - xy: 1217, 239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-quasar-small - rotate: false - xy: 837, 64 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-quasar-tiny - rotate: false - xy: 1729, 430 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-quasar-xlarge - rotate: false - xy: 451, 166 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-risso-large - rotate: false - xy: 1573, 765 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-risso-medium - rotate: false - xy: 1251, 239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-risso-small - rotate: false - xy: 863, 64 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-risso-tiny - rotate: false - xy: 1747, 448 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-risso-xlarge - rotate: false - xy: 501, 216 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-spiroct-large - rotate: false - xy: 1531, 723 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -unit-spiroct-medium - rotate: false - xy: 1285, 239 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unit-spiroct-small - rotate: false - xy: 889, 64 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -unit-spiroct-tiny - rotate: false - xy: 1765, 466 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -unit-spiroct-xlarge rotate: false xy: 551, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -unit-zenith-large +unit-oct-large rotate: false - xy: 1489, 681 + xy: 965, 639 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -unit-zenith-medium +unit-oct-medium rotate: false - xy: 1319, 239 + xy: 1593, 409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -unit-zenith-small +unit-oct-small rotate: false - xy: 915, 64 + xy: 1670, 211 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -unit-zenith-tiny +unit-oct-tiny rotate: false - xy: 1729, 412 + xy: 1935, 496 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -unit-zenith-xlarge +unit-oct-xlarge rotate: false xy: 601, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +unit-omura-large + rotate: false + xy: 2019, 755 + size: 28, 40 + orig: 28, 40 + offset: 0, 0 + index: -1 +unit-omura-medium + rotate: false + xy: 1729, 409 + size: 22, 32 + orig: 22, 32 + offset: 0, 0 + index: -1 +unit-omura-small + rotate: false + xy: 1953, 488 + size: 16, 24 + orig: 16, 24 + offset: 0, 0 + index: -1 +unit-omura-tiny + rotate: false + xy: 337, 1 + size: 11, 16 + orig: 11, 16 + offset: 0, 0 + index: -1 +unit-omura-xlarge + rotate: false + xy: 877, 405 + size: 33, 48 + orig: 33, 48 + offset: 0, 0 + index: -1 +unit-poly-large + rotate: false + xy: 923, 597 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-poly-medium + rotate: false + xy: 1627, 409 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-poly-small + rotate: false + xy: 1696, 190 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-poly-tiny + rotate: false + xy: 1971, 511 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-poly-xlarge + rotate: false + xy: 651, 390 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-pulsar-large + rotate: false + xy: 1825, 773 + size: 40, 34 + orig: 40, 34 + offset: 0, 0 + index: -1 +unit-pulsar-medium + rotate: false + xy: 658, 1 + size: 32, 27 + orig: 32, 27 + offset: 0, 0 + index: -1 +unit-pulsar-small + rotate: false + xy: 1150, 210 + size: 24, 20 + orig: 24, 20 + offset: 0, 0 + index: -1 +unit-pulsar-tiny + rotate: false + xy: 1192, 29 + size: 16, 13 + orig: 16, 13 + offset: 0, 0 + index: -1 +unit-pulsar-xlarge + rotate: false + xy: 701, 426 + size: 48, 40 + orig: 48, 40 + offset: 0, 0 + index: -1 +unit-quad-large + rotate: false + xy: 1007, 639 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-quad-medium + rotate: false + xy: 1929, 683 + size: 31, 31 + orig: 31, 31 + offset: 0, 0 + index: -1 +unit-quad-small + rotate: false + xy: 1176, 206 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-quad-tiny + rotate: false + xy: 471, 15 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +unit-quad-xlarge + rotate: false + xy: 401, 83 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-quasar-large + rotate: false + xy: 965, 597 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-quasar-medium + rotate: false + xy: 1661, 409 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-quasar-small + rotate: false + xy: 1202, 206 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-quasar-tiny + rotate: false + xy: 1989, 511 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-quasar-xlarge + rotate: false + xy: 451, 116 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-reign-large + rotate: false + xy: 1657, 695 + size: 40, 26 + orig: 40, 26 + offset: 0, 0 + index: -1 +unit-reign-medium + rotate: false + xy: 1929, 661 + size: 31, 20 + orig: 31, 20 + offset: 0, 0 + index: -1 +unit-reign-small + rotate: false + xy: 830, 3 + size: 24, 15 + orig: 24, 15 + offset: 0, 0 + index: -1 +unit-reign-tiny + rotate: false + xy: 945, 242 + size: 15, 10 + orig: 15, 10 + offset: 0, 0 + index: -1 +unit-reign-xlarge + rotate: false + xy: 351, 33 + size: 48, 31 + orig: 48, 31 + offset: 0, 0 + index: -1 +unit-risso-large + rotate: false + xy: 915, 526 + size: 35, 40 + orig: 35, 40 + offset: 0, 0 + index: -1 +unit-risso-medium + rotate: false + xy: 692, 18 + size: 28, 32 + orig: 28, 32 + offset: 0, 0 + index: -1 +unit-risso-small + rotate: false + xy: 1381, 206 + size: 21, 24 + orig: 21, 24 + offset: 0, 0 + index: -1 +unit-risso-tiny + rotate: false + xy: 1316, 193 + size: 14, 16 + orig: 14, 16 + offset: 0, 0 + index: -1 +unit-risso-xlarge + rotate: false + xy: 501, 125 + size: 43, 48 + orig: 43, 48 + offset: 0, 0 + index: -1 +unit-scepter-large + rotate: false + xy: 1783, 739 + size: 40, 32 + orig: 40, 32 + offset: 0, 0 + index: -1 +unit-scepter-medium + rotate: false + xy: 385, 5 + size: 32, 26 + orig: 32, 26 + offset: 0, 0 + index: -1 +unit-scepter-small + rotate: false + xy: 1228, 211 + size: 24, 19 + orig: 24, 19 + offset: 0, 0 + index: -1 +unit-scepter-tiny + rotate: false + xy: 1971, 496 + size: 16, 13 + orig: 16, 13 + offset: 0, 0 + index: -1 +unit-scepter-xlarge + rotate: false + xy: 501, 175 + size: 48, 39 + orig: 48, 39 + offset: 0, 0 + index: -1 +unit-sei-large + rotate: false + xy: 1049, 639 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-sei-medium + rotate: false + xy: 1695, 409 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-sei-small + rotate: false + xy: 1254, 206 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-sei-tiny + rotate: false + xy: 1210, 26 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-sei-xlarge + rotate: false + xy: 551, 216 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-spiroct-large + rotate: false + xy: 1867, 774 + size: 40, 31 + orig: 40, 31 + offset: 0, 0 + index: -1 +unit-spiroct-medium + rotate: false + xy: 1929, 634 + size: 31, 25 + orig: 31, 25 + offset: 0, 0 + index: -1 +unit-spiroct-small + rotate: false + xy: 1280, 211 + size: 24, 19 + orig: 24, 19 + offset: 0, 0 + index: -1 +unit-spiroct-tiny + rotate: false + xy: 471, 1 + size: 15, 12 + orig: 15, 12 + offset: 0, 0 + index: -1 +unit-spiroct-xlarge + rotate: false + xy: 601, 276 + size: 48, 38 + orig: 48, 38 + offset: 0, 0 + index: -1 +unit-toxopid-large + rotate: false + xy: 952, 526 + size: 33, 40 + orig: 33, 40 + offset: 0, 0 + index: -1 +unit-toxopid-medium + rotate: false + xy: 781, 682 + size: 26, 32 + orig: 26, 32 + offset: 0, 0 + index: -1 +unit-toxopid-small + rotate: false + xy: 1404, 206 + size: 20, 24 + orig: 20, 24 + offset: 0, 0 + index: -1 +unit-toxopid-tiny + rotate: false + xy: 2034, 665 + size: 13, 16 + orig: 13, 16 + offset: 0, 0 + index: -1 +unit-toxopid-xlarge + rotate: false + xy: 1007, 589 + size: 40, 48 + orig: 40, 48 + offset: 0, 0 + index: -1 +unit-vela-large + rotate: false + xy: 1825, 739 + size: 40, 32 + orig: 40, 32 + offset: 0, 0 + index: -1 +unit-vela-medium + rotate: false + xy: 1909, 750 + size: 32, 26 + orig: 32, 26 + offset: 0, 0 + index: -1 +unit-vela-small + rotate: false + xy: 1306, 211 + size: 24, 19 + orig: 24, 19 + offset: 0, 0 + index: -1 +unit-vela-tiny + rotate: false + xy: 1989, 496 + size: 16, 13 + orig: 16, 13 + offset: 0, 0 + index: -1 +unit-vela-xlarge + rotate: false + xy: 651, 349 + size: 48, 39 + orig: 48, 39 + offset: 0, 0 + index: -1 +unit-zenith-large + rotate: false + xy: 1091, 639 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-zenith-medium + rotate: false + xy: 1911, 716 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-zenith-small + rotate: false + xy: 1332, 206 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-zenith-tiny + rotate: false + xy: 1228, 26 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-zenith-xlarge + rotate: false + xy: 701, 376 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +wavepane + rotate: false + xy: 957, 568 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 white-pane rotate: false - xy: 995, 594 + xy: 877, 497 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19058,14 +20830,14 @@ white-pane index: -1 whiteui rotate: false - xy: 821, 928 + xy: 446, 78 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 1625, 482 + xy: 781, 61 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..4f9c0dffcc 100644 Binary files a/core/assets/sprites/fallback/sprites.png and b/core/assets/sprites/fallback/sprites.png differ diff --git a/core/assets/sprites/fallback/sprites2.png b/core/assets/sprites/fallback/sprites2.png index c629bbbfc4..aa17fbbe89 100644 Binary files a/core/assets/sprites/fallback/sprites2.png and b/core/assets/sprites/fallback/sprites2.png differ diff --git a/core/assets/sprites/fallback/sprites3.png b/core/assets/sprites/fallback/sprites3.png index 1c3416ff4b..4f3869aa13 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 9e45523d3c..b7d5c539ae 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..60da597583 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 e257c15017..43330a0028 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 294910d04f..3c08869d1d 100644 Binary files a/core/assets/sprites/fallback/sprites7.png and b/core/assets/sprites/fallback/sprites7.png differ diff --git a/core/assets/sprites/fallback/sprites8.png b/core/assets/sprites/fallback/sprites8.png new file mode 100644 index 0000000000..8a820d514a Binary files /dev/null and b/core/assets/sprites/fallback/sprites8.png differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index c9e48fcd06..2d267c4455 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -1,6473 +1,7523 @@ sprites.png -size: 4096,2048 +size: 4096,4096 format: rgba8888 filter: nearest,nearest repeat: none core-silo rotate: false - xy: 1735, 999 + xy: 1501, 1904 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 launch-pad rotate: false - xy: 2917, 1065 + xy: 3785, 2613 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large rotate: false - xy: 2059, 778 + xy: 3263, 2957 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 launch-pad-light rotate: false - xy: 3015, 1065 + xy: 3883, 2593 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launchpod rotate: false - xy: 2995, 367 + xy: 2612, 1868 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 force-projector rotate: false - xy: 2451, 592 + xy: 3099, 2729 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 force-projector-top rotate: false - xy: 2277, 288 + xy: 3197, 2729 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 3325, 507 + xy: 2683, 2400 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 3325, 441 + xy: 2725, 2334 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender rotate: false - xy: 3905, 679 + xy: 2531, 1532 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender-top rotate: false - xy: 3939, 661 + xy: 2565, 1566 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-dome rotate: false - xy: 2709, 967 + xy: 2903, 2631 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-top rotate: false - xy: 2807, 967 + xy: 3001, 2631 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 3325, 375 + xy: 2725, 2268 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 3325, 309 + xy: 2725, 2202 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 3875, 339 + xy: 2293, 1450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-loader rotate: false - xy: 1823, 53 + xy: 2013, 232 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader rotate: false - xy: 1961, 445 + xy: 1801, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 1883, 447 + xy: 2123, 1552 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 3663, 195 + xy: 2123, 1484 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 3701, 199 + xy: 2157, 1484 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 3735, 195 + xy: 2191, 1820 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 3769, 195 + xy: 2225, 1820 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-0 rotate: false - xy: 2135, 352 + xy: 1053, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-full rotate: false - xy: 2135, 352 + xy: 1053, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-1 rotate: false - xy: 3565, 263 + xy: 2315, 2067 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-2 rotate: false - xy: 3599, 263 + xy: 4017, 3587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-3 rotate: false - xy: 3633, 263 + xy: 1117, 2609 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-0 rotate: false - xy: 3667, 263 + xy: 1113, 2285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-1 rotate: false - xy: 3701, 267 + xy: 1776, 2861 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-2 rotate: false - xy: 3739, 297 + xy: 1087, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-3 rotate: false - xy: 3735, 263 + xy: 4051, 3587 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-0 rotate: false - xy: 1527, 19 + xy: 1113, 2251 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-1 rotate: false - xy: 1561, 19 + xy: 1121, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-2 rotate: false - xy: 1595, 19 + xy: 1155, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-3 rotate: false - xy: 1629, 19 + xy: 1189, 8 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-0 rotate: false - xy: 1663, 19 + xy: 3795, 3089 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-1 rotate: false - xy: 1697, 19 + xy: 2255, 2265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-2 rotate: false - xy: 1731, 19 + xy: 3851, 2439 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-3 rotate: false - xy: 1765, 19 + xy: 3885, 2443 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-0 rotate: false - xy: 1799, 19 + xy: 3869, 2405 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-1 rotate: false - xy: 1833, 19 + xy: 3869, 2371 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-2 rotate: false - xy: 1867, 19 + xy: 3869, 2337 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-3 rotate: false - xy: 1901, 19 + xy: 3869, 2303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 2713, 160 + xy: 2225, 1616 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 2637, 126 + xy: 2191, 1548 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 2671, 126 + xy: 2225, 1582 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 2705, 126 + xy: 2191, 1514 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 2647, 92 + xy: 2225, 1548 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 2647, 58 + xy: 2225, 1514 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 2681, 92 + xy: 2191, 1480 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 2647, 24 + xy: 2225, 1480 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 2681, 58 + xy: 2259, 1790 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 2681, 24 + xy: 2259, 1756 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 2715, 92 + xy: 2293, 1790 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 2715, 58 + xy: 2259, 1722 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 2715, 24 + xy: 2293, 1756 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 2739, 126 + xy: 2259, 1688 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 2773, 133 + xy: 2293, 1722 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 2749, 92 + xy: 2259, 1654 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 2749, 58 + xy: 2293, 1688 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 2749, 24 + xy: 2259, 1620 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 2783, 99 + xy: 2293, 1654 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor rotate: false - xy: 3991, 590 + xy: 2667, 1600 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-0 rotate: false - xy: 4025, 624 + xy: 2701, 1634 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-1 rotate: false - xy: 4025, 590 + xy: 2599, 1498 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-2 rotate: false - xy: 4059, 632 + xy: 2633, 1532 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-edge rotate: false - xy: 4059, 598 + xy: 2667, 1566 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-stack rotate: false - xy: 4059, 564 + xy: 2701, 1600 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 3939, 237 + xy: 2053, 1296 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 3939, 203 + xy: 2087, 1330 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 3939, 169 + xy: 2053, 1262 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 3948, 135 + xy: 2087, 1296 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 3948, 101 + xy: 2053, 1228 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 3967, 67 + xy: 2087, 1262 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 3993, 33 + xy: 2087, 1228 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 3935, 530 + xy: 2123, 1416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 3935, 496 + xy: 2157, 1416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 3935, 462 + xy: 2121, 1382 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 3935, 428 + xy: 2121, 1348 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 3935, 394 + xy: 2155, 1382 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 3969, 556 + xy: 2121, 1314 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 4003, 556 + xy: 2155, 1348 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 3969, 522 + xy: 2121, 1280 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 4003, 522 + xy: 2155, 1314 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 3969, 488 + xy: 2121, 1246 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 4003, 488 + xy: 2155, 1280 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 3969, 454 + xy: 2155, 1246 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cross rotate: false - xy: 2919, 42 + xy: 2327, 1740 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 distributor rotate: false - xy: 2995, 433 + xy: 2546, 1802 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 inverted-sorter rotate: false - xy: 3191, 3 + xy: 2327, 1604 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 3812, 99 + xy: 2531, 1668 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver-base rotate: false - xy: 3603, 1077 + xy: 2217, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 4041, 666 + xy: 2667, 1668 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 payload-conveyor rotate: false - xy: 2905, 967 + xy: 3099, 2631 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-edge rotate: false - xy: 3003, 967 + xy: 3197, 2631 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-conveyor-top rotate: false - xy: 3101, 967 + xy: 3295, 2631 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-top rotate: false - xy: 3101, 967 + xy: 3295, 2631 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router rotate: false - xy: 2579, 869 + xy: 3393, 2611 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-edge rotate: false - xy: 2579, 771 + xy: 3491, 2611 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-over rotate: false - xy: 2677, 869 + xy: 1755, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 3923, 627 + xy: 2667, 1634 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 3923, 593 + xy: 2701, 1668 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 3957, 624 + xy: 2565, 1498 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 3991, 624 + xy: 2599, 1532 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 3867, 509 + xy: 2019, 1387 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 3909, 339 + xy: 2361, 1434 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 underflow-gate rotate: false - xy: 4003, 420 + xy: 2259, 1416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-drill rotate: false - xy: 3365, 1435 + xy: 3961, 3079 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rim rotate: false - xy: 3495, 1435 + xy: 1747, 802 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 3625, 1435 + xy: 2973, 3087 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 3755, 1435 + xy: 3103, 3087 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 drill-top rotate: false - xy: 3127, 499 + xy: 2593, 2330 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -turbine-generator-liquid +steam-generator-liquid rotate: false - xy: 3127, 499 + xy: 2593, 2330 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 2525, 1065 + xy: 1657, 2437 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rim rotate: false - xy: 2623, 1065 + xy: 1703, 2339 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 2721, 1065 + xy: 1703, 2241 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 2819, 1065 + xy: 3687, 2613 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 3193, 301 + xy: 2659, 2334 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 3259, 301 + xy: 2659, 2268 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 3305, 573 + xy: 2659, 2202 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 3897, 1077 + xy: 2511, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 3995, 1077 + xy: 2609, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 2513, 967 + xy: 2707, 2647 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 2611, 967 + xy: 2805, 2631 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 2705, 392 + xy: 2678, 1736 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 2639, 326 + xy: 2744, 2004 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 2705, 326 + xy: 2744, 1938 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 3299, 235 + xy: 3079, 2433 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 3299, 169 + xy: 3211, 2499 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 3299, 103 + xy: 3145, 2433 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 3299, 37 + xy: 3277, 2499 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border rotate: false - xy: 2071, 19 + xy: 3903, 2273 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 3423, 55 + xy: 2089, 1806 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 3633, 229 + xy: 2157, 1824 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 3807, 269 + xy: 2225, 1718 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 2677, 771 + xy: 1853, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 1917, 447 + xy: 2157, 1586 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 3561, 195 + xy: 2123, 1518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 3561, 195 + xy: 2123, 1518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 3595, 195 + xy: 2157, 1552 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 3629, 195 + xy: 2157, 1518 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 3491, 55 + xy: 2225, 1786 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 3517, 21 + xy: 2191, 1718 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 3472, 131 + xy: 2225, 1752 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 3506, 137 + xy: 2191, 1684 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 3506, 137 + xy: 2191, 1684 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 3506, 137 + xy: 2191, 1684 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 3803, 235 + xy: 2191, 1650 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 3803, 201 + xy: 2225, 1684 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 2611, 160 + xy: 2191, 1616 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 2645, 160 + xy: 2225, 1650 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 2645, 160 + xy: 2225, 1650 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 2679, 160 + xy: 2191, 1582 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 3593, 59 + xy: 2497, 1600 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate rotate: false - xy: 3695, 59 + xy: 2633, 1702 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate-top rotate: false - xy: 3729, 59 + xy: 2463, 1532 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 3763, 59 + xy: 2497, 1566 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 3551, 25 + xy: 2531, 1600 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 3585, 25 + xy: 2565, 1634 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 3113, 1065 + xy: 3981, 2573 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 3211, 1077 + xy: 1825, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 3309, 1077 + xy: 1923, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 3789, 25 + xy: 2599, 1634 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump-liquid rotate: false - xy: 3831, 65 + xy: 2633, 1668 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-liquid rotate: false - xy: 3831, 65 + xy: 2633, 1668 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-pump-liquid rotate: false - xy: 3831, 65 + xy: 2633, 1668 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 3855, 645 + xy: 2531, 1498 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 3889, 645 + xy: 2565, 1532 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 3855, 611 + xy: 2599, 1566 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 3889, 611 + xy: 2633, 1600 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-cap rotate: false - xy: 3837, 201 + xy: 2667, 1532 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-0 rotate: false - xy: 3837, 167 + xy: 2701, 1566 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-1 rotate: false - xy: 3846, 133 + xy: 2667, 1498 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-2 rotate: false - xy: 3846, 99 + xy: 2701, 1532 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-3 rotate: false - xy: 3865, 65 + xy: 2701, 1498 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-4 rotate: false - xy: 3857, 31 + xy: 2463, 1464 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 3833, 462 + xy: 2599, 1464 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 3833, 428 + xy: 2633, 1464 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 3833, 394 + xy: 2667, 1464 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 3833, 360 + xy: 2701, 1464 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 2837, 266 + xy: 2810, 2004 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 3395, 979 + xy: 2049, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hyper-processor rotate: false - xy: 2451, 494 + xy: 3491, 2709 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +large-logic-display + rotate: false + xy: 1307, 1646 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 logic-display rotate: false - xy: 3407, 1077 + xy: 2021, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor rotate: false - xy: 3061, 367 + xy: 2612, 1802 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +memory-bank + rotate: false + xy: 2683, 2466 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 memory-cell rotate: false - xy: 3871, 679 + xy: 2497, 1498 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 3973, 658 + xy: 2599, 1600 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor rotate: false - xy: 4007, 658 + xy: 2633, 1634 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch rotate: false - xy: 3933, 67 + xy: 2087, 1398 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 switch-on rotate: false - xy: 3925, 33 + xy: 2053, 1330 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery rotate: false - xy: 1935, 19 + xy: 3869, 2269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large rotate: false - xy: 1431, 162 + xy: 1877, 820 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-large-top rotate: false - xy: 1431, 64 + xy: 1975, 918 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-top rotate: false - xy: 1969, 19 + xy: 3903, 2409 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 4051, 700 + xy: 2191, 1786 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 3483, 21 + xy: 2191, 1752 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator rotate: false - xy: 2157, 680 + xy: 2315, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-liquid rotate: false - xy: 2157, 582 + xy: 2413, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-top rotate: false - xy: 2157, 484 + xy: 2511, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode rotate: false - xy: 2885, 8 + xy: 2327, 1706 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 diode-arrow rotate: false - xy: 2919, 8 + xy: 2361, 1740 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator rotate: false - xy: 3089, 3 + xy: 2361, 1672 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-top rotate: false - xy: 3123, 3 + xy: 2395, 1706 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor rotate: false - xy: 3565, 1175 + xy: 2483, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-bottom rotate: false - xy: 3695, 1305 + xy: 2613, 3035 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-light rotate: false - xy: 3695, 1175 + xy: 2743, 3071 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-0 rotate: false - xy: 3825, 1305 + xy: 2743, 2941 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-1 rotate: false - xy: 3825, 1175 + xy: 2873, 2957 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-2 rotate: false - xy: 3955, 1305 + xy: 3003, 2957 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-3 rotate: false - xy: 3955, 1175 + xy: 3133, 2957 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 power-node rotate: false - xy: 3891, 31 + xy: 2497, 1464 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 2771, 365 + xy: 2744, 1872 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source rotate: false - xy: 3833, 530 + xy: 2531, 1464 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 3833, 496 + xy: 2565, 1464 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 2903, 274 + xy: 2810, 1938 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 3867, 475 + xy: 2019, 1353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 3875, 305 + xy: 2327, 1434 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 3297, 979 + xy: 2147, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +steam-generator + rotate: false + xy: 2749, 2499 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-cap + rotate: false + xy: 2749, 2433 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-top + rotate: false + xy: 2815, 2499 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine0 + rotate: false + xy: 2881, 2499 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +steam-generator-turbine1 + rotate: false + xy: 2815, 2433 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 surge-tower rotate: false - xy: 3233, 169 + xy: 2947, 2499 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 3101, 103 + xy: 2947, 2433 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 3493, 979 + xy: 1951, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 3591, 979 + xy: 2245, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-top rotate: false - xy: 3689, 979 + xy: 2147, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -turbine-generator - rotate: false - xy: 2903, 76 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-cap - rotate: false - xy: 2969, 37 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-top - rotate: false - xy: 3035, 37 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-turbine0 - rotate: false - xy: 3101, 37 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-turbine1 - rotate: false - xy: 3167, 37 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 alloy-smelter rotate: false - xy: 1493, 260 + xy: 1953, 1016 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 1591, 249 + xy: 1877, 918 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-mixer rotate: false - xy: 2353, 412 + xy: 2581, 2598 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-forge rotate: false - xy: 1693, 347 + xy: 1985, 722 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 coal-centrifuge rotate: false - xy: 3793, 847 + xy: 2381, 2170 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-bottom rotate: false - xy: 3991, 802 + xy: 2480, 1934 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 2975, 565 + xy: 2480, 1868 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 3041, 565 + xy: 2546, 2000 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator rotate: false - xy: 3107, 565 + xy: 2546, 1934 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 3173, 565 + xy: 2546, 1868 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 2995, 499 + xy: 2480, 1802 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 disassembler rotate: false - xy: 2183, 386 + xy: 2609, 2839 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-liquid rotate: false - xy: 2179, 288 + xy: 2707, 2843 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-spinner rotate: false - xy: 2215, 190 + xy: 2707, 2745 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press rotate: false - xy: 3193, 499 + xy: 2593, 2198 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 incinerator rotate: false - xy: 3157, 3 + xy: 2429, 1740 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 3693, 161 + xy: 2429, 1468 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 3812, 133 + xy: 2497, 1634 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln rotate: false - xy: 3193, 433 + xy: 2579, 2132 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-top rotate: false - xy: 3239, 565 + xy: 2579, 2066 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 3239, 565 + xy: 2579, 2066 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 3687, 25 + xy: 2463, 1498 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-void rotate: false - xy: 3721, 25 + xy: 2497, 1532 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 3823, 25 + xy: 2701, 1702 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press rotate: false - xy: 3701, 1077 + xy: 2315, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 2485, 428 + xy: 2711, 2136 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 2551, 430 + xy: 2711, 2070 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 2441, 346 + xy: 2678, 2000 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 2507, 362 + xy: 2678, 1934 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 2573, 364 + xy: 2678, 1868 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 3841, 326 + xy: 2055, 1466 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 3841, 292 + xy: 2089, 1466 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 2507, 296 + xy: 2744, 1740 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator rotate: false - xy: 3233, 235 + xy: 3165, 2565 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 2639, 194 + xy: 3231, 2565 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-spinner rotate: false - xy: 2705, 194 + xy: 3297, 2565 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-crucible rotate: false - xy: 3167, 771 + xy: 1951, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-crucible-top rotate: false - xy: 3199, 967 + xy: 1853, 2447 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 2771, 167 + xy: 3363, 2545 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press rotate: false - xy: 2837, 134 + xy: 3429, 2545 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame0 rotate: false - xy: 2903, 142 + xy: 3495, 2545 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame1 rotate: false - xy: 2969, 169 + xy: 3561, 2545 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame2 rotate: false - xy: 3035, 169 + xy: 3627, 2547 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-liquid rotate: false - xy: 3101, 169 + xy: 3693, 2547 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-top rotate: false - xy: 3167, 169 + xy: 3759, 2547 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -rock1 +boulder1 rotate: false - xy: 3641, 439 + xy: 2843, 2113 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -rock2 +boulder2 rotate: false - xy: 3691, 489 + xy: 1559, 3057 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder1 + rotate: false + xy: 1604, 2857 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-boulder2 + rotate: false + xy: 3319, 2371 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-boulder1 rotate: false - xy: 3867, 441 + xy: 2019, 1319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-boulder2 rotate: false - xy: 3867, 407 + xy: 2019, 1285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder1 rotate: false - xy: 3901, 407 + xy: 2225, 1446 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder2 rotate: false - xy: 3901, 373 + xy: 2259, 1450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -snowrock1 +snow-boulder1 rotate: false - xy: 3741, 489 + xy: 2926, 1767 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -snowrock2 +snow-boulder2 rotate: false - xy: 3691, 389 + xy: 2976, 1981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-cluster1 rotate: false - xy: 3481, 213 + xy: 1738, 2895 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster2 rotate: false - xy: 3479, 171 + xy: 1780, 2895 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster3 rotate: false - xy: 3523, 255 + xy: 1696, 2853 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 white-tree rotate: false - xy: 1, 411 + xy: 1, 1523 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead rotate: false - xy: 1322, 1727 + xy: 2173, 3775 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-dead-shadow rotate: false - xy: 1, 1699 + xy: 403, 2943 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 white-tree-shadow rotate: false - xy: 1, 1699 + xy: 403, 2943 size: 353, 348 orig: 353, 348 offset: 0, 0 index: -1 container rotate: false - xy: 3859, 847 + xy: 2381, 2038 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team + rotate: false + xy: 2348, 1972 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation rotate: false - xy: 2383, 1016 + xy: 1817, 1456 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-foundation-team rotate: false - xy: 1001, 339 + xy: 1817, 1326 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus rotate: false - xy: 1573, 999 + xy: 1401, 460 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-nucleus-team rotate: false - xy: 1573, 837 + xy: 1397, 298 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard rotate: false - xy: 1791, 347 + xy: 1997, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-shard-team rotate: false - xy: 1885, 249 + xy: 2095, 2937 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 unloader rotate: false - xy: 3969, 386 + xy: 2293, 1416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-center rotate: false - xy: 4003, 386 + xy: 2189, 1378 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault rotate: false - xy: 3885, 979 + xy: 2049, 2447 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vault-team + rotate: false + xy: 2343, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-heat rotate: false - xy: 2179, 254 + xy: 773, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-1 rotate: false - xy: 2003, 19 + xy: 3903, 2375 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-2 rotate: false - xy: 3265, 901 + xy: 2439, 2528 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-3 rotate: false - xy: 1529, 151 + xy: 1975, 820 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-4 rotate: false - xy: 3885, 1435 + xy: 3233, 3087 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 hail-heat rotate: false - xy: 1359, 1 + xy: 1016, 3073 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 3259, 433 + xy: 2612, 1934 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 2351, 756 + xy: 3003, 2827 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 2775, 771 + xy: 1951, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 2705, 260 + xy: 2810, 1806 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 2771, 233 + xy: 2810, 1740 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 2573, 232 + xy: 2703, 2581 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-heat rotate: false - xy: 3901, 543 + xy: 2019, 1217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 3365, 177 + xy: 3277, 2433 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +wave-top + rotate: false + xy: 3343, 2479 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 additive-reconstructor rotate: false - xy: 1595, 347 + xy: 2873, 3103 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 additive-reconstructor-top rotate: false - xy: 2481, 788 + xy: 1757, 1004 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 air-factory rotate: false - xy: 2481, 690 + xy: 1855, 1016 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 command-center rotate: false - xy: 3859, 913 + xy: 2381, 2104 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center-team + rotate: false + xy: 2461, 2198 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 exponential-reconstructor rotate: false - xy: 1129, 791 + xy: 1127, 3211 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 exponential-reconstructor-top rotate: false - xy: 775, 243 + xy: 2531, 3307 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-in-3 rotate: false - xy: 2215, 92 + xy: 2805, 2729 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 factory-in-5 rotate: false - xy: 2059, 1070 + xy: 1563, 446 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 factory-in-7 rotate: false - xy: 743, 17 + xy: 831, 899 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-in-9 rotate: false - xy: 323, 1409 + xy: 3655, 3807 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 factory-out-3 rotate: false - xy: 2353, 658 + xy: 2903, 2729 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 factory-out-5 rotate: false - xy: 2221, 1232 + xy: 1559, 284 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 factory-out-7 rotate: false - xy: 839, 469 + xy: 831, 673 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 factory-out-9 rotate: false - xy: 323, 1119 + xy: 403, 2331 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 factory-top-3 rotate: false - xy: 2353, 560 + xy: 3001, 2729 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ground-factory rotate: false - xy: 2313, 92 + xy: 3393, 2709 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 multiplicative-reconstructor rotate: false - xy: 2059, 908 + xy: 1559, 122 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 multiplicative-reconstructor-top rotate: false - xy: 2221, 1070 + xy: 1725, 608 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 naval-factory rotate: false - xy: 3799, 1077 + xy: 2413, 2741 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rally-point rotate: false - xy: 2771, 299 + xy: 2777, 2136 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-base rotate: false - xy: 3867, 543 + xy: 2019, 1421 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point rotate: false - xy: 2837, 332 + xy: 2777, 2070 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tetrative-reconstructor rotate: false - xy: 323, 829 + xy: 323, 2041 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 tetrative-reconstructor-top rotate: false - xy: 323, 539 + xy: 323, 1751 size: 288, 288 orig: 288, 288 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 2783, 65 + xy: 2259, 1586 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 3925, 913 + xy: 2414, 1972 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door rotate: false - xy: 2953, 3 + xy: 2327, 1672 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large rotate: false - xy: 3061, 499 + xy: 2551, 2462 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 3061, 433 + xy: 2551, 2396 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-open rotate: false - xy: 2987, 3 + xy: 2361, 1706 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 3957, 590 + xy: 2633, 1566 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 2419, 412 + xy: 2645, 2066 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-wall rotate: false - xy: 3837, 235 + xy: 2633, 1498 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large rotate: false - xy: 2639, 392 + xy: 2678, 1802 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-gigantic rotate: false - xy: 1261, 401 + xy: 3393, 2807 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge2 rotate: false - xy: 3069, 771 + xy: 1853, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge3 rotate: false - xy: 3167, 869 + xy: 2049, 2643 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-large1 rotate: false - xy: 2903, 208 + xy: 2835, 2565 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large2 rotate: false - xy: 2969, 235 + xy: 2901, 2565 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large3 rotate: false - xy: 3035, 235 + xy: 2967, 2565 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large4 rotate: false - xy: 3101, 235 + xy: 3033, 2565 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall2 rotate: false - xy: 3901, 509 + xy: 2123, 1450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 3901, 475 + xy: 2157, 1450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 3901, 441 + xy: 2191, 1446 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 3901, 441 + xy: 2191, 1446 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 3899, 67 + xy: 2053, 1364 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 2969, 103 + xy: 2881, 2433 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 3959, 33 + xy: 2087, 1364 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 3167, 103 + xy: 3079, 2499 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster rotate: false - xy: 1261, 271 + xy: 3653, 2937 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-wall rotate: false - xy: 4003, 454 + xy: 2191, 1412 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large rotate: false - xy: 3233, 103 + xy: 3013, 2433 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 bullet rotate: false - xy: 463, 33 + xy: 1251, 1119 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 3795, 793 + xy: 2965, 2379 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 casing rotate: false - xy: 3939, 729 + xy: 1103, 1371 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 circle-end rotate: false - xy: 1455, 542 + xy: 1440, 2640 size: 100, 199 orig: 100, 199 offset: 0, 0 index: -1 circle-mid rotate: false - xy: 4094, 1845 + xy: 605, 1550 size: 1, 199 orig: 1, 199 offset: 0, 0 index: -1 circle-shadow rotate: false - xy: 2252, 1556 + xy: 1356, 2422 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 error rotate: false - xy: 3787, 689 + xy: 4041, 2523 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +large-bomb + rotate: false + xy: 3885, 2977 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +large-bomb-back + rotate: false + xy: 3783, 2813 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 laser rotate: false - xy: 3325, 785 + xy: 567, 93 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 laser-end rotate: false - xy: 2215, 18 + xy: 1947, 1709 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 minelaser rotate: false - xy: 1125, 481 + xy: 2973, 3293 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 2289, 18 + xy: 1947, 1635 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 missile rotate: false - xy: 2313, 776 + xy: 2683, 2941 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 missile-back rotate: false - xy: 1489, 26 + xy: 1683, 10 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 parallax-laser rotate: false - xy: 4091, 955 + xy: 2751, 3257 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 parallax-laser-end rotate: false - xy: 2363, 18 + xy: 1947, 1561 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 particle rotate: false - xy: 3481, 255 + xy: 1696, 2895 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 scale_marker rotate: false - xy: 1, 1 + xy: 1501, 1088 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 shell rotate: false - xy: 3701, 301 + xy: 1113, 2319 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 3523, 217 + xy: 1738, 2857 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 transfer rotate: false - xy: 4091, 905 + xy: 397, 2439 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 3969, 420 + xy: 2225, 1412 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white rotate: false - xy: 1557, 542 + xy: 1910, 2130 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 +alpha-outline + rotate: false + xy: 3019, 2383 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 alpha-wreck0 rotate: false - xy: 3849, 797 + xy: 2907, 2217 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-wreck1 rotate: false - xy: 3899, 797 + xy: 3069, 2383 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-wreck2 rotate: false - xy: 3365, 4 + xy: 3119, 2383 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +antumbra-outline + rotate: false + xy: 935, 2357 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 antumbra-wreck0 rotate: false - xy: 1355, 985 + xy: 895, 2115 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck1 rotate: false - xy: 1355, 743 + xy: 895, 1873 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 antumbra-wreck2 rotate: false - xy: 1613, 1485 + xy: 895, 1631 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 arc rotate: false - xy: 3337, 647 + xy: 2208, 2064 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -arkyid-wreck0 - rotate: false - xy: 3105, 1435 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck1 - rotate: false - xy: 3964, 1789 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-wreck2 - rotate: false - xy: 3235, 1435 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -atrax-wreck0 - rotate: false - xy: 1391, 272 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck1 - rotate: false - xy: 2963, 705 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -atrax-wreck2 - rotate: false - xy: 3053, 705 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -beta-wreck0 - rotate: false - xy: 3499, 739 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck1 - rotate: false - xy: 3549, 739 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -beta-wreck2 - rotate: false - xy: 3599, 739 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-additive-reconstructor-full - rotate: false - xy: 1529, 53 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-air-factory-full - rotate: false - xy: 1627, 151 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-arc-full - rotate: false - xy: 2037, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-blast-drill-full - rotate: false - xy: 2525, 1293 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-char-full - rotate: false - xy: 2105, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cliffs-full - rotate: false - xy: 2139, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conduit-full - rotate: false - xy: 2173, 19 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-conveyor-full - rotate: false - xy: 2437, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-0 - rotate: false - xy: 2437, 8 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-core-foundation-full - rotate: false - xy: 2525, 1163 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-core-nucleus-full - rotate: false - xy: 1573, 1323 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-core-shard-full - rotate: false - xy: 1627, 53 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-craters-full - rotate: false - xy: 4033, 768 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-cryofluidmixer-full - rotate: false - xy: 3265, 835 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cultivator-full - rotate: false - xy: 3331, 913 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-cyclone-full - rotate: false - xy: 1689, 249 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-dark-metal-full - rotate: false - xy: 4057, 966 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-full - rotate: false - xy: 4057, 932 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dunerocks-full - rotate: false - xy: 4057, 898 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-full - rotate: false - xy: 4057, 864 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-exponential-reconstructor-full - rotate: false - xy: 1129, 1243 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -block-fuse-full - rotate: false - xy: 1725, 151 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-grass-full - rotate: false - xy: 4057, 830 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ground-factory-full - rotate: false - xy: 1725, 53 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-hail-full - rotate: false - xy: 2569, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-holostone-full - rotate: false - xy: 3773, 297 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-hotrock-full - rotate: false - xy: 3769, 263 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-full - rotate: false - xy: 3807, 303 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-full - rotate: false - xy: 3949, 729 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-icerocks-full - rotate: false - xy: 3983, 726 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ignarock-full - rotate: false - xy: 3821, 655 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-impact-reactor-full - rotate: false - xy: 2655, 1293 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-lancer-full - rotate: false - xy: 3331, 847 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-laser-drill-full - rotate: false - xy: 1787, 249 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-liquid-router-full - rotate: false - xy: 3821, 621 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-liquid-tank-full - rotate: false - xy: 1823, 151 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-magmarock-full - rotate: false - xy: 4017, 726 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-mass-driver-full - rotate: false - xy: 1863, 613 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-mechanical-drill-full - rotate: false - xy: 3397, 913 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-meltdown-full - rotate: false - xy: 2655, 1163 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-metal-floor-damaged-full - rotate: false - xy: 3430, 89 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-moss-full - rotate: false - xy: 1747, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-multiplicative-reconstructor-full - rotate: false - xy: 1573, 1161 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -block-naval-factory-full - rotate: false - xy: 1863, 515 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-oil-extractor-full - rotate: false - xy: 1961, 641 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-ore-coal-full - rotate: false - xy: 1781, 473 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-copper-full - rotate: false - xy: 1815, 473 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-lead-full - rotate: false - xy: 1849, 473 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-scrap-full - rotate: false - xy: 1883, 481 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-thorium-full - rotate: false - xy: 1917, 481 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ore-titanium-full - rotate: false - xy: 2545, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-parallax-full - rotate: false - xy: 3397, 847 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-payload-conveyor-full - rotate: false - xy: 1961, 543 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-conveyor-icon - rotate: false - xy: 1961, 543 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-payload-router-full - rotate: false - xy: 2059, 680 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -payload-router-icon - rotate: false - xy: 2059, 680 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-pebbles-full - rotate: false - xy: 2545, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-phase-weaver-full - rotate: false - xy: 3463, 913 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-plated-conduit-full - rotate: false - xy: 2545, 12 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pneumatic-drill-full - rotate: false - xy: 3463, 847 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-pulse-conduit-full - rotate: false - xy: 2579, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-pulverizer-full - rotate: false - xy: 2579, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-repair-point-full - rotate: false - xy: 2579, 12 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ripple-full - rotate: false - xy: 2059, 582 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-rock-full - rotate: false - xy: 3649, 739 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-rocks-full - rotate: false - xy: 2603, 114 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-saltrocks-full - rotate: false - xy: 2613, 80 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-salvo-full - rotate: false - xy: 3529, 913 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-sand-boulder-full - rotate: false - xy: 2613, 46 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-full - rotate: false - xy: 2613, 12 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-full - rotate: false - xy: 3415, 20 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scatter-full - rotate: false - xy: 3529, 847 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-scorch-full - rotate: false - xy: 3565, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-full - rotate: false - xy: 3599, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall1 - rotate: false - xy: 3599, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-huge-full - rotate: false - xy: 2059, 484 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge1 - rotate: false - xy: 2059, 484 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-scrap-wall-large-full - rotate: false - xy: 3595, 913 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-segment-full - rotate: false - xy: 3595, 847 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-shale-boulder-full - rotate: false - xy: 3667, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shale-full - rotate: false - xy: 3701, 233 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shalerocks-full - rotate: false - xy: 3735, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-shrubs-full - rotate: false - xy: 3769, 229 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-full - rotate: false - xy: 3837, 709 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snowrock-full - rotate: false - xy: 3699, 739 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-snowrocks-full - rotate: false - xy: 3871, 713 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-full - rotate: false - xy: 2785, 1293 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -block-spore-cluster-full - rotate: false - xy: 1317, 1 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-full - rotate: false - xy: 3905, 713 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spore-press-full - rotate: false - xy: 3661, 913 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-sporerocks-full - rotate: false - xy: 4051, 734 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-stone-full - rotate: false - xy: 3464, 89 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-swarmer-full - rotate: false - xy: 3661, 847 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-tendrils-full - rotate: false - xy: 3457, 55 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tetrative-reconstructor-full - rotate: false - xy: 1, 121 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -block-titanium-conveyor-full - rotate: false - xy: 3449, 21 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-0 - rotate: false - xy: 3449, 21 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-turbine-generator-full - rotate: false - xy: 3727, 913 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-water-extractor-full - rotate: false - xy: 3727, 847 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -block-wave-full - rotate: false - xy: 3793, 913 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -bryde-wreck0 - rotate: false - xy: 2537, 1423 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck1 - rotate: false - xy: 2679, 1423 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -bryde-wreck2 - rotate: false - xy: 2821, 1423 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -core-foundation-team-crux - rotate: false - xy: 2375, 886 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-team-sharded - rotate: false - xy: 3045, 1293 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus-team-crux - rotate: false - xy: 1735, 1323 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-team-sharded - rotate: false - xy: 1735, 1161 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard-team-crux - rotate: false - xy: 1889, 347 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-team-sharded - rotate: false - xy: 1987, 347 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-1-0 - rotate: false - xy: 2783, 31 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-1 - rotate: false - xy: 2817, 100 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-2 - rotate: false - xy: 2817, 66 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-3 - rotate: false - xy: 2851, 100 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-4 - rotate: false - xy: 2817, 32 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-5 - rotate: false - xy: 2851, 66 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-6 - rotate: false - xy: 2851, 32 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-7 - rotate: false - xy: 2885, 42 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-2-0 - rotate: false - xy: 3925, 847 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-1 - rotate: false - xy: 3991, 934 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-2 - rotate: false - xy: 3991, 868 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-3 - rotate: false - xy: 2863, 464 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-4 - rotate: false - xy: 2863, 398 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-5 - rotate: false - xy: 2929, 472 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-6 - rotate: false - xy: 2929, 406 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-2-7 - rotate: false - xy: 3271, 639 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cracks-3-0 - rotate: false - xy: 1983, 249 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-1 - rotate: false - xy: 1921, 151 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-2 - rotate: false - xy: 1921, 53 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-3 - rotate: false - xy: 2019, 151 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-4 - rotate: false - xy: 2019, 53 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-5 - rotate: false - xy: 2081, 249 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-6 - rotate: false - xy: 2117, 151 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-3-7 - rotate: false - xy: 2117, 53 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -cracks-4-0 - rotate: false - xy: 3045, 1163 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-1 - rotate: false - xy: 3175, 1305 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-2 - rotate: false - xy: 3175, 1175 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-3 - rotate: false - xy: 3305, 1305 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-4 - rotate: false - xy: 3305, 1175 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-5 - rotate: false - xy: 3435, 1305 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-6 - rotate: false - xy: 3435, 1175 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-4-7 - rotate: false - xy: 3565, 1305 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -cracks-5-0 - rotate: false - xy: 1735, 837 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-1 - rotate: false - xy: 1897, 1355 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-2 - rotate: false - xy: 1897, 1193 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-3 - rotate: false - xy: 1897, 1031 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-4 - rotate: false - xy: 1897, 869 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-5 - rotate: false - xy: 2059, 1394 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-6 - rotate: false - xy: 2059, 1232 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-5-7 - rotate: false - xy: 2221, 1394 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -cracks-6-0 - rotate: false - xy: 2455, 1565 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-1 - rotate: false - xy: 2649, 1565 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-2 - rotate: false - xy: 2843, 1565 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-3 - rotate: false - xy: 3037, 1565 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-4 - rotate: false - xy: 3231, 1565 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-5 - rotate: false - xy: 3425, 1565 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-6 - rotate: false - xy: 3619, 1565 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-6-7 - rotate: false - xy: 3813, 1565 - size: 192, 192 - orig: 192, 192 - offset: 0, 0 - index: -1 -cracks-7-0 - rotate: false - xy: 1387, 1501 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-1 - rotate: false - xy: 871, 727 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-2 - rotate: false - xy: 1129, 1017 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-3 - rotate: false - xy: 613, 469 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-4 - rotate: false - xy: 323, 313 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-5 - rotate: false - xy: 291, 87 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-6 - rotate: false - xy: 549, 243 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-7-7 - rotate: false - xy: 517, 17 - size: 224, 224 - orig: 224, 224 - offset: 0, 0 - index: -1 -cracks-8-0 - rotate: false - xy: 613, 1469 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-1 - rotate: false - xy: 613, 1211 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-2 - rotate: false - xy: 871, 1469 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-3 - rotate: false - xy: 613, 953 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-4 - rotate: false - xy: 871, 1211 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-5 - rotate: false - xy: 1129, 1469 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-6 - rotate: false - xy: 613, 695 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-8-7 - rotate: false - xy: 871, 953 - size: 256, 256 - orig: 256, 256 - offset: 0, 0 - index: -1 -cracks-9-0 - rotate: false - xy: 1644, 1759 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-1 - rotate: false - xy: 1934, 1759 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-2 - rotate: false - xy: 2224, 1759 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-3 - rotate: false - xy: 2514, 1759 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-4 - rotate: false - xy: 2804, 1759 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-5 - rotate: false - xy: 3094, 1759 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-6 - rotate: false - xy: 3384, 1759 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -cracks-9-7 - rotate: false - xy: 3674, 1759 - size: 288, 288 - orig: 288, 288 - offset: 0, 0 - index: -1 -crawler-wreck0 - rotate: false - xy: 3337, 681 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck1 - rotate: false - xy: 3387, 681 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-wreck2 - rotate: false - xy: 3437, 689 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -cyclone - rotate: false - xy: 2085, 386 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dagger-wreck0 - rotate: false - xy: 3637, 689 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck1 - rotate: false - xy: 3687, 689 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-wreck2 - rotate: false - xy: 3737, 689 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -duo - rotate: false - xy: 3021, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -eclipse-wreck0 - rotate: false - xy: 1, 1055 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-wreck1 - rotate: false - xy: 678, 1727 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-wreck2 - rotate: false - xy: 1, 733 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -flare-wreck0 - rotate: false - xy: 3391, 523 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck1 - rotate: false - xy: 3391, 473 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -flare-wreck2 - rotate: false - xy: 3391, 423 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -fortress-wreck0 - rotate: false - xy: 1557, 547 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck1 - rotate: false - xy: 1659, 629 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fortress-wreck2 - rotate: false - xy: 1659, 547 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -fuse - rotate: false - xy: 2313, 190 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -gamma-wreck0 - rotate: false - xy: 2411, 100 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck1 - rotate: false - xy: 2437, 42 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -gamma-wreck2 - rotate: false - xy: 1431, 6 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -hail - rotate: false - xy: 3055, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -horizon-wreck0 - rotate: false - xy: 2975, 631 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck1 - rotate: false - xy: 3049, 631 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -horizon-wreck2 - rotate: false - xy: 3123, 631 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -item-blast-compound-large - rotate: false - xy: 3949, 763 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-blast-compound-medium - rotate: false - xy: 3259, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-blast-compound-small - rotate: false - xy: 2059, 458 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-blast-compound-tiny - rotate: false - xy: 2433, 542 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-blast-compound-xlarge - rotate: false - xy: 3421, 581 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-coal-large - rotate: false - xy: 2527, 254 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-coal-medium - rotate: false - xy: 3327, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal-small - rotate: false - xy: 2837, 405 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-coal-tiny - rotate: false - xy: 2885, 116 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-coal-xlarge - rotate: false - xy: 3471, 639 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-copper-large - rotate: false - xy: 2527, 212 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-copper-medium - rotate: false - xy: 3973, 692 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper-small - rotate: false - xy: 2903, 372 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-copper-tiny - rotate: false - xy: 2433, 524 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-copper-xlarge - rotate: false - xy: 3471, 589 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-graphite-large - rotate: false - xy: 2527, 170 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-graphite-medium - rotate: false - xy: 3506, 103 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite-small - rotate: false - xy: 2969, 314 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-graphite-tiny - rotate: false - xy: 2885, 98 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-graphite-xlarge - rotate: false - xy: 3521, 639 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-lead-large - rotate: false - xy: 2527, 128 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-lead-medium - rotate: false - xy: 3523, 183 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead-small - rotate: false - xy: 2903, 346 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-lead-tiny - rotate: false - xy: 2433, 506 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-lead-xlarge - rotate: false - xy: 3521, 589 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-metaglass-large - rotate: false - xy: 3430, 123 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-metaglass-medium - rotate: false - xy: 3591, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass-small - rotate: false - xy: 291, 385 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-metaglass-tiny - rotate: false - xy: 2885, 80 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-metaglass-xlarge - rotate: false - xy: 3571, 639 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-phase-fabric-large - rotate: false - xy: 3991, 760 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-phase-fabric-medium - rotate: false - xy: 3659, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric-small - rotate: false - xy: 517, 287 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-phase-fabric-tiny - rotate: false - xy: 1747, 445 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-phase-fabric-xlarge - rotate: false - xy: 3571, 589 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-plastanium-large - rotate: false - xy: 2569, 190 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-plastanium-medium - rotate: false - xy: 3574, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium-small - rotate: false - xy: 1644, 1733 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-plastanium-tiny - rotate: false - xy: 1765, 445 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-plastanium-xlarge - rotate: false - xy: 3621, 639 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-pyratite-large - rotate: false - xy: 2569, 148 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-pyratite-medium - rotate: false - xy: 3642, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite-small - rotate: false - xy: 1387, 1475 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-pyratite-tiny - rotate: false - xy: 4079, 1059 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-pyratite-xlarge - rotate: false - xy: 3621, 589 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-sand-large - rotate: false - xy: 3791, 547 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-sand-medium - rotate: false - xy: 3574, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand-small - rotate: false - xy: 1831, 1491 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-sand-tiny - rotate: false - xy: 4079, 1041 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-sand-xlarge - rotate: false - xy: 3671, 639 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-scrap-large - rotate: false - xy: 3791, 505 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-scrap-medium - rotate: false - xy: 3642, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap-small - rotate: false - xy: 871, 701 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-scrap-tiny - rotate: false - xy: 4079, 1023 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-scrap-xlarge - rotate: false - xy: 3671, 589 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-silicon-large - rotate: false - xy: 3791, 463 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-silicon-medium - rotate: false - xy: 3676, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon-small - rotate: false - xy: 1097, 927 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-silicon-tiny - rotate: false - xy: 4079, 1005 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-silicon-xlarge - rotate: false - xy: 3721, 639 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-spore-pod-large - rotate: false - xy: 3791, 421 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-spore-pod-medium - rotate: false - xy: 3710, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod-small - rotate: false - xy: 1001, 247 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-spore-pod-tiny - rotate: false - xy: 2433, 488 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-spore-pod-xlarge - rotate: false - xy: 3721, 589 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-surge-alloy-large - rotate: false - xy: 3791, 379 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-surge-alloy-medium - rotate: false - xy: 3710, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy-small - rotate: false - xy: 2027, 843 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-surge-alloy-tiny - rotate: false - xy: 2351, 926 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-surge-alloy-xlarge - rotate: false - xy: 3771, 639 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-thorium-large - rotate: false - xy: 3791, 337 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-thorium-medium - rotate: false - xy: 3744, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium-small - rotate: false - xy: 2451, 730 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-thorium-tiny - rotate: false - xy: 1107, 321 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-thorium-xlarge - rotate: false - xy: 3771, 589 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-titanium-large - rotate: false - xy: 3491, 297 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-titanium-medium - rotate: false - xy: 3778, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium-small - rotate: false - xy: 3964, 1763 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-titanium-tiny - rotate: false - xy: 2353, 394 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-titanium-xlarge - rotate: false - xy: 3441, 531 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -lancer - rotate: false - xy: 3259, 499 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -liquid-cryofluid-large - rotate: false - xy: 3533, 297 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-cryofluid-medium - rotate: false - xy: 3559, 59 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid-small - rotate: false - xy: 2617, 470 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-cryofluid-tiny - rotate: false - xy: 2771, 440 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-cryofluid-xlarge - rotate: false - xy: 3441, 363 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-oil-large - rotate: false - xy: 3575, 297 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-oil-medium - rotate: false - xy: 3661, 59 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil-small - rotate: false - xy: 3299, 709 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-oil-tiny - rotate: false - xy: 549, 471 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-oil-xlarge - rotate: false - xy: 3491, 539 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-slag-large - rotate: false - xy: 3617, 297 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-slag-medium - rotate: false - xy: 3653, 25 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag-small - rotate: false - xy: 2189, 882 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-slag-tiny - rotate: false - xy: 2485, 328 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-slag-xlarge - rotate: false - xy: 3491, 489 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-water-large - rotate: false - xy: 3659, 297 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -liquid-water-medium - rotate: false - xy: 3797, 59 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water-small - rotate: false - xy: 1401, 17 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-water-tiny - rotate: false - xy: 2469, 104 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -liquid-water-xlarge - rotate: false - xy: 3541, 539 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mace-wreck0 - rotate: false - xy: 2995, 301 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck1 - rotate: false - xy: 3061, 301 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mace-wreck2 - rotate: false - xy: 3127, 301 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mass-driver - rotate: false - xy: 3505, 1077 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mega-wreck0 - rotate: false - xy: 1391, 440 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck1 - rotate: false - xy: 1391, 338 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -mega-wreck2 - rotate: false - xy: 1493, 440 - size: 100, 100 - orig: 100, 100 - offset: 0, 0 - index: -1 -meltdown - rotate: false - xy: 2221, 814 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-wreck0 - rotate: false - xy: 1897, 739 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-wreck1 - rotate: false - xy: 1195, 531 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -minke-wreck2 - rotate: false - xy: 1131, 401 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -mono-wreck0 - rotate: false - xy: 3541, 439 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck1 - rotate: false - xy: 3591, 489 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mono-wreck2 - rotate: false - xy: 3641, 539 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -nova-wreck0 - rotate: false - xy: 2469, 122 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck1 - rotate: false - xy: 289, 29 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-wreck2 - rotate: false - xy: 347, 29 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -parallax - rotate: false - xy: 2375, 346 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -poly-wreck0 - rotate: false - xy: 3389, 789 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck1 - rotate: false - xy: 3447, 789 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -poly-wreck2 - rotate: false - xy: 3505, 789 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -pulsar-wreck0 - rotate: false - xy: 229, 71 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck1 - rotate: false - xy: 1697, 497 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -pulsar-wreck2 - rotate: false - xy: 3265, 785 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -quasar-wreck0 - rotate: false - xy: 2811, 612 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck1 - rotate: false - xy: 2811, 530 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -quasar-wreck2 - rotate: false - xy: 2351, 478 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -repair-point - rotate: false - xy: 3880, 577 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ripple - rotate: false - xy: 2775, 869 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck0 - rotate: false - xy: 2971, 869 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck1 - rotate: false - xy: 2971, 771 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -risso-wreck2 - rotate: false - xy: 3069, 869 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -salvo - rotate: false - xy: 2639, 260 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scatter - rotate: false - xy: 2837, 200 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scorch - rotate: false - xy: 3867, 373 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -segment - rotate: false - xy: 3167, 235 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spectre - rotate: false - xy: 1131, 271 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spiroct-wreck0 - rotate: false - xy: 3983, 1000 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck1 - rotate: false - xy: 2675, 694 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -spiroct-wreck2 - rotate: false - xy: 2771, 694 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -splash-0 - rotate: false - xy: 3875, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-1 - rotate: false - xy: 3909, 271 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-10 - rotate: false - xy: 3914, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-11 - rotate: false - xy: 3914, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-2 - rotate: false - xy: 3871, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-3 - rotate: false - xy: 3871, 203 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-4 - rotate: false - xy: 3905, 237 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-5 - rotate: false - xy: 3871, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-6 - rotate: false - xy: 3905, 203 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-7 - rotate: false - xy: 3905, 169 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-8 - rotate: false - xy: 3880, 135 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -splash-9 - rotate: false - xy: 3880, 101 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -swarmer - rotate: false - xy: 3035, 103 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-alpha-full - rotate: false - xy: 3741, 381 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-antumbra-full - rotate: false - xy: 1831, 1517 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -unit-arkyid-full - rotate: false - xy: 1187, 141 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-atrax-full - rotate: false - xy: 3143, 705 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 -unit-beta-full - rotate: false - xy: 3441, 313 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-bryde-full - rotate: false - xy: 2963, 1423 - size: 140, 140 - orig: 140, 140 - offset: 0, 0 - index: -1 -unit-crawler-full - rotate: false - xy: 3491, 339 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-dagger-full - rotate: false - xy: 3541, 339 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-eclipse-full - rotate: false - xy: 1000, 1727 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -unit-flare-full - rotate: false - xy: 3591, 339 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-fortress-full - rotate: false - xy: 1493, 358 - size: 100, 80 - orig: 100, 80 - offset: 0, 0 - index: -1 -unit-gamma-full - rotate: false - xy: 3621, 789 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-horizon-full - rotate: false - xy: 3197, 631 - size: 72, 72 - orig: 72, 72 - offset: 0, 0 - index: -1 -unit-mace-full - rotate: false - xy: 3233, 37 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-mega-full - rotate: false - xy: 1595, 445 - 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 - offset: 0, 0 - index: -1 -unit-mono-full - rotate: false - xy: 3641, 339 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unit-nova-full - rotate: false - xy: 3679, 789 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-poly-full - rotate: false - xy: 3737, 789 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -unit-pulsar-full - rotate: false - xy: 2375, 296 - size: 58, 48 - orig: 58, 48 - offset: 0, 0 - index: -1 -unit-quasar-full - rotate: false - xy: 2893, 612 - size: 80, 80 - orig: 80, 80 - offset: 0, 0 - index: -1 -unit-risso-full - rotate: false - xy: 3787, 979 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -unit-spiroct-full - rotate: false - xy: 2867, 694 - size: 94, 75 - orig: 94, 75 - offset: 0, 0 - index: -1 -unit-zenith-full - rotate: false - xy: 1, 7 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -wave - rotate: false - xy: 3365, 243 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -zenith-wreck0 - rotate: false - xy: 1317, 157 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck1 - rotate: false - xy: 1317, 43 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -zenith-wreck2 - rotate: false - xy: 1341, 629 - size: 112, 112 - orig: 112, 112 - offset: 0, 0 - index: -1 -item-blast-compound - rotate: false - xy: 3225, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal - rotate: false - xy: 3293, 3 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper - rotate: false - xy: 3939, 695 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite - rotate: false - xy: 4007, 692 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead - rotate: false - xy: 3803, 167 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass - rotate: false - xy: 3557, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric - rotate: false - xy: 3625, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium - rotate: false - xy: 3540, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite - rotate: false - xy: 3608, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand - rotate: false - xy: 3540, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap - rotate: false - xy: 3608, 93 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon - rotate: false - xy: 3676, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod - rotate: false - xy: 3727, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy - rotate: false - xy: 3761, 161 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium - rotate: false - xy: 3744, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium - rotate: false - xy: 3778, 127 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid - rotate: false - xy: 3525, 59 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil - rotate: false - xy: 3627, 59 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag - rotate: false - xy: 3619, 25 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water - rotate: false - xy: 3755, 25 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -blank - rotate: false - xy: 4094, 2046 - size: 1, 1 - orig: 1, 1 - offset: 0, 0 - index: -1 -circle - rotate: false - xy: 2049, 1556 - size: 201, 201 - orig: 201, 201 - offset: 0, 0 - index: -1 -shape-3 - rotate: false - xy: 3365, 112 - size: 63, 63 - orig: 63, 63 - offset: 0, 0 - index: -1 -alpha - rotate: false - xy: 2435, 296 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-cell - rotate: false - xy: 1697, 447 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -antumbra - rotate: false - xy: 969, 1 - size: 216, 240 - orig: 216, 240 - offset: 0, 0 - index: -1 -antumbra-cell - rotate: false - xy: 1355, 1227 - 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 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -arkyid-cell - rotate: false - xy: 4007, 1723 - size: 88, 64 - orig: 88, 64 - offset: 0, 0 - index: -1 arkyid-foot rotate: false - xy: 2647, 458 + xy: 173, 1 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-joint-base rotate: false - xy: 2719, 458 + xy: 1947, 1415 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 arkyid-leg rotate: false - xy: 2255, 756 + xy: 773, 35 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 arkyid-leg-base rotate: false - xy: 1001, 273 + xy: 1479, 3709 size: 104, 64 orig: 104, 64 offset: 0, 0 index: -1 -atrax +arkyid-outline rotate: false - xy: 4007, 1657 - size: 88, 64 - orig: 88, 64 + xy: 3831, 3209 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -atrax-base +arkyid-wreck0 rotate: false - xy: 3233, 705 - size: 64, 64 - orig: 64, 64 + xy: 3961, 3209 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -atrax-cell +arkyid-wreck1 rotate: false - xy: 4007, 1591 - size: 88, 64 - orig: 88, 64 + xy: 1397, 6 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-wreck2 + rotate: false + xy: 3831, 3079 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +artillery-mount-outline + rotate: false + xy: 1947, 1271 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +artillery-outline + rotate: false + xy: 3169, 2375 + size: 48, 56 + orig: 48, 56 offset: 0, 0 index: -1 atrax-foot rotate: false - xy: 3949, 805 + xy: 1585, 3733 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 atrax-joint rotate: false - xy: 1427, 601 + xy: 2447, 2038 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 atrax-leg rotate: false - xy: 356, 1699 + xy: 1279, 3183 size: 36, 26 orig: 36, 26 offset: 0, 0 index: -1 atrax-leg-base rotate: false - xy: 394, 1699 + xy: 2419, 2368 size: 36, 26 orig: 36, 26 offset: 0, 0 index: -1 -beta +atrax-outline rotate: false - xy: 3399, 739 + xy: 1757, 938 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +atrax-wreck0 + rotate: false + xy: 1801, 2304 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +atrax-wreck1 + rotate: false + xy: 1993, 2381 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +atrax-wreck2 + rotate: false + xy: 2083, 2381 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +beam-weapon-outline + rotate: false + xy: 2173, 2262 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +beta-outline + rotate: false + xy: 1063, 3317 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-wreck0 + rotate: false + xy: 2683, 2979 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-wreck1 + rotate: false + xy: 3474, 2489 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-wreck2 + rotate: false + xy: 1063, 3261 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +block-additive-reconstructor-full + rotate: false + xy: 1887, 722 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-air-factory-full + rotate: false + xy: 1887, 624 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-arc-full + rotate: false + xy: 3903, 2341 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-basalt-full + rotate: false + xy: 3903, 2307 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-blast-drill-full + rotate: false + xy: 3363, 3087 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-boulder-full + rotate: false + xy: 3269, 2383 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -beta-cell +block-char-full rotate: false - xy: 3449, 739 + xy: 2013, 2 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-command-center-full + rotate: false + xy: 2263, 2299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-conduit-full + rotate: false + xy: 2047, 2 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-container-full + rotate: false + xy: 2329, 2299 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-conveyor-full + rotate: false + xy: 2081, 2 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-0 + rotate: false + xy: 2081, 2 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-foundation-full + rotate: false + xy: 3493, 3067 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-core-nucleus-full + rotate: false + xy: 1423, 784 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-core-shard-full + rotate: false + xy: 1887, 526 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-craters-full + rotate: false + xy: 1738, 2823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cryofluidmixer-full + rotate: false + xy: 2315, 2233 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cultivator-full + rotate: false + xy: 2315, 2167 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cyclone-full + rotate: false + xy: 1887, 428 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-dacite-boulder-full + rotate: false + xy: 1001, 1131 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -bryde +block-dacite-full rotate: false - xy: 2383, 1288 + xy: 1738, 2789 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-wall-full + rotate: false + xy: 1738, 2755 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-metal-full + rotate: false + xy: 2021, 1829 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-full + rotate: false + xy: 2021, 1795 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-full + rotate: false + xy: 2021, 1761 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-full + rotate: false + xy: 2021, 1727 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dune-wall-full + rotate: false + xy: 2021, 1693 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-duo-full + rotate: false + xy: 2021, 1659 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-full + rotate: false + xy: 2837, 3581 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +block-fuse-full + rotate: false + xy: 1985, 624 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-grass-full + rotate: false + xy: 2021, 1625 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ground-factory-full + rotate: false + xy: 1985, 526 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-hail-full + rotate: false + xy: 2021, 1591 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hotrock-full + rotate: false + xy: 2021, 1557 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-full + rotate: false + xy: 2021, 1523 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-full + rotate: false + xy: 2021, 1489 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-wall-full + rotate: false + xy: 2055, 1840 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-impact-reactor-full + rotate: false + xy: 3623, 3067 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-lancer-full + rotate: false + xy: 2315, 2101 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-laser-drill-full + rotate: false + xy: 1985, 428 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-liquid-router-full + rotate: false + xy: 2089, 1840 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-tank-full + rotate: false + xy: 2013, 330 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-magmarock-full + rotate: false + xy: 2055, 1806 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mass-driver-full + rotate: false + xy: 2013, 134 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-mechanical-drill-full + rotate: false + xy: 2343, 2500 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-meltdown-full + rotate: false + xy: 1817, 1716 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-full + rotate: false + xy: 2055, 1772 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-moss-full + rotate: false + xy: 2055, 1738 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mud-full + rotate: false + xy: 2089, 1772 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-full + rotate: false + xy: 1401, 622 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-naval-factory-full + rotate: false + xy: 2013, 36 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-oil-extractor-full + rotate: false + xy: 1542, 2743 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-ore-coal-full + rotate: false + xy: 2055, 1704 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-copper-full + rotate: false + xy: 2089, 1738 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-lead-full + rotate: false + xy: 2055, 1670 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-scrap-full + rotate: false + xy: 2089, 1704 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-thorium-full + rotate: false + xy: 2055, 1636 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-titanium-full + rotate: false + xy: 2089, 1670 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-parallax-full + rotate: false + xy: 2353, 2434 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-payload-conveyor-full + rotate: false + xy: 1542, 2645 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-conveyor-icon + rotate: false + xy: 1542, 2645 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-payload-router-full + rotate: false + xy: 1559, 2547 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-icon + rotate: false + xy: 1559, 2547 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-pebbles-full + rotate: false + xy: 2055, 1602 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-weaver-full + rotate: false + xy: 2353, 2368 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-plated-conduit-full + rotate: false + xy: 2089, 1636 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pneumatic-drill-full + rotate: false + xy: 2395, 2302 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-pulse-conduit-full + rotate: false + xy: 2055, 1568 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-full + rotate: false + xy: 2089, 1602 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-repair-point-full + rotate: false + xy: 2055, 1534 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ripple-full + rotate: false + xy: 1559, 2449 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-salt-wall-full + rotate: false + xy: 2089, 1568 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-full + rotate: false + xy: 2419, 2462 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-sand-boulder-full + rotate: false + xy: 2055, 1500 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-full + rotate: false + xy: 2089, 1534 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-wall-full + rotate: false + xy: 2089, 1500 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scatter-full + rotate: false + xy: 2419, 2396 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-scorch-full + rotate: false + xy: 2123, 1824 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-full + rotate: false + xy: 2123, 1790 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall1 + rotate: false + xy: 2123, 1790 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-full + rotate: false + xy: 1703, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-huge1 + rotate: false + xy: 1703, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-scrap-wall-large-full + rotate: false + xy: 2485, 2462 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-segment-full + rotate: false + xy: 2485, 2396 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-shale-boulder-full + rotate: false + xy: 2123, 1756 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-full + rotate: false + xy: 2157, 1790 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-wall-full + rotate: false + xy: 2123, 1722 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-full + rotate: false + xy: 2157, 1756 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-boulder-full + rotate: false + xy: 2843, 2163 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-full + rotate: false + xy: 2123, 1688 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-wall-full + rotate: false + xy: 2157, 1722 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spectre-full + rotate: false + xy: 1817, 1586 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-spore-cluster-full + rotate: false + xy: 758, 3251 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-full + rotate: false + xy: 2123, 1654 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-press-full + rotate: false + xy: 2505, 2528 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-spore-wall-full + rotate: false + xy: 2157, 1688 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-steam-generator-full + rotate: false + xy: 2571, 2532 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-stone-full + rotate: false + xy: 2123, 1620 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-full + rotate: false + xy: 2157, 1654 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-swarmer-full + rotate: false + xy: 2461, 2330 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-tendrils-full + rotate: false + xy: 2123, 1586 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-full + rotate: false + xy: 1, 1233 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +block-titanium-conveyor-full + rotate: false + xy: 2157, 1620 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-0 + rotate: false + xy: 2157, 1620 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-vault-full + rotate: false + xy: 1899, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-water-extractor-full + rotate: false + xy: 2461, 2264 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-wave-full + rotate: false + xy: 2395, 2236 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +bryde-outline + rotate: false + xy: 3121, 3217 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 -bryde-cell +bryde-wreck0 rotate: false - xy: 2383, 1146 + xy: 3263, 3217 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 -chaos-array-base +bryde-wreck1 rotate: false - xy: 2785, 1163 + xy: 3405, 3217 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-wreck2 + rotate: false + xy: 3547, 3197 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +command-center-team-crux + rotate: false + xy: 2447, 2132 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +command-center-team-sharded + rotate: false + xy: 2447, 2066 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team-crux + rotate: false + xy: 2348, 1906 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +container-team-sharded + rotate: false + xy: 2348, 1840 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +core-foundation-team-crux + rotate: false + xy: 1817, 1196 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -chaos-array-cell +core-foundation-team-sharded rotate: false - xy: 2915, 1293 + xy: 1883, 286 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -chaos-array-leg +core-nucleus-team-crux rotate: false - xy: 2915, 1163 + xy: 1397, 136 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-nucleus-team-sharded + rotate: false + xy: 1501, 2066 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-shard-team-crux + rotate: false + xy: 2193, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-shard-team-sharded + rotate: false + xy: 2291, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +corvus-foot + rotate: false + xy: 507, 1 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +corvus-joint + rotate: false + xy: 1507, 3121 + size: 60, 60 + orig: 60, 60 + offset: 0, 0 + index: -1 +corvus-joint-base + rotate: false + xy: 1947, 1199 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +toxopid-joint-base + rotate: false + xy: 1947, 1199 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +corvus-leg + rotate: false + xy: 291, 1453 + size: 30, 68 + orig: 30, 68 + offset: 0, 0 + index: -1 +corvus-leg-base + rotate: false + xy: 573, 1283 + size: 30, 64 + orig: 30, 64 + offset: 0, 0 + index: -1 +corvus-outline + rotate: false + xy: 2757, 3201 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-wreck0 + rotate: false + xy: 1016, 2927 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-wreck1 + rotate: false + xy: 1016, 2785 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-wreck2 + rotate: false + xy: 983, 2643 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +cracks-1-0 + rotate: false + xy: 2293, 1620 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-1 + rotate: false + xy: 2259, 1552 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-2 + rotate: false + xy: 2293, 1586 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-3 + rotate: false + xy: 2259, 1518 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-4 + rotate: false + xy: 2293, 1552 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-5 + rotate: false + xy: 2259, 1484 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-6 + rotate: false + xy: 2293, 1518 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-7 + rotate: false + xy: 2293, 1484 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-2-0 + rotate: false + xy: 2414, 1906 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-1 + rotate: false + xy: 2414, 1840 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-2 + rotate: false + xy: 2527, 2330 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-3 + rotate: false + xy: 2527, 2264 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-4 + rotate: false + xy: 2527, 2198 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-5 + rotate: false + xy: 2513, 2132 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-6 + rotate: false + xy: 2513, 2066 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-7 + rotate: false + xy: 2480, 2000 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-3-0 + rotate: false + xy: 2389, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-1 + rotate: false + xy: 2487, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-2 + rotate: false + xy: 2585, 2937 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-3 + rotate: false + xy: 1640, 2729 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-4 + rotate: false + xy: 1825, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-5 + rotate: false + xy: 1923, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-6 + rotate: false + xy: 2021, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-7 + rotate: false + xy: 2119, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-4-0 + rotate: false + xy: 1883, 156 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -crawler +cracks-4-1 rotate: false - xy: 3749, 739 - size: 48, 48 - orig: 48, 48 + xy: 1883, 26 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -crawler-base +cracks-4-2 rotate: false - xy: 3799, 743 - size: 48, 48 - orig: 48, 48 + xy: 1703, 3035 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 -crawler-cell +cracks-4-3 rotate: false - xy: 3849, 747 - size: 48, 48 - orig: 48, 48 + xy: 1833, 3035 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-4 + rotate: false + xy: 1963, 3035 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-5 + rotate: false + xy: 2093, 3035 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-6 + rotate: false + xy: 2223, 3035 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-7 + rotate: false + xy: 2353, 3035 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-5-0 + rotate: false + xy: 1501, 1742 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-1 + rotate: false + xy: 1501, 1580 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-2 + rotate: false + xy: 1501, 1418 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-3 + rotate: false + xy: 1501, 1256 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-4 + rotate: false + xy: 1501, 1094 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-5 + rotate: false + xy: 1595, 932 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-6 + rotate: false + xy: 1585, 770 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-7 + rotate: false + xy: 1563, 608 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-6-0 + rotate: false + xy: 1153, 2228 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-1 + rotate: false + xy: 1347, 2228 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-2 + rotate: false + xy: 1113, 2034 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-3 + rotate: false + xy: 1113, 1840 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-4 + rotate: false + xy: 1307, 2034 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-5 + rotate: false + xy: 1113, 1646 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-6 + rotate: false + xy: 1307, 1840 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-7 + rotate: false + xy: 1113, 1452 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-7-0 + rotate: false + xy: 3063, 3581 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-1 + rotate: false + xy: 3289, 3581 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-2 + rotate: false + xy: 3515, 3581 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-3 + rotate: false + xy: 3741, 3581 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-4 + rotate: false + xy: 1627, 3307 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-5 + rotate: false + xy: 1853, 3307 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-6 + rotate: false + xy: 2079, 3307 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-7 + rotate: false + xy: 2305, 3307 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-8-0 + rotate: false + xy: 573, 867 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-1 + rotate: false + xy: 573, 609 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-2 + rotate: false + xy: 573, 351 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-3 + rotate: false + xy: 573, 93 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-4 + rotate: false + xy: 1127, 3437 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-5 + rotate: false + xy: 805, 3115 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-6 + rotate: false + xy: 758, 2857 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-7 + rotate: false + xy: 725, 2599 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-9-0 + rotate: false + xy: 2495, 3807 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-1 + rotate: false + xy: 1, 943 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-2 + rotate: false + xy: 2785, 3807 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-3 + rotate: false + xy: 1, 653 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-4 + rotate: false + xy: 3075, 3807 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-5 + rotate: false + xy: 1, 363 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-6 + rotate: false + xy: 3365, 3807 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-7 + rotate: false + xy: 1, 73 + size: 288, 288 + orig: 288, 288 offset: 0, 0 index: -1 crawler-leg rotate: false - xy: 3899, 747 + xy: 1604, 3007 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -dagger +crawler-outline rotate: false - xy: 3487, 689 + xy: 1554, 2907 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -dagger-base +crawler-wreck0 rotate: false - xy: 3537, 689 + xy: 1604, 2957 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +crawler-wreck1 + rotate: false + xy: 1554, 2857 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-wreck2 + rotate: false + xy: 1604, 2907 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +cyclone + rotate: false + xy: 2217, 2839 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 dagger-leg rotate: false - xy: 3587, 689 + xy: 2893, 2113 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -eclipse +dagger-outline rotate: false - xy: 1, 1377 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -eclipse-cell - rotate: false - xy: 356, 1727 - 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: 3371, 573 + xy: 3941, 2523 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -fortress +dagger-wreck0 rotate: false - xy: 1325, 547 - size: 100, 80 - orig: 100, 80 + xy: 3991, 2523 + size: 48, 48 + orig: 48, 48 offset: 0, 0 index: -1 -fortress-base +dagger-wreck1 rotate: false - xy: 3127, 433 - size: 64, 64 - orig: 64, 64 + xy: 3941, 2473 + size: 48, 48 + orig: 48, 48 offset: 0, 0 index: -1 -fortress-cell +dagger-wreck2 rotate: false - xy: 1557, 629 - size: 100, 80 - orig: 100, 80 + xy: 3991, 2473 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +duo + rotate: false + xy: 2395, 1740 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +eclipse-outline + rotate: false + xy: 1, 2167 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +eclipse-wreck0 + rotate: false + xy: 403, 2621 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +eclipse-wreck1 + rotate: false + xy: 1529, 3775 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +eclipse-wreck2 + rotate: false + xy: 1, 1845 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +eruption-outline + rotate: false + xy: 3401, 2421 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flamethrower-outline + rotate: false + xy: 3469, 2364 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flare-outline + rotate: false + xy: 3551, 2437 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck0 + rotate: false + xy: 3601, 2437 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck1 + rotate: false + xy: 3651, 2439 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flare-wreck2 + rotate: false + xy: 3701, 2439 + size: 48, 48 + orig: 48, 48 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 4015, 1447 + xy: 91, 11 size: 80, 60 orig: 80, 60 offset: 0, 0 index: -1 -gamma +fortress-outline rotate: false - xy: 3365, 54 - size: 56, 56 - orig: 56, 56 + xy: 1777, 1114 + size: 100, 80 + orig: 100, 80 offset: 0, 0 index: -1 -gamma-cell +fortress-wreck0 rotate: false - xy: 229, 13 - size: 56, 56 - orig: 56, 56 + xy: 1879, 1114 + size: 100, 80 + orig: 100, 80 offset: 0, 0 index: -1 -horizon +fortress-wreck1 rotate: false - xy: 2505, 893 + xy: 3783, 2997 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-wreck2 + rotate: false + xy: 3783, 2915 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fuse + rotate: false + xy: 3295, 2729 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +gamma-outline + rotate: false + xy: 1981, 1129 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-wreck0 + rotate: false + xy: 2208, 1994 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-wreck1 + rotate: false + xy: 2208, 1924 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-wreck2 + rotate: false + xy: 2208, 1854 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +hail + rotate: false + xy: 2327, 1638 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +heal-shotgun-weapon-outline + rotate: false + xy: 2907, 2267 + size: 50, 50 + orig: 50, 50 + offset: 0, 0 + index: -1 +heal-weapon-mount-outline + rotate: false + xy: 3569, 2387 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +heal-weapon-outline + rotate: false + xy: 3619, 2387 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +horizon-outline + rotate: false + xy: 1641, 48 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -horizon-cell +horizon-wreck0 rotate: false - xy: 2893, 538 + xy: 3753, 3123 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 -mace +horizon-wreck1 rotate: false - xy: 3127, 367 + xy: 323, 2341 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-wreck2 + rotate: false + xy: 1947, 1783 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +item-blast-compound-large + rotate: false + xy: 3753, 3081 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-blast-compound-medium + rotate: false + xy: 2395, 1672 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-blast-compound-small + rotate: false + xy: 693, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-blast-compound-tiny + rotate: false + xy: 2245, 2450 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-blast-compound-xlarge + rotate: false + xy: 3669, 2389 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-coal-large + rotate: false + xy: 245, 31 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-coal-medium + rotate: false + xy: 2327, 1570 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-coal-small + rotate: false + xy: 1601, 3441 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-coal-tiny + rotate: false + xy: 1685, 3147 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-coal-xlarge + rotate: false + xy: 3719, 2389 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-copper-large + rotate: false + xy: 1992, 1863 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-copper-medium + rotate: false + xy: 2395, 1638 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-copper-small + rotate: false + xy: 2289, 2273 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-copper-tiny + rotate: false + xy: 2019, 1199 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-copper-xlarge + rotate: false + xy: 3769, 2389 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-graphite-large + rotate: false + xy: 2703, 2539 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-graphite-medium + rotate: false + xy: 2327, 1536 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-graphite-small + rotate: false + xy: 719, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-graphite-tiny + rotate: false + xy: 1569, 3307 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-graphite-xlarge + rotate: false + xy: 3801, 2439 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-lead-large + rotate: false + xy: 3026, 1739 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-lead-medium + rotate: false + xy: 2395, 1604 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-lead-small + rotate: false + xy: 1601, 3415 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-lead-tiny + rotate: false + xy: 1685, 3129 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-lead-xlarge + rotate: false + xy: 3819, 2389 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-metaglass-large + rotate: false + xy: 758, 3209 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-metaglass-medium + rotate: false + xy: 2327, 1502 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-metaglass-small + rotate: false + xy: 745, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-metaglass-tiny + rotate: false + xy: 1685, 3111 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-metaglass-xlarge + rotate: false + xy: 3519, 2337 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-phase-fabric-large + rotate: false + xy: 758, 3167 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-phase-fabric-medium + rotate: false + xy: 2395, 1570 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-phase-fabric-small + rotate: false + xy: 1601, 3389 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-phase-fabric-tiny + rotate: false + xy: 1151, 2625 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-phase-fabric-xlarge + rotate: false + xy: 3569, 2337 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-plastanium-large + rotate: false + xy: 758, 3125 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-plastanium-medium + rotate: false + xy: 2361, 1502 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-plastanium-small + rotate: false + xy: 771, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-plastanium-tiny + rotate: false + xy: 1169, 2625 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-plastanium-xlarge + rotate: false + xy: 3619, 2337 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-pyratite-large + rotate: false + xy: 1641, 6 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-pyratite-medium + rotate: false + xy: 2429, 1570 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-pyratite-small + rotate: false + xy: 1601, 3363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-pyratite-tiny + rotate: false + xy: 2037, 1199 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-pyratite-xlarge + rotate: false + xy: 3669, 2339 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-sand-large + rotate: false + xy: 1033, 2601 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-sand-medium + rotate: false + xy: 2429, 1536 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-sand-small + rotate: false + xy: 797, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-sand-tiny + rotate: false + xy: 1187, 2625 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-sand-xlarge + rotate: false + xy: 3719, 2339 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-scrap-large + rotate: false + xy: 1075, 2601 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-scrap-medium + rotate: false + xy: 2327, 1468 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-scrap-small + rotate: false + xy: 1601, 3337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-scrap-tiny + rotate: false + xy: 4079, 2653 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-scrap-xlarge + rotate: false + xy: 3769, 2339 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-silicon-large + rotate: false + xy: 1659, 3065 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-silicon-medium + rotate: false + xy: 2395, 1468 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-silicon-small + rotate: false + xy: 823, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-silicon-tiny + rotate: false + xy: 4079, 2635 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-silicon-xlarge + rotate: false + xy: 3819, 2339 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-spore-pod-large + rotate: false + xy: 3026, 1697 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-spore-pod-medium + rotate: false + xy: 2497, 1702 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod-small + rotate: false + xy: 849, 2331 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-spore-pod-tiny + rotate: false + xy: 4079, 2617 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-spore-pod-xlarge + rotate: false + xy: 2965, 2279 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-surge-alloy-large + rotate: false + xy: 3068, 1739 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-surge-alloy-medium + rotate: false + xy: 2531, 1702 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-surge-alloy-small + rotate: false + xy: 3851, 2473 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-surge-alloy-tiny + rotate: false + xy: 4079, 2599 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-surge-alloy-xlarge + rotate: false + xy: 2943, 2167 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-thorium-large + rotate: false + xy: 3068, 1697 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-thorium-medium + rotate: false + xy: 2497, 1668 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-thorium-small + rotate: false + xy: 1601, 3311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-thorium-tiny + rotate: false + xy: 4079, 2581 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-thorium-xlarge + rotate: false + xy: 2943, 2117 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-titanium-large + rotate: false + xy: 1659, 3023 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-titanium-medium + rotate: false + xy: 2463, 1600 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-titanium-small + rotate: false + xy: 725, 2917 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-titanium-tiny + rotate: false + xy: 693, 2603 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-titanium-xlarge + rotate: false + xy: 2957, 2217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +lancer + rotate: false + xy: 2612, 2000 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -mace-base +large-artillery-outline rotate: false - xy: 3193, 367 - size: 64, 64 - orig: 64, 64 + xy: 2993, 2081 + size: 48, 66 + orig: 48, 66 offset: 0, 0 index: -1 -mace-cell +large-bullet-mount-outline rotate: false - xy: 3259, 367 - size: 64, 64 - orig: 64, 64 + xy: 2243, 2064 + size: 70, 97 + orig: 70, 97 + offset: 0, 0 + index: -1 +large-laser-mount-outline + rotate: false + xy: 1657, 2535 + size: 96, 192 + orig: 96, 192 + offset: 0, 0 + index: -1 +large-purple-mount-outline + rotate: false + xy: 1992, 1905 + size: 70, 97 + orig: 70, 97 + offset: 0, 0 + index: -1 +large-weapon-outline + rotate: false + xy: 2993, 2031 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-cryofluid-large + rotate: false + xy: 1654, 2981 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-cryofluid-medium + rotate: false + xy: 2463, 1566 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-cryofluid-small + rotate: false + xy: 2495, 3781 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-cryofluid-tiny + rotate: false + xy: 1229, 876 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-cryofluid-xlarge + rotate: false + xy: 3219, 2333 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-oil-large + rotate: false + xy: 1654, 2939 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-oil-medium + rotate: false + xy: 2565, 1668 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-oil-small + rotate: false + xy: 2595, 3539 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-oil-tiny + rotate: false + xy: 1401, 786 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-oil-xlarge + rotate: false + xy: 3269, 2333 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-slag-large + rotate: false + xy: 1654, 2897 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-slag-medium + rotate: false + xy: 2667, 1702 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-slag-small + rotate: false + xy: 983, 2831 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-slag-tiny + rotate: false + xy: 3547, 3341 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-slag-xlarge + rotate: false + xy: 3319, 2321 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-water-large + rotate: false + xy: 1654, 2855 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-water-medium + rotate: false + xy: 2565, 1600 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-water-small + rotate: false + xy: 1353, 3411 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-water-tiny + rotate: false + xy: 3945, 3863 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-water-xlarge + rotate: false + xy: 3369, 2321 + size: 48, 48 + orig: 48, 48 offset: 0, 0 index: -1 mace-leg rotate: false - xy: 2929, 340 + xy: 2546, 1736 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -mega +mace-outline rotate: false - xy: 1761, 609 + xy: 2612, 1736 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck0 + rotate: false + xy: 2617, 2466 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck1 + rotate: false + xy: 2617, 2400 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-wreck2 + rotate: false + xy: 2637, 2532 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mass-driver + rotate: false + xy: 2119, 2741 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mega-outline + rotate: false + xy: 3987, 2875 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -mega-cell +mega-wreck0 rotate: false - xy: 1761, 507 + xy: 3885, 2773 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 -minke +mega-wreck1 rotate: false - xy: 1097, 661 + xy: 3987, 2773 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-wreck2 + rotate: false + xy: 3783, 2711 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +meltdown + rotate: false + xy: 2873, 2827 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -minke-cell +minke-outline rotate: false - xy: 1065, 531 - size: 128, 128 - orig: 128, 128 + xy: 2173, 2344 + size: 88, 101 + orig: 88, 101 offset: 0, 0 index: -1 -mono +minke-wreck0 rotate: false - xy: 3591, 539 + xy: 2263, 2365 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-wreck1 + rotate: false + xy: 2083, 2278 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-wreck2 + rotate: false + xy: 1993, 2278 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +missiles-mount-outline + rotate: false + xy: 3519, 2287 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -mono-cell +mono-outline rotate: false - xy: 3491, 389 + xy: 3669, 2289 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -nova +mono-wreck0 rotate: false - xy: 2469, 238 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -nova-base - rotate: false - xy: 3641, 489 + xy: 3719, 2289 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -nova-cell +mono-wreck1 rotate: false - xy: 2469, 180 - size: 56, 56 - orig: 56, 56 + xy: 3769, 2289 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-wreck2 + rotate: false + xy: 3819, 2289 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-purple-weapon-outline + rotate: false + xy: 2876, 2013 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-weapon-outline + rotate: false + xy: 2876, 1913 + size: 48, 48 + orig: 48, 48 offset: 0, 0 index: -1 nova-leg rotate: false - xy: 3691, 539 + xy: 2876, 1813 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -poly +nova-outline rotate: false - xy: 405, 29 + xy: 1627, 3107 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 -poly-cell +nova-wreck0 rotate: false - xy: 3331, 789 + xy: 3590, 2487 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 -power-cell +nova-wreck1 rotate: false - xy: 3563, 789 + xy: 3648, 2489 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 -pulsar +nova-wreck2 rotate: false - xy: 549, 489 - size: 58, 48 - orig: 58, 48 + xy: 3706, 2489 + size: 56, 56 + orig: 56, 56 offset: 0, 0 index: -1 -pulsar-base +oct-outline rotate: false - xy: 3591, 389 - size: 48, 48 - orig: 48, 48 + xy: 403, 3695 + size: 400, 400 + orig: 400, 400 offset: 0, 0 index: -1 -pulsar-cell +oct-wreck0 rotate: false - xy: 1065, 481 - size: 58, 48 - orig: 58, 48 + xy: 1, 2891 + size: 400, 400 + orig: 400, 400 offset: 0, 0 index: -1 -pulsar-leg +oct-wreck1 rotate: false - xy: 2573, 298 + xy: 403, 3293 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-wreck2 + rotate: false + xy: 805, 3695 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +omura-cannon-outline + rotate: false + xy: 1057, 894 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 +omura-outline + rotate: false + xy: 291, 545 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-wreck0 + rotate: false + xy: 291, 143 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-wreck1 + rotate: false + xy: 613, 1929 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-wreck2 + rotate: false + xy: 613, 1527 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +parallax + rotate: false + xy: 2645, 2132 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -quasar +poly-outline rotate: false - xy: 2647, 612 - size: 80, 80 - orig: 80, 80 + xy: 3825, 2499 + size: 56, 56 + orig: 56, 56 offset: 0, 0 index: -1 -quasar-base +poly-wreck0 rotate: false - xy: 2647, 530 - size: 80, 80 - orig: 80, 80 + xy: 3883, 2477 + size: 56, 56 + orig: 56, 56 offset: 0, 0 index: -1 -quasar-cell +poly-wreck1 rotate: false - xy: 2729, 612 - size: 80, 80 - orig: 80, 80 + xy: 2791, 2375 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-wreck2 + rotate: false + xy: 2791, 2317 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +pulsar-leg + rotate: false + xy: 2744, 1806 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pulsar-outline + rotate: false + xy: 2278, 2004 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck0 + rotate: false + xy: 2278, 1944 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck1 + rotate: false + xy: 2278, 1884 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-wreck2 + rotate: false + xy: 2278, 1824 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +quad-outline + rotate: false + xy: 831, 7 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck0 + rotate: false + xy: 2757, 3343 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck1 + rotate: false + xy: 2979, 3359 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-wreck2 + rotate: false + xy: 3201, 3359 + size: 220, 220 + orig: 220, 220 offset: 0, 0 index: -1 quasar-leg rotate: false - xy: 2729, 530 + xy: 2161, 2180 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 -risso +quasar-outline rotate: false - xy: 2873, 869 + xy: 1915, 2103 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck0 + rotate: false + xy: 1997, 2114 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck1 + rotate: false + xy: 2079, 2114 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-wreck2 + rotate: false + xy: 1910, 2021 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +reign-leg + rotate: false + xy: 1663, 1342 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +reign-outline + rotate: false + xy: 1353, 3183 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-weapon-outline + rotate: false + xy: 1825, 1855 + size: 83, 138 + orig: 83, 138 + offset: 0, 0 + index: -1 +reign-wreck0 + rotate: false + xy: 1569, 3165 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck1 + rotate: false + xy: 1785, 3165 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-wreck2 + rotate: false + xy: 2001, 3165 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +repair-point + rotate: false + xy: 2021, 1455 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ripple + rotate: false + xy: 1755, 2545 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -risso-cell +risso-outline rotate: false - xy: 2873, 771 - size: 96, 96 - orig: 96, 96 + xy: 2064, 1954 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 -spiroct +risso-wreck0 rotate: false - xy: 2255, 485 - size: 94, 75 - orig: 94, 75 + xy: 2136, 2018 + size: 70, 78 + orig: 70, 78 offset: 0, 0 index: -1 -spiroct-cell +risso-wreck1 rotate: false - xy: 2579, 694 - size: 94, 75 - orig: 94, 75 + xy: 2136, 1938 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +risso-wreck2 + rotate: false + xy: 2064, 1874 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +salvo + rotate: false + xy: 2810, 1872 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scatter + rotate: false + xy: 2769, 2565 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scepter-leg + rotate: false + xy: 3523, 2937 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +vela-leg + rotate: false + xy: 3523, 2937 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scepter-outline + rotate: false + xy: 1251, 946 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-weapon-outline + rotate: false + xy: 2849, 2271 + size: 56, 102 + orig: 56, 102 + offset: 0, 0 + index: -1 +scepter-wreck0 + rotate: false + xy: 1057, 610 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck1 + rotate: false + xy: 1053, 468 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-wreck2 + rotate: false + xy: 1053, 326 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scorch + rotate: false + xy: 2019, 1251 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +segment + rotate: false + xy: 3099, 2565 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +sei-launcher-outline + rotate: false + xy: 1910, 1857 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +sei-outline + rotate: false + xy: 1627, 3533 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck0 + rotate: false + xy: 1869, 3533 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck1 + rotate: false + xy: 2111, 3533 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-wreck2 + rotate: false + xy: 2353, 3533 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +small-basic-weapon-outline + rotate: false + xy: 2926, 1967 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +small-mount-weapon-outline + rotate: false + xy: 2926, 1867 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spectre + rotate: false + xy: 3523, 2807 + size: 128, 128 + orig: 128, 128 offset: 0, 0 index: -1 spiroct-foot rotate: false - xy: 3431, 165 + xy: 2805, 2827 size: 46, 46 orig: 46, 46 offset: 0, 0 index: -1 spiroct-joint rotate: false - xy: 3909, 305 + xy: 2395, 1434 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spiroct-leg rotate: false - xy: 2189, 778 + xy: 983, 2607 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 spiroct-leg-base rotate: false - xy: 2085, 350 + xy: 3967, 3585 size: 48, 34 orig: 48, 34 offset: 0, 0 index: -1 +spiroct-outline + rotate: false + xy: 2343, 2566 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-weapon-outline + rotate: false + xy: 2976, 1865 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +spiroct-wreck0 + rotate: false + xy: 2245, 2468 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-wreck1 + rotate: false + xy: 2537, 2664 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-wreck2 + rotate: false + xy: 1801, 2370 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +splash-0 + rotate: false + xy: 2429, 1434 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-1 + rotate: false + xy: 2463, 1430 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-10 + rotate: false + xy: 2089, 1432 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-11 + rotate: false + xy: 2053, 1398 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-2 + rotate: false + xy: 2497, 1430 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-3 + rotate: false + xy: 2531, 1430 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-4 + rotate: false + xy: 2565, 1430 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-5 + rotate: false + xy: 2599, 1430 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-6 + rotate: false + xy: 2633, 1430 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-7 + rotate: false + xy: 2667, 1430 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-8 + rotate: false + xy: 2701, 1430 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-9 + rotate: false + xy: 2055, 1432 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +swarmer + rotate: false + xy: 3013, 2499 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +toxopid-cannon-outline + rotate: false + xy: 1232, 2625 + size: 206, 220 + orig: 206, 220 + offset: 0, 0 + index: -1 +toxopid-foot + rotate: false + xy: 599, 1 + size: 90, 90 + orig: 90, 90 + offset: 0, 0 + index: -1 +toxopid-leg + rotate: false + xy: 3945, 4023 + size: 150, 72 + orig: 150, 72 + offset: 0, 0 + index: -1 +toxopid-leg-base + rotate: false + xy: 1207, 3709 + size: 270, 64 + orig: 270, 64 + offset: 0, 0 + index: -1 +toxopid-outline + rotate: false + xy: 1721, 224 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck0 + rotate: false + xy: 1721, 32 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck1 + rotate: false + xy: 1541, 2230 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-wreck2 + rotate: false + xy: 1663, 2038 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +unit-alpha-full + rotate: false + xy: 2976, 1815 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-antumbra-full + rotate: false + xy: 895, 1389 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +unit-arkyid-full + rotate: false + xy: 3653, 2807 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +unit-atrax-full + rotate: false + xy: 1801, 2238 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +unit-beta-full + rotate: false + xy: 2907, 2377 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +unit-bryde-full + rotate: false + xy: 3689, 3197 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +unit-corvus-full + rotate: false + xy: 2217, 3165 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +unit-crawler-full + rotate: false + xy: 2976, 1765 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-dagger-full + rotate: false + xy: 2876, 1713 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-eclipse-full + rotate: false + xy: 1851, 3775 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +unit-flare-full + rotate: false + xy: 2926, 1717 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-fortress-full + rotate: false + xy: 3885, 2691 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +unit-gamma-full + rotate: false + xy: 2441, 2594 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +unit-horizon-full + rotate: false + xy: 1947, 1487 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +unit-mace-full + rotate: false + xy: 3145, 2499 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-mega-full + rotate: false + xy: 3987, 2671 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +unit-minke-full + rotate: false + xy: 1825, 2135 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +unit-mono-full + rotate: false + xy: 2976, 1715 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-nova-full + rotate: false + xy: 2849, 2213 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-oct-full + rotate: false + xy: 1, 2489 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +unit-omura-full + rotate: false + xy: 605, 1125 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +unit-poly-full + rotate: false + xy: 2907, 2319 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-pulsar-full + rotate: false + xy: 2511, 2604 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +unit-quad-full + rotate: false + xy: 3423, 3359 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +unit-quasar-full + rotate: false + xy: 2161, 2098 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +unit-reign-full + rotate: false + xy: 2433, 3165 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +unit-risso-full + rotate: false + xy: 2136, 1858 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +unit-scepter-full + rotate: false + xy: 1053, 184 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +unit-sei-full + rotate: false + xy: 2595, 3565 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +unit-spiroct-full + rotate: false + xy: 1897, 2370 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +unit-toxopid-full + rotate: false + xy: 1663, 1846 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +unit-vela-full + rotate: false + xy: 1053, 42 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +unit-zenith-full + rotate: false + xy: 1279, 3069 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +vault-team-crux + rotate: false + xy: 2245, 2545 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vault-team-sharded + rotate: false + xy: 2147, 2447 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vela-outline + rotate: false + xy: 1229, 520 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck0 + rotate: false + xy: 1225, 236 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck1 + rotate: false + xy: 1225, 94 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-wreck2 + rotate: false + xy: 1423, 946 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +wave + rotate: false + xy: 3211, 2433 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +zenith-missiles-outline + rotate: false + xy: 3026, 1781 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +zenith-outline + rotate: false + xy: 1663, 1102 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck0 + rotate: false + xy: 1527, 8 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck1 + rotate: false + xy: 1440, 2955 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +zenith-wreck2 + rotate: false + xy: 1440, 2841 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +item-blast-compound + rotate: false + xy: 2361, 1638 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-coal + rotate: false + xy: 2429, 1706 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-copper + rotate: false + xy: 2361, 1604 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-graphite + rotate: false + xy: 2429, 1672 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-lead + rotate: false + xy: 2361, 1570 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-metaglass + rotate: false + xy: 2429, 1638 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-phase-fabric + rotate: false + xy: 2361, 1536 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-plastanium + rotate: false + xy: 2429, 1604 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-pyratite + rotate: false + xy: 2395, 1536 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-sand + rotate: false + xy: 2395, 1502 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-scrap + rotate: false + xy: 2429, 1502 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-silicon + rotate: false + xy: 2361, 1468 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod + rotate: false + xy: 2463, 1702 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-surge-alloy + rotate: false + xy: 2463, 1668 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-thorium + rotate: false + xy: 2463, 1634 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-titanium + rotate: false + xy: 2565, 1702 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-cryofluid + rotate: false + xy: 2599, 1702 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-oil + rotate: false + xy: 2531, 1634 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-slag + rotate: false + xy: 2599, 1668 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-water + rotate: false + xy: 2531, 1566 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +blank + rotate: false + xy: 1947, 1196 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +circle + rotate: false + xy: 1153, 2422 + size: 201, 201 + orig: 201, 201 + offset: 0, 0 + index: -1 +shape-3 + rotate: false + xy: 3409, 2480 + size: 63, 63 + orig: 63, 63 + offset: 0, 0 + index: -1 +alpha + rotate: false + xy: 1063, 3211 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-cell + rotate: false + xy: 2965, 2329 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +antumbra + rotate: false + xy: 3645, 3339 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +antumbra-cell + rotate: false + xy: 3863, 3339 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +arkyid + rotate: false + xy: 3967, 3751 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +arkyid-cell + rotate: false + xy: 3967, 3621 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +atrax + rotate: false + xy: 1, 7 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +atrax-base + rotate: false + xy: 2805, 2875 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +atrax-cell + rotate: false + xy: 1001, 1181 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +beta + rotate: false + xy: 3825, 2557 + size: 56, 54 + orig: 56, 54 + offset: 0, 0 + index: -1 +beta-cell + rotate: false + xy: 3219, 2383 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +bryde + rotate: false + xy: 3945, 3881 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +bryde-cell + rotate: false + xy: 2979, 3217 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +corvus + rotate: false + xy: 291, 1 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-base + rotate: false + xy: 1663, 1720 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +corvus-cell + rotate: false + xy: 887, 1247 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +corvus-weapon-heat + rotate: false + xy: 1063, 3069 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +crawler + rotate: false + xy: 1609, 3057 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-base + rotate: false + xy: 1554, 3007 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-cell + rotate: false + xy: 1554, 2957 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger + rotate: false + xy: 3369, 2371 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-base + rotate: false + xy: 2893, 2163 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +eclipse + rotate: false + xy: 805, 3373 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +eclipse-cell + rotate: false + xy: 1207, 3775 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +flare + rotate: false + xy: 3501, 2437 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +fortress + rotate: false + xy: 2649, 3225 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-base + rotate: false + xy: 2593, 2264 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +fortress-cell + rotate: false + xy: 1225, 12 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +gamma + rotate: false + xy: 1327, 24 + size: 68, 68 + orig: 68, 68 + offset: 0, 0 + index: -1 +gamma-cell + rotate: false + xy: 3532, 2487 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +horizon + rotate: false + xy: 2633, 2667 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +horizon-cell + rotate: false + xy: 323, 2415 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +mace + rotate: false + xy: 2348, 1774 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-base + rotate: false + xy: 2414, 1774 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-cell + rotate: false + xy: 2480, 1736 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mega + rotate: false + xy: 3885, 2875 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +mega-cell + rotate: false + xy: 3987, 2977 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +minke + rotate: false + xy: 1891, 2267 + size: 88, 101 + orig: 88, 101 + offset: 0, 0 + index: -1 +minke-cell + rotate: false + xy: 3133, 2827 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +mono + rotate: false + xy: 3569, 2287 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mono-cell + rotate: false + xy: 3619, 2287 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova + rotate: false + xy: 3343, 2421 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +nova-base + rotate: false + xy: 2876, 1863 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +nova-cell + rotate: false + xy: 1569, 3107 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +oct + rotate: false + xy: 1, 3695 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +oct-cell + rotate: false + xy: 1, 3293 + size: 400, 400 + orig: 400, 400 + offset: 0, 0 + index: -1 +omura + rotate: false + xy: 323, 1349 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +omura-cannon-heat + rotate: false + xy: 1113, 1173 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 +omura-cell + rotate: false + xy: 291, 947 + size: 280, 400 + orig: 280, 400 + offset: 0, 0 + index: -1 +poly + rotate: false + xy: 3764, 2489 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +poly-cell + rotate: false + xy: 3883, 2535 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +power-cell + rotate: false + xy: 2849, 2375 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +pulsar + rotate: false + xy: 2649, 3165 + size: 68, 58 + orig: 68, 58 + offset: 0, 0 + index: -1 +pulsar-base + rotate: false + xy: 2876, 1763 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +pulsar-cell + rotate: false + xy: 507, 93 + size: 58, 48 + orig: 58, 48 + offset: 0, 0 + index: -1 +quad + rotate: false + xy: 831, 451 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quad-cell + rotate: false + xy: 831, 229 + size: 220, 220 + orig: 220, 220 + offset: 0, 0 + index: -1 +quasar + rotate: false + xy: 1915, 2185 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-base + rotate: false + xy: 1997, 2196 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +quasar-cell + rotate: false + xy: 2079, 2196 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +reign + rotate: false + xy: 1385, 3325 + size: 214, 140 + orig: 214, 140 + offset: 0, 0 + index: -1 +reign-base + rotate: false + xy: 1663, 1594 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +reign-cell + rotate: false + xy: 1663, 1468 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +risso + rotate: false + xy: 2064, 2034 + size: 70, 78 + orig: 70, 78 + offset: 0, 0 + index: -1 +risso-cell + rotate: false + xy: 1755, 2447 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scepter + rotate: false + xy: 1057, 752 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +scepter-base + rotate: false + xy: 3263, 2827 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +vela-base + rotate: false + xy: 3263, 2827 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scepter-cell + rotate: false + xy: 3393, 2937 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +sei + rotate: false + xy: 693, 2357 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +sei-cell + rotate: false + xy: 1385, 3467 + size: 240, 240 + orig: 240, 240 + offset: 0, 0 + index: -1 +spiroct + rotate: false + xy: 3687, 2730 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +spiroct-cell + rotate: false + xy: 2441, 2664 + size: 94, 75 + orig: 94, 75 + offset: 0, 0 + index: -1 +toxopid + rotate: false + xy: 1725, 416 + size: 160, 190 + orig: 160, 190 + offset: 0, 0 + index: -1 +toxopid-cannon + rotate: false + xy: 1232, 2847 + size: 206, 220 + orig: 206, 220 + offset: 0, 0 + index: -1 +toxopid-cell + rotate: false + xy: 1663, 1216 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 vanguard rotate: false - xy: 3691, 339 + xy: 3026, 1981 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 vanguard-cell rotate: false - xy: 3741, 331 + xy: 3026, 1931 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -antumbra-missiles +vela rotate: false - xy: 3299, 735 - size: 48, 48 - orig: 48, 48 + xy: 1251, 804 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-cell + rotate: false + xy: 1229, 662 + size: 170, 140 + orig: 170, 140 + offset: 0, 0 + index: -1 +vela-weapon-heat + rotate: false + xy: 1225, 378 + size: 170, 140 + orig: 170, 140 offset: 0, 0 index: -1 artillery rotate: false - xy: 3349, 731 + xy: 2647, 2609 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 artillery-mount rotate: false - xy: 2281, 386 + xy: 1947, 1343 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 beam-weapon rotate: false - xy: 4015, 1509 + xy: 691, 11 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 -chaos - rotate: false - xy: 2411, 158 - 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: 2495, 64 + xy: 4041, 2465 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flakgun rotate: false - xy: 2495, 14 + xy: 3419, 2371 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flamethrower rotate: false - xy: 3371, 623 + xy: 3451, 2422 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 heal-shotgun-weapon rotate: false - xy: 3391, 373 - size: 48, 48 - orig: 48, 48 + xy: 1507, 3069 + size: 50, 50 + orig: 50, 50 offset: 0, 0 index: -1 heal-weapon rotate: false - xy: 3391, 323 + xy: 3751, 2439 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 heal-weapon-mount rotate: false - xy: 3421, 631 + xy: 3519, 2387 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 large-artillery rotate: false - xy: 3441, 463 + xy: 2993, 2149 size: 48, 66 orig: 48, 66 offset: 0, 0 index: -1 large-bullet-mount rotate: false - xy: 2791, 431 + xy: 2243, 2163 size: 70, 97 orig: 70, 97 offset: 0, 0 index: -1 large-laser-mount rotate: false - xy: 2549, 496 + xy: 3589, 2613 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 +large-purple-mount + rotate: false + xy: 1992, 2004 + size: 70, 97 + orig: 70, 97 + offset: 0, 0 + index: -1 large-weapon rotate: false - xy: 3441, 413 + xy: 2943, 2067 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles rotate: false - xy: 3491, 439 + xy: 3419, 2321 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles-mount rotate: false - xy: 3541, 489 + xy: 3469, 2314 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-purple-weapon rotate: false - xy: 3541, 389 + xy: 2876, 2063 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-weapon rotate: false - xy: 3591, 439 + xy: 2876, 1963 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +omura-cannon + rotate: false + xy: 1307, 1367 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 +omura-cannon-heat + rotate: false + xy: 1307, 1088 + size: 192, 277 + orig: 192, 277 + offset: 0, 0 + index: -1 +reign-weapon + rotate: false + xy: 1825, 1995 + size: 83, 138 + orig: 83, 138 + offset: 0, 0 + index: -1 +scepter-weapon + rotate: false + xy: 2791, 2213 + size: 56, 102 + orig: 56, 102 + offset: 0, 0 + index: -1 +sei-launcher + rotate: false + xy: 1910, 1939 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 small-basic-weapon rotate: false - xy: 3741, 539 + xy: 2926, 2017 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-mount-weapon rotate: false - xy: 3641, 389 + xy: 2926, 1917 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-weapon rotate: false - xy: 3691, 439 + xy: 2926, 1817 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spiroct-weapon rotate: false - xy: 3741, 431 + xy: 2976, 1923 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 weapon rotate: false - xy: 3431, 263 + xy: 3026, 1881 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 zenith-missiles rotate: false - xy: 3431, 213 + xy: 3026, 1831 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 zenith rotate: false - xy: 1227, 677 + xy: 1393, 3069 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 zenith-cell rotate: false - xy: 115, 7 + xy: 887, 1133 size: 112, 112 orig: 112, 112 offset: 0, 0 @@ -6764,863 +7814,954 @@ 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: 2541, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-2-edge +basalt2 + rotate: false + xy: 101, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt3 + rotate: false + xy: 2575, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +char1 + rotate: false + xy: 135, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +char2 + rotate: false + xy: 2609, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +char3 + rotate: false + xy: 169, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cliff + rotate: false + xy: 2643, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +coal1 + rotate: false + xy: 203, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +coal2 + rotate: false + xy: 2677, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +coal3 + rotate: false + xy: 237, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper1 + rotate: false + xy: 2711, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper2 + rotate: false + xy: 271, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper3 + rotate: false + xy: 2745, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters1 + rotate: false + xy: 305, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters2 + rotate: false + xy: 2779, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters3 + rotate: false + xy: 339, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters4 + rotate: false + xy: 2813, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters5 + rotate: false + xy: 373, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +craters6 + rotate: false + xy: 2847, 213 + 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 +dacite-wall-large rotate: false - xy: 441, 17 + xy: 1667, 83 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dacite-wall1 + rotate: false + xy: 2915, 213 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 +dacite-wall2 rotate: false xy: 475, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-5-edge +dacite1 rotate: false - xy: 197, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dark-panel-6 - rotate: false - xy: 2719, 213 + xy: 407, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dark-panel-6-edge +dacite2 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 + xy: 2881, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand-tainted-water-edge +dacite3 rotate: false - xy: 295, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -darksand-tainted-water1 - rotate: false - xy: 577, 17 + xy: 441, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand-tainted-water2 +dark-metal-large rotate: false - xy: 2821, 213 + xy: 1765, 181 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dark-metal1 + rotate: false + xy: 2949, 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 +dark-metal2 rotate: false xy: 509, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand2 +dark-panel-1 rotate: false - xy: 2753, 213 + xy: 2983, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -darksand3 +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: 543, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -deepwater +dark-panel-2-edge rotate: false - xy: 2923, 213 + xy: 99, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-3 + rotate: false + xy: 3017, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -deepwater-edge +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: 577, 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: 3051, 213 + 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: 611, 17 + 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: 679, 17 + 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 -dunerocks-large +darksand-tainted-water1 rotate: false - xy: 1667, 181 - size: 64, 64 - orig: 64, 64 + xy: 3153, 213 + size: 32, 32 + orig: 32, 32 offset: 0, 0 index: -1 -dunerocks1 +darksand-tainted-water2 rotate: false xy: 713, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -dunerocks2 +darksand-tainted-water3 rotate: false - xy: 2957, 213 + xy: 3187, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -edge +darksand-water rotate: false xy: 747, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -edge-stencil +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: 3221, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -grass-edge - rotate: false - xy: 491, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -grass1 +darksand-water2 rotate: false xy: 781, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -grass2 +darksand-water3 rotate: false - xy: 3025, 213 + xy: 3255, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -grass3 +darksand1 + rotate: false + xy: 3085, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand2 + rotate: false + xy: 645, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand3 + rotate: false + xy: 3119, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +deepwater rotate: false xy: 815, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -holostone-edge +deepwater-edge + rotate: false + xy: 491, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dirt-edge rotate: false xy: 589, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -holostone1 +dirt-wall-large rotate: false - xy: 3059, 213 - size: 32, 32 - orig: 32, 32 + xy: 1831, 181 + size: 64, 64 + orig: 64, 64 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 +dirt-wall1 rotate: false xy: 883, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -hotrock2 +dirt-wall2 rotate: false - xy: 3127, 213 + xy: 3357, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -hotrock3 +dirt1 + rotate: false + xy: 3289, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt2 + rotate: false + xy: 849, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt3 + rotate: false + xy: 3323, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dune-wall-large + rotate: false + xy: 1897, 181 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dune-wall1 rotate: false xy: 917, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ice-edge +dune-wall2 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 + xy: 3391, 213 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 +edge rotate: false xy: 951, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ice3 +edge-stencil rotate: false - xy: 3195, 213 + xy: 589, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +edgier + rotate: false + xy: 3425, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icerocks-large +grass-edge rotate: false - xy: 1733, 181 - size: 64, 64 - orig: 64, 64 + xy: 687, 149 + size: 96, 96 + orig: 96, 96 offset: 0, 0 index: -1 -icerocks1 +grass1 rotate: false - xy: 3263, 213 + xy: 985, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -icerocks2 +grass2 + rotate: false + xy: 3459, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass3 + rotate: false + xy: 1019, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock1 + rotate: false + xy: 3493, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock2 rotate: false xy: 1053, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ignarock-edge +hotrock3 + rotate: false + xy: 3527, 213 + 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: 3595, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-snow2 + rotate: false + xy: 1155, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-snow3 + rotate: false + xy: 3629, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall-large + rotate: false + xy: 1963, 181 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +ice-wall1 + rotate: false + xy: 1189, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-wall2 + rotate: false + xy: 3663, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice1 + rotate: false + xy: 1087, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice2 + rotate: false + xy: 3561, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice3 + rotate: false + xy: 1121, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead1 + rotate: false + xy: 1223, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead2 + rotate: false + xy: 3697, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead3 rotate: false xy: 1257, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -metal-floor-3-edge +magmarock1 rotate: false - xy: 785, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-5 - rotate: false - xy: 3501, 213 + xy: 3731, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -metal-floor-5-edge - rotate: false - xy: 883, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-damaged-edge - rotate: false - xy: 883, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -metal-floor-damaged1 +magmarock2 rotate: false xy: 1291, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -metal-floor-damaged2 +magmarock3 rotate: false - xy: 3535, 213 + xy: 3765, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -metal-floor-damaged3 +metal-floor rotate: false xy: 1325, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -metal-floor-edge +metal-floor-2 rotate: false - xy: 981, 149 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -moss-edge - rotate: false - xy: 981, 51 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -moss1 - rotate: false - xy: 3569, 213 + xy: 3799, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -moss2 +metal-floor-2-edge + rotate: false + xy: 785, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-3 rotate: false xy: 1359, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -moss3 +metal-floor-3-edge rotate: false - xy: 3603, 213 + xy: 883, 149 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-5 + rotate: false + xy: 3833, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-coal1 +metal-floor-5-edge + rotate: false + xy: 883, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-damaged-edge + rotate: false + xy: 981, 149 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-damaged1 rotate: false xy: 1393, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-coal2 +metal-floor-damaged2 rotate: false - xy: 3637, 213 + xy: 3867, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-coal3 +metal-floor-damaged3 rotate: false xy: 1427, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-copper1 +metal-floor-edge rotate: false - xy: 3671, 213 + 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: 3901, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-copper2 +moss2 rotate: false xy: 1461, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-copper3 +moss3 rotate: false - xy: 3705, 213 + xy: 3935, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-lead1 +mud-edge + rotate: false + xy: 1079, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mud1 rotate: false xy: 1495, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-lead2 +mud2 rotate: false - xy: 3739, 213 + xy: 3969, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -ore-lead3 +mud3 rotate: false xy: 1529, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +ore-coal1 + rotate: false + xy: 4003, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-coal2 + rotate: false + xy: 1563, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-coal3 + rotate: false + xy: 4037, 213 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper1 + rotate: false + xy: 1597, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper2 + rotate: false + xy: 1631, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper3 + rotate: false + xy: 1667, 49 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead1 + rotate: false + xy: 1733, 115 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead2 + rotate: false + xy: 1701, 49 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead3 + rotate: false + xy: 1665, 15 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 ore-scrap1 rotate: false - xy: 3773, 213 + xy: 1699, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap2 rotate: false - xy: 3807, 213 + xy: 2491, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap3 rotate: false - xy: 3841, 213 + xy: 2541, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium1 rotate: false - xy: 3875, 213 + xy: 2575, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium2 rotate: false - xy: 3909, 213 + xy: 2609, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium3 rotate: false - xy: 3943, 213 + xy: 2643, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium1 rotate: false - xy: 3977, 213 + xy: 2677, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium2 rotate: false - xy: 4011, 213 + xy: 2711, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium3 rotate: false - xy: 4045, 213 + xy: 2745, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles1 rotate: false - xy: 1569, 49 + xy: 2779, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles2 rotate: false - xy: 1635, 115 + xy: 2813, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles3 rotate: false - xy: 1603, 49 + xy: 2847, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -7632,338 +8773,317 @@ 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: 2881, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-edge rotate: false - xy: 1079, 149 + xy: 1177, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -saltrocks-large +salt-wall-large rotate: false - xy: 1865, 181 + xy: 2029, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -saltrocks1 +salt-wall1 rotate: false - xy: 2311, 179 + xy: 2915, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -saltrocks2 +salt-wall2 rotate: false - xy: 2345, 179 + xy: 2949, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-edge rotate: false - xy: 1079, 51 + xy: 1177, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +sand-wall-large + rotate: false + xy: 2095, 181 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +sand-wall1 + rotate: false + xy: 3085, 179 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-wall2 + rotate: false + xy: 3119, 179 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 sand-water rotate: false - xy: 2481, 179 + xy: 3153, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-edge rotate: false - xy: 1177, 149 + xy: 1275, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sand-water1 rotate: false - xy: 2515, 179 + xy: 3187, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water2 rotate: false - xy: 2549, 179 + xy: 3221, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water3 rotate: false - xy: 2583, 179 + xy: 3255, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand1 rotate: false - xy: 2379, 179 + xy: 2983, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand2 rotate: false - xy: 2413, 179 + xy: 3017, 179 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: 3051, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap1 rotate: false - xy: 2685, 179 + xy: 3289, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap2 rotate: false - xy: 2719, 179 + xy: 3323, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap3 rotate: false - xy: 2753, 179 + xy: 3357, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-edge rotate: false - xy: 1177, 51 + xy: 1275, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +shale-wall-large + rotate: false + xy: 2161, 181 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +shale-wall1 + rotate: false + xy: 3493, 179 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-wall2 + rotate: false + xy: 3527, 179 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 shale1 rotate: false - xy: 2787, 179 + xy: 3391, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale2 rotate: false - xy: 2821, 179 + xy: 3425, 179 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: 3459, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-large rotate: false - xy: 2063, 181 + xy: 2227, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shrubs1 rotate: false - xy: 2957, 179 + xy: 3561, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs2 rotate: false - xy: 2991, 179 + xy: 3595, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag rotate: false - xy: 3025, 179 + xy: 3629, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-edge rotate: false - xy: 1275, 149 + xy: 1373, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-edge rotate: false - xy: 1275, 51 + xy: 1373, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-pine rotate: false - xy: 2261, 197 + xy: 2491, 197 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +snow-wall-large + rotate: false + xy: 2293, 181 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +snow-wall1 + rotate: false + xy: 3765, 179 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snow-wall2 + rotate: false + xy: 3799, 179 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 snow1 rotate: false - xy: 3059, 179 + xy: 3663, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow2 rotate: false - xy: 3093, 179 + xy: 3697, 179 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: 3731, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn rotate: false - xy: 3229, 179 + xy: 3833, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-edge rotate: false - xy: 1373, 149 + xy: 1471, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 spore-moss1 rotate: false - xy: 3263, 179 + xy: 3867, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss2 rotate: false - xy: 3297, 179 + xy: 3901, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss3 rotate: false - xy: 3331, 179 + xy: 3935, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -7975,156 +9095,177 @@ spore-pine orig: 48, 48 offset: 0, 0 index: -1 -sporerocks-large +spore-wall-large rotate: false - xy: 2195, 181 + xy: 2359, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks1 +spore-wall1 rotate: false - xy: 3365, 179 + xy: 3969, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -sporerocks2 +spore-wall2 rotate: false - xy: 3399, 179 + xy: 4003, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-edge rotate: false - xy: 1373, 51 + xy: 1471, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +stone-wall-large + rotate: false + xy: 2425, 181 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall1 + rotate: false + xy: 1801, 147 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone-wall2 + rotate: false + xy: 1835, 147 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 stone1 rotate: false - xy: 3433, 179 + xy: 4037, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone2 rotate: false - xy: 3467, 179 + xy: 1733, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone3 rotate: false - xy: 3501, 179 + xy: 1767, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water rotate: false - xy: 3535, 179 + xy: 1869, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-edge rotate: false - xy: 1471, 149 + xy: 1569, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tar rotate: false - xy: 3569, 179 + xy: 1903, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-edge rotate: false - xy: 1471, 51 + xy: 1569, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tendrils1 rotate: false - xy: 3603, 179 + xy: 1937, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils2 rotate: false - xy: 3637, 179 + xy: 1971, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils3 rotate: false - xy: 3671, 179 + xy: 2005, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 3705, 179 + xy: 2039, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 3739, 179 + xy: 2073, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 3773, 179 + xy: 2107, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 3807, 179 + xy: 2141, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 3841, 179 + xy: 2175, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 3875, 179 + xy: 2209, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water rotate: false - xy: 3909, 179 + xy: 2243, 147 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-edge rotate: false - xy: 1569, 149 + xy: 1667, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 @@ -8137,2149 +9278,2233 @@ 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: 305, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-icon-editor rotate: false - xy: 3897, 355 + xy: 339, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +basalt-icon-editor + rotate: false + xy: 373, 17 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt1 + rotate: false + xy: 373, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-icon-editor rotate: false - xy: 1119, 227 + xy: 407, 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: 3931, 355 + xy: 441, 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: 3817, 355 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 bridge-conduit-icon-editor rotate: false - xy: 3965, 355 + xy: 475, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 163, 1 + xy: 509, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 197, 1 + xy: 553, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 197, 1 + xy: 553, 49 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: 231, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliffs-icon-editor - rotate: false - xy: 265, 1 + xy: 587, 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: 299, 1 + xy: 651, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 command-center-icon-editor rotate: false - xy: 553, 1 + xy: 1619, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conduit-icon-editor rotate: false - xy: 333, 1 + xy: 685, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 651, 33 + xy: 1685, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 367, 1 + xy: 719, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 401, 1 + xy: 753, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 717, 33 + 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: 435, 1 + xy: 787, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters1 rotate: false - xy: 435, 1 + xy: 787, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cryofluidmixer-icon-editor rotate: false - xy: 783, 33 + xy: 1817, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 849, 33 + 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: 3867, 355 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dacite-icon-editor + rotate: false + xy: 821, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite1 + rotate: false + xy: 821, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dacite-wall-icon-editor + rotate: false + xy: 855, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 dark-metal-icon-editor rotate: false - xy: 469, 1 + xy: 889, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-editor rotate: false - xy: 503, 1 + xy: 1141, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-1 rotate: false - xy: 503, 1 + xy: 1141, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-editor rotate: false - xy: 915, 65 + xy: 1175, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-2 rotate: false - xy: 915, 65 + xy: 1175, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-editor rotate: false - xy: 915, 31 + xy: 1209, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-3 rotate: false - xy: 915, 31 + xy: 1209, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-editor rotate: false - xy: 945, 177 + xy: 1243, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-4 rotate: false - xy: 945, 177 + xy: 1243, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-editor rotate: false - xy: 945, 143 + xy: 1277, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-5 rotate: false - xy: 945, 143 + xy: 1277, 79 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-editor rotate: false - xy: 979, 177 + xy: 4029, 403 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-6 rotate: false - xy: 979, 177 + xy: 4029, 403 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-editor rotate: false - xy: 945, 109 + xy: 4063, 403 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand1 rotate: false - xy: 945, 109 + xy: 4063, 403 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-editor rotate: false - xy: 979, 143 + xy: 1357, 209 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-editor rotate: false - xy: 1013, 177 + xy: 1391, 209 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 979, 109 + xy: 1425, 209 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 979, 109 + xy: 1425, 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: 1013, 143 + xy: 1459, 209 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-icon-editor + rotate: false + xy: 1493, 209 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt1 + rotate: false + xy: 1493, 209 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dirt-wall-icon-editor + rotate: false + xy: 1311, 79 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: 1357, 193 + xy: 1949, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 1047, 177 + xy: 543, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 1423, 193 + xy: 2015, 307 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -dunerocks-icon-editor +dune-wall-icon-editor rotate: false - xy: 1013, 109 + xy: 577, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 1047, 143 + xy: 4017, 369 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt2 + rotate: false + xy: 4051, 369 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-basalt3 + rotate: false + xy: 3817, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 1047, 109 + xy: 3851, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 949, 75 + xy: 3885, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters2 rotate: false - xy: 949, 41 + xy: 3919, 321 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 983, 75 + xy: 3953, 321 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite2 + rotate: false + xy: 3987, 321 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dacite3 + rotate: false + xy: 4021, 335 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water1 rotate: false - xy: 1017, 41 + xy: 1337, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water2 rotate: false - xy: 1051, 75 + xy: 1371, 175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water3 rotate: false - xy: 1051, 41 + xy: 1371, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water1 rotate: false - xy: 3755, 305 + xy: 1405, 175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water2 rotate: false - xy: 3789, 305 + xy: 1405, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water3 rotate: false - xy: 3823, 305 + xy: 1439, 175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand2 rotate: false - xy: 983, 41 + xy: 4055, 335 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand3 rotate: false - xy: 1017, 75 + xy: 1337, 175 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt2 + rotate: false + xy: 1439, 141 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dirt3 + rotate: false + xy: 1473, 175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 3857, 313 + xy: 1473, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 3857, 313 + xy: 1473, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 1085, 193 + xy: 1507, 175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 1119, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone1 - rotate: false - xy: 1081, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-icon-editor - rotate: false - xy: 1081, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone2 - rotate: false - xy: 1081, 125 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-holostone3 - rotate: false - xy: 1115, 159 + xy: 1507, 141 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 1115, 125 + xy: 2147, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 1115, 125 + xy: 2147, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 1153, 193 + xy: 2147, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 1149, 159 + xy: 2181, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 1221, 193 + xy: 2249, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 1221, 193 + xy: 2249, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 1183, 125 + xy: 2249, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 1217, 159 + xy: 2283, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 1187, 193 + xy: 2181, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 1187, 193 + xy: 2181, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 1149, 125 + xy: 2215, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 1183, 159 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock1 - rotate: false - xy: 1255, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock-icon-editor - rotate: false - xy: 1255, 193 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock2 - rotate: false - xy: 1217, 125 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -editor-ignarock3 - rotate: false - xy: 1251, 159 + xy: 2215, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 1289, 193 + xy: 2283, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 1289, 193 + xy: 2283, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 1323, 193 + xy: 2317, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 1251, 125 + xy: 2317, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 1285, 159 + xy: 2351, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 1285, 159 + xy: 2351, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 1285, 125 + xy: 2351, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 1285, 125 + xy: 2351, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 1319, 159 + xy: 2385, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 1319, 159 + xy: 2385, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 1319, 125 + xy: 2385, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 1319, 125 + xy: 2385, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 1353, 159 + xy: 2419, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 1353, 159 + xy: 2419, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 1353, 125 + xy: 2419, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 1387, 159 + xy: 2453, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss1 rotate: false - xy: 1387, 125 + xy: 2453, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-editor rotate: false - xy: 1387, 125 + xy: 2453, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss2 rotate: false - xy: 1421, 159 + xy: 2487, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss3 rotate: false - xy: 1421, 125 + xy: 2487, 271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud1 + rotate: false + xy: 2521, 305 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mud-icon-editor + rotate: false + xy: 2521, 305 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud2 + rotate: false + xy: 2521, 271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-mud3 + rotate: false + xy: 2555, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal1 rotate: false - xy: 1455, 159 + xy: 2555, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal2 rotate: false - xy: 1455, 125 + xy: 2589, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal3 rotate: false - xy: 1489, 159 + xy: 2589, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper1 rotate: false - xy: 1489, 125 + xy: 2623, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper2 rotate: false - xy: 1523, 159 + xy: 2623, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper3 rotate: false - xy: 1523, 125 + xy: 2657, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead1 rotate: false - xy: 1557, 159 + xy: 2657, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead2 rotate: false - xy: 1557, 125 + xy: 2691, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead3 rotate: false - xy: 1591, 159 + xy: 2691, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap1 rotate: false - xy: 1591, 125 + xy: 2725, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap2 rotate: false - xy: 1625, 159 + xy: 2725, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap3 rotate: false - xy: 1625, 125 + xy: 2759, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium1 rotate: false - xy: 1659, 159 + xy: 2759, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium2 rotate: false - xy: 1659, 125 + xy: 2793, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium3 rotate: false - xy: 1693, 159 + xy: 2793, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium1 rotate: false - xy: 1693, 125 + xy: 2827, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium2 rotate: false - xy: 1727, 159 + xy: 2827, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium3 rotate: false - xy: 1727, 125 + xy: 2861, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles1 rotate: false - xy: 1761, 159 + xy: 2861, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles2 rotate: false - xy: 1761, 125 + xy: 2895, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles3 rotate: false - xy: 1795, 159 + xy: 2895, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-salt rotate: false - xy: 1795, 125 + xy: 2929, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-editor rotate: false - xy: 1795, 125 + xy: 2929, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water1 rotate: false - xy: 1863, 125 + xy: 2997, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water2 rotate: false - xy: 1897, 159 + xy: 2997, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water3 rotate: false - xy: 1897, 125 + xy: 3031, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand1 rotate: false - xy: 1829, 159 + xy: 2929, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-editor rotate: false - xy: 1829, 159 + xy: 2929, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand2 rotate: false - xy: 1829, 125 + xy: 2963, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand3 rotate: false - xy: 1863, 159 + xy: 2963, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale1 rotate: false - xy: 1931, 159 + xy: 3031, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-editor rotate: false - xy: 1931, 159 + xy: 3031, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale2 rotate: false - xy: 1931, 125 + xy: 3065, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale3 rotate: false - xy: 1085, 91 + xy: 3065, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-slag rotate: false - xy: 1085, 57 + xy: 3099, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-icon-editor rotate: false - xy: 1085, 57 + xy: 3099, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow1 rotate: false - xy: 1119, 91 + xy: 3099, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow2 rotate: false - xy: 1119, 57 + xy: 3133, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow3 rotate: false - xy: 1153, 91 + xy: 3133, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spawn rotate: false - xy: 1153, 57 + xy: 3167, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss1 rotate: false - xy: 1187, 91 + xy: 3167, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-editor rotate: false - xy: 1187, 91 + xy: 3167, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss2 rotate: false - xy: 1187, 57 + xy: 3201, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss3 rotate: false - xy: 1221, 91 + xy: 3201, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 1221, 57 + xy: 3235, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 1221, 57 + xy: 3235, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 1255, 91 + xy: 3235, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 1255, 57 + xy: 3269, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tainted-water rotate: false - xy: 1289, 91 + xy: 3269, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-editor rotate: false - xy: 1289, 91 + xy: 3269, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 1289, 57 + xy: 3303, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 1289, 57 + xy: 3303, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils1 rotate: false - xy: 1323, 91 + xy: 3303, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils2 rotate: false - xy: 1323, 57 + xy: 3337, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils3 rotate: false - xy: 1357, 91 + xy: 3337, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 1357, 57 + xy: 3371, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 1357, 57 + xy: 3371, 305 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: 1489, 193 + 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: 1391, 91 + xy: 3371, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hyper-processor-icon-editor rotate: false - xy: 3345, 389 + xy: 3539, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -icerocks-icon-editor +ice-wall-icon-editor rotate: false - xy: 1391, 57 + xy: 3405, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-icon-editor rotate: false - xy: 1425, 91 + xy: 3405, 271 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: 1425, 57 + xy: 3439, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter-icon-editor rotate: false - xy: 1459, 91 + xy: 3439, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 1459, 57 + xy: 3473, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 1493, 91 + xy: 3473, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction-icon-editor rotate: false - xy: 1493, 57 + xy: 3507, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-editor rotate: false - xy: 1555, 193 + xy: 1553, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-editor rotate: false - xy: 1621, 193 + 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: 3443, 389 + xy: 3637, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-editor rotate: false - xy: 3541, 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: 1527, 91 + xy: 3507, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 1527, 57 + xy: 3541, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 1561, 91 + xy: 3541, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 3639, 389 + xy: 3833, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-void-icon-editor rotate: false - xy: 1561, 57 + xy: 3575, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-display-icon-editor rotate: false - xy: 3737, 389 + xy: 3931, 405 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 logic-processor-icon-editor rotate: false - xy: 1687, 193 + xy: 1685, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 3835, 389 + xy: 553, 83 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 1753, 193 + xy: 1751, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 1595, 91 + xy: 3575, 271 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: 1595, 57 + xy: 3609, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +memory-bank-icon-editor + rotate: false + xy: 1817, 241 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 memory-cell-icon-editor rotate: false - xy: 1629, 91 + xy: 3609, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 1819, 193 + xy: 1883, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-icon-editor rotate: false - xy: 1629, 57 + xy: 3643, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 1663, 91 + xy: 3643, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 micro-processor-icon-editor rotate: false - xy: 1663, 57 + xy: 3677, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 3933, 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: 553, 67 + xy: 749, 115 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 651, 99 + xy: 847, 115 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-dome-icon-editor rotate: false - xy: 749, 99 + xy: 945, 179 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 1885, 193 + xy: 1949, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 1697, 91 + xy: 3677, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 parallax-icon-editor rotate: false - xy: 1973, 323 + xy: 2015, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 payload-conveyor-icon-editor rotate: false - xy: 847, 99 + xy: 1043, 179 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon-editor rotate: false - xy: 1161, 227 + xy: 945, 81 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 1697, 57 + xy: 3711, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 1731, 91 + xy: 3711, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 1731, 57 + xy: 3745, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 1765, 91 + xy: 3745, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 2039, 323 + xy: 2081, 241 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 2105, 323 + xy: 2167, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 935, 211 + xy: 3917, 355 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 2171, 323 + xy: 2233, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-conveyor-icon-editor rotate: false - xy: 1765, 57 + xy: 3779, 305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-icon-editor rotate: false - xy: 1799, 91 + xy: 3779, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large-icon-editor rotate: false - xy: 2237, 323 + xy: 2299, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plated-conduit-icon-editor rotate: false - xy: 1799, 57 + xy: 2147, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 2303, 323 + xy: 2365, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 1833, 91 + xy: 2181, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 2369, 323 + xy: 2431, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 1833, 57 + xy: 2215, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 1867, 91 + xy: 2249, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 1867, 57 + xy: 2283, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 1901, 91 + xy: 2317, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 2435, 323 + xy: 2497, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 1901, 57 + xy: 2351, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 resupply-point-icon-editor rotate: false - xy: 2501, 323 + xy: 2563, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 ripple-icon-editor rotate: false - xy: 1259, 227 + xy: 1043, 81 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -rock-icon-editor - rotate: false - xy: 3755, 339 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rocks-icon-editor - rotate: false - xy: 1935, 91 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 rotary-pump-icon-editor rotate: false - xy: 2567, 323 + xy: 2629, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 1935, 57 + xy: 2385, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 2633, 323 + xy: 2695, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -saltrocks-icon-editor +salt-wall-icon-editor rotate: false - xy: 1085, 23 + xy: 2419, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 2699, 323 + xy: 2761, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-editor rotate: false - xy: 1119, 23 + xy: 2453, 237 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-wall-icon-editor + rotate: false + xy: 2487, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 1153, 23 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-icon-editor - rotate: false - xy: 1187, 23 + xy: 2521, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-editor rotate: false - xy: 2765, 323 + xy: 2827, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-icon-editor rotate: false - xy: 1221, 23 + xy: 2555, 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: 1357, 259 + xy: 1161, 211 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 1255, 23 + xy: 2589, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 2831, 323 + xy: 2893, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 segment-icon-editor rotate: false - xy: 2897, 323 + xy: 2959, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 2963, 323 + xy: 3025, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-editor rotate: false - xy: 1289, 23 + xy: 2623, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -shalerocks-icon-editor +shale-wall-icon-editor rotate: false - xy: 1323, 23 + xy: 2657, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 1357, 23 + xy: 2691, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 1391, 23 + xy: 2725, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-crucible-icon-editor rotate: false - xy: 1455, 259 + xy: 1259, 211 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 3029, 323 + xy: 3091, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +snow-boulder-icon-editor + rotate: false + xy: 3967, 355 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 snow-icon-editor rotate: false - xy: 1425, 23 + xy: 2759, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-editor rotate: false - xy: 985, 211 + xy: 163, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -snowrock-icon-editor +snow-wall-icon-editor rotate: false - xy: 3805, 339 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrocks-icon-editor - rotate: false - xy: 1459, 23 + xy: 2793, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 1493, 23 + xy: 2827, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 1553, 259 + xy: 1141, 113 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 1527, 23 + xy: 2861, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 1561, 23 + xy: 2895, 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: 3855, 347 + xy: 263, 9 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-pine-icon-editor rotate: false - xy: 1035, 211 + xy: 213, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 3095, 323 + xy: 3157, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks-icon-editor +spore-wall-icon-editor rotate: false - xy: 1595, 23 + xy: 2929, 237 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +steam-generator-icon-editor + rotate: false + xy: 3223, 339 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +stone-wall-icon-editor + rotate: false + xy: 2963, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 3161, 323 + xy: 3289, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 1629, 23 + xy: 2997, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 3227, 323 + xy: 3355, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 3293, 323 + xy: 3421, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 switch-icon-editor rotate: false - xy: 1663, 23 + xy: 3031, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils-icon-editor rotate: false - xy: 1697, 23 + xy: 3065, 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: 3359, 323 + xy: 3487, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 1651, 259 + xy: 1239, 113 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 1749, 259 + xy: 1357, 243 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 1731, 23 + xy: 3099, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 3425, 323 + xy: 3553, 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: 1765, 23 + xy: 3133, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 1799, 23 + xy: 3167, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 3491, 323 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-icon-editor - rotate: false - xy: 3557, 323 + xy: 3619, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 underflow-gate-icon-editor rotate: false - xy: 1833, 23 + xy: 3201, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 1867, 23 + xy: 3235, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 1847, 259 + xy: 1455, 243 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 3623, 323 + xy: 3685, 339 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 3689, 323 + xy: 3751, 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 @@ -10299,7 +11524,7 @@ alpha-bg index: -1 bar rotate: false - xy: 1917, 181 + xy: 2264, 97 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -10307,7 +11532,7 @@ bar index: -1 bar-top rotate: false - xy: 1888, 181 + xy: 2235, 97 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 @@ -10315,28 +11540,28 @@ bar-top index: -1 block-additive-reconstructor-large rotate: false - xy: 859, 221 + xy: 3842, 321 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-additive-reconstructor-medium rotate: false - xy: 2870, 253 + xy: 1195, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-additive-reconstructor-small rotate: false - xy: 781, 178 + xy: 3533, 387 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-additive-reconstructor-tiny rotate: false - xy: 821, 416 + xy: 3595, 243 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10350,28 +11575,28 @@ block-additive-reconstructor-xlarge index: -1 block-air-factory-large rotate: false - xy: 909, 271 + xy: 3884, 321 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-air-factory-medium rotate: false - xy: 2904, 253 + xy: 1229, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-air-factory-small rotate: false - xy: 1721, 23 + xy: 2322, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-air-factory-tiny rotate: false - xy: 965, 1 + xy: 4007, 186 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10385,28 +11610,28 @@ block-air-factory-xlarge index: -1 block-alloy-smelter-large rotate: false - xy: 959, 321 + xy: 845, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-alloy-smelter-medium rotate: false - xy: 2938, 253 + xy: 1263, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-alloy-smelter-small rotate: false - xy: 1755, 57 + xy: 2348, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-alloy-smelter-tiny rotate: false - xy: 983, 1 + xy: 309, 160 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10420,28 +11645,28 @@ block-alloy-smelter-xlarge index: -1 block-arc-large rotate: false - xy: 1009, 371 + xy: 887, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-arc-medium rotate: false - xy: 2972, 253 + xy: 1297, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-small rotate: false - xy: 1789, 85 + xy: 2374, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-arc-tiny rotate: false - xy: 839, 416 + xy: 881, 159 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10455,28 +11680,28 @@ block-arc-xlarge index: -1 block-armored-conveyor-large rotate: false - xy: 859, 179 + xy: 929, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-armored-conveyor-medium rotate: false - xy: 3006, 253 + xy: 1331, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-small rotate: false - xy: 1975, 193 + xy: 2400, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-armored-conveyor-tiny rotate: false - xy: 2659, 269 + xy: 881, 141 size: 16, 16 orig: 16, 16 offset: 0, 0 @@ -10488,7184 +11713,7394 @@ block-armored-conveyor-xlarge orig: 48, 48 offset: 0, 0 index: -1 -block-battery-large +block-basalt-large rotate: false - xy: 1051, 371 + xy: 971, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-battery-large-large +block-basalt-medium rotate: false - xy: 1093, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-battery-large-medium - rotate: false - xy: 3040, 253 + xy: 1365, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-battery-large-small +block-basalt-small rotate: false - xy: 1975, 167 + xy: 2426, 109 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-battery-large-tiny +block-basalt-tiny rotate: false - xy: 257, 28 + xy: 881, 123 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-battery-large-xlarge +block-basalt-xlarge rotate: false xy: 259, 257 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-battery-medium +block-battery-large rotate: false - xy: 3074, 253 + xy: 1013, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-large + rotate: false + xy: 1055, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-medium + rotate: false + xy: 1399, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-battery-small +block-battery-large-small rotate: false - xy: 2001, 193 + xy: 2452, 100 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-battery-tiny +block-battery-large-tiny rotate: false - xy: 985, 193 + xy: 881, 105 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-battery-xlarge +block-battery-large-xlarge rotate: false xy: 181, 46 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-blast-drill-large +block-battery-medium rotate: false - xy: 1135, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-blast-drill-medium - rotate: false - xy: 3108, 253 + xy: 1433, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-blast-drill-small +block-battery-small rotate: false - xy: 2001, 167 + xy: 1398, 84 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-blast-drill-tiny +block-battery-tiny rotate: false - xy: 2859, 131 + xy: 881, 87 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-blast-drill-xlarge +block-battery-xlarge rotate: false xy: 259, 207 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-blast-mixer-large +block-blast-drill-large rotate: false - xy: 1177, 371 + xy: 1097, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-blast-mixer-medium +block-blast-drill-medium rotate: false - xy: 3142, 253 + xy: 1467, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-blast-mixer-small +block-blast-drill-small rotate: false - xy: 2027, 193 + xy: 1424, 77 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-blast-mixer-tiny +block-blast-drill-tiny rotate: false - xy: 3041, 209 + xy: 881, 69 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-blast-mixer-xlarge +block-blast-drill-xlarge rotate: false xy: 259, 157 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-block-forge-large +block-blast-mixer-large rotate: false - xy: 1219, 371 + xy: 1139, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-block-forge-medium +block-blast-mixer-medium rotate: false - xy: 3176, 253 + xy: 1501, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-block-forge-small +block-blast-mixer-small rotate: false - xy: 2027, 167 + xy: 2322, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-block-forge-tiny +block-blast-mixer-tiny rotate: false - xy: 2989, 157 + xy: 881, 51 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-block-forge-xlarge +block-blast-mixer-xlarge rotate: false xy: 857, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-block-loader-large +block-block-forge-large rotate: false - xy: 1261, 371 + xy: 1181, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-block-loader-medium +block-block-forge-medium rotate: false - xy: 3210, 253 + xy: 1535, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-block-loader-small +block-block-forge-small rotate: false - xy: 2053, 193 + xy: 2348, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-block-loader-tiny +block-block-forge-tiny rotate: false - xy: 3015, 183 + xy: 881, 33 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-block-loader-xlarge +block-block-forge-xlarge rotate: false xy: 907, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-block-unloader-large +block-block-loader-large rotate: false - xy: 1303, 371 + xy: 1223, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-block-unloader-medium +block-block-loader-medium rotate: false - xy: 3244, 253 + xy: 1569, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-block-unloader-small +block-block-loader-small rotate: false - xy: 2053, 167 + xy: 2374, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-block-unloader-tiny +block-block-loader-tiny rotate: false - xy: 309, 166 + xy: 881, 15 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-block-unloader-xlarge +block-block-loader-xlarge rotate: false xy: 957, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-bridge-conduit-large +block-block-unloader-large rotate: false - xy: 1345, 371 + xy: 1265, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-bridge-conduit-medium +block-block-unloader-medium rotate: false - xy: 3278, 253 + xy: 1603, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-bridge-conduit-small +block-block-unloader-small rotate: false - xy: 2079, 193 + xy: 2400, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-bridge-conduit-tiny +block-block-unloader-tiny rotate: false - xy: 257, 10 + xy: 899, 156 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-bridge-conduit-xlarge +block-block-unloader-xlarge rotate: false xy: 1007, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-bridge-conveyor-large +block-boulder-large rotate: false - xy: 1387, 371 + xy: 1307, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-bridge-conveyor-medium +block-boulder-medium rotate: false - xy: 3312, 253 + xy: 1637, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-bridge-conveyor-small +block-boulder-small rotate: false - xy: 2079, 167 + xy: 2426, 83 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-bridge-conveyor-tiny +block-boulder-tiny rotate: false - xy: 2877, 131 + xy: 899, 138 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-bridge-conveyor-xlarge +block-boulder-xlarge rotate: false xy: 1057, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-char-large +block-bridge-conduit-large rotate: false - xy: 1429, 371 + xy: 1349, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-char-medium +block-bridge-conduit-medium rotate: false - xy: 3346, 253 + xy: 1671, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-char-small +block-bridge-conduit-small rotate: false - xy: 2105, 193 + xy: 2452, 74 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-char-tiny +block-bridge-conduit-tiny rotate: false - xy: 3059, 209 + xy: 917, 156 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-char-xlarge +block-bridge-conduit-xlarge rotate: false xy: 1107, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cliff-large +block-bridge-conveyor-large rotate: false - xy: 1471, 371 + xy: 1391, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cliff-medium +block-bridge-conveyor-medium rotate: false - xy: 3380, 253 + xy: 1705, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cliff-small +block-bridge-conveyor-small rotate: false - xy: 2105, 167 + xy: 2478, 85 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cliff-tiny +block-bridge-conveyor-tiny rotate: false - xy: 2895, 131 + xy: 899, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cliff-xlarge +block-bridge-conveyor-xlarge rotate: false xy: 1157, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cliffs-large +block-char-large rotate: false - xy: 1513, 371 + xy: 1433, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cliffs-medium +block-char-medium rotate: false - xy: 3414, 253 + xy: 1739, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cliffs-small +block-char-small rotate: false - xy: 2131, 193 + xy: 2504, 85 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cliffs-tiny +block-char-tiny rotate: false - xy: 3077, 209 + xy: 917, 138 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cliffs-xlarge +block-char-xlarge rotate: false xy: 1207, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-coal-centrifuge-large +block-cliff-large rotate: false - xy: 1555, 371 + xy: 1475, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-coal-centrifuge-medium +block-cliff-medium rotate: false - xy: 3448, 253 + xy: 1773, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-coal-centrifuge-small +block-cliff-small rotate: false - xy: 2131, 167 + xy: 2530, 85 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-coal-centrifuge-tiny +block-cliff-tiny rotate: false - xy: 2913, 131 + xy: 935, 156 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-coal-centrifuge-xlarge +block-cliff-xlarge rotate: false xy: 1257, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-combustion-generator-large +block-coal-centrifuge-large rotate: false - xy: 1597, 371 + xy: 1517, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-combustion-generator-medium +block-coal-centrifuge-medium rotate: false - xy: 3482, 253 + xy: 1807, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-combustion-generator-small +block-coal-centrifuge-small rotate: false - xy: 2157, 193 + xy: 2556, 85 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-combustion-generator-tiny +block-coal-centrifuge-tiny rotate: false - xy: 3095, 209 + xy: 899, 102 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-combustion-generator-xlarge +block-coal-centrifuge-xlarge rotate: false xy: 1307, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-command-center-large +block-combustion-generator-large rotate: false - xy: 1639, 371 + xy: 1559, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-command-center-medium +block-combustion-generator-medium rotate: false - xy: 3516, 253 + xy: 1841, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-command-center-small +block-combustion-generator-small rotate: false - xy: 2157, 167 + xy: 2478, 59 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-command-center-tiny +block-combustion-generator-tiny rotate: false - xy: 2931, 131 + xy: 917, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-command-center-xlarge +block-combustion-generator-xlarge rotate: false xy: 1357, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-conduit-large +block-command-center-large rotate: false - xy: 1681, 371 + xy: 1601, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-conduit-medium +block-command-center-medium rotate: false - xy: 3550, 253 + xy: 1875, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-conduit-small +block-command-center-small rotate: false - xy: 2183, 193 + xy: 2504, 59 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-conduit-tiny +block-command-center-tiny rotate: false - xy: 3113, 209 + xy: 935, 138 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-conduit-xlarge +block-command-center-xlarge rotate: false xy: 1407, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-container-large +block-conduit-large rotate: false - xy: 1723, 371 + xy: 1643, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-container-medium +block-conduit-medium rotate: false - xy: 3584, 253 + xy: 1909, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-container-small +block-conduit-small rotate: false - xy: 2183, 167 + xy: 2530, 59 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-container-tiny +block-conduit-tiny rotate: false - xy: 2949, 131 + xy: 953, 156 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-container-xlarge +block-conduit-xlarge rotate: false xy: 1457, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-conveyor-large +block-container-large rotate: false - xy: 1765, 371 + xy: 1685, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-conveyor-medium +block-container-medium rotate: false - xy: 3618, 253 + xy: 1943, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-conveyor-small +block-container-small rotate: false - xy: 2209, 193 + xy: 2556, 59 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-conveyor-tiny +block-container-tiny rotate: false - xy: 3131, 209 + xy: 899, 84 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-conveyor-xlarge +block-container-xlarge rotate: false xy: 1507, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-copper-wall-large +block-conveyor-large rotate: false - xy: 1807, 371 + xy: 1727, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-copper-wall-large-large +block-conveyor-medium rotate: false - xy: 1849, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-copper-wall-large-medium - rotate: false - xy: 3652, 253 + xy: 1977, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-copper-wall-large-small +block-conveyor-small rotate: false - xy: 2209, 167 + xy: 1450, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-copper-wall-large-tiny +block-conveyor-tiny rotate: false - xy: 2967, 131 + xy: 899, 66 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-copper-wall-large-xlarge +block-conveyor-xlarge rotate: false xy: 1557, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-copper-wall-medium +block-copper-wall-large rotate: false - xy: 3686, 253 + xy: 1769, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-large + rotate: false + xy: 1811, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-medium + rotate: false + xy: 2011, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-copper-wall-small +block-copper-wall-large-small rotate: false - xy: 2235, 193 + xy: 1476, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-copper-wall-tiny +block-copper-wall-large-tiny rotate: false - xy: 3149, 209 + xy: 917, 102 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-copper-wall-xlarge +block-copper-wall-large-xlarge rotate: false xy: 1607, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-core-foundation-large +block-copper-wall-medium rotate: false - xy: 1891, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-core-foundation-medium - rotate: false - xy: 993, 245 + xy: 2045, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-core-foundation-small +block-copper-wall-small rotate: false - xy: 2235, 167 + xy: 1502, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-core-foundation-tiny +block-copper-wall-tiny rotate: false - xy: 3167, 209 + xy: 935, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-core-foundation-xlarge +block-copper-wall-xlarge rotate: false xy: 1657, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-core-nucleus-large +block-core-foundation-large rotate: false - xy: 1933, 371 + xy: 1853, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-core-nucleus-medium +block-core-foundation-medium rotate: false - xy: 985, 211 + xy: 2079, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-core-nucleus-small +block-core-foundation-small rotate: false - xy: 2261, 193 + xy: 1528, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-core-nucleus-tiny +block-core-foundation-tiny rotate: false - xy: 3185, 209 + xy: 953, 138 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-core-nucleus-xlarge +block-core-foundation-xlarge rotate: false xy: 1707, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-core-shard-large +block-core-nucleus-large rotate: false - xy: 1975, 371 + xy: 1895, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-core-shard-medium +block-core-nucleus-medium rotate: false - xy: 1027, 245 + xy: 2113, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-core-shard-small +block-core-nucleus-small rotate: false - xy: 2261, 167 + xy: 1554, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-core-shard-tiny +block-core-nucleus-tiny rotate: false - xy: 3203, 209 + xy: 971, 156 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-core-shard-xlarge +block-core-nucleus-xlarge rotate: false xy: 1757, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-craters-large +block-core-shard-large rotate: false - xy: 2017, 371 + xy: 1937, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-craters-medium +block-core-shard-medium rotate: false - xy: 1019, 211 + xy: 2147, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-craters-small +block-core-shard-small rotate: false - xy: 2287, 193 + xy: 1580, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-craters-tiny +block-core-shard-tiny rotate: false - xy: 3221, 209 + xy: 899, 48 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-craters-xlarge +block-core-shard-xlarge rotate: false xy: 1807, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cryofluidmixer-large +block-craters-large rotate: false - xy: 2059, 371 + xy: 1979, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cryofluidmixer-medium +block-craters-medium rotate: false - xy: 1061, 253 + xy: 2181, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cryofluidmixer-small +block-craters-small rotate: false - xy: 2287, 167 + xy: 1606, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cryofluidmixer-tiny +block-craters-tiny rotate: false - xy: 3239, 209 + xy: 917, 84 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cryofluidmixer-xlarge +block-craters-xlarge rotate: false xy: 1857, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cultivator-large +block-cryofluidmixer-large rotate: false - xy: 2101, 371 + xy: 2021, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cultivator-medium +block-cryofluidmixer-medium rotate: false - xy: 1095, 253 + xy: 2215, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cultivator-small +block-cryofluidmixer-small rotate: false - xy: 2313, 193 + xy: 1636, 82 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cultivator-tiny +block-cryofluidmixer-tiny rotate: false - xy: 3257, 209 + xy: 917, 66 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cultivator-xlarge +block-cryofluidmixer-xlarge rotate: false xy: 1907, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-cyclone-large +block-cultivator-large rotate: false - xy: 2143, 371 + xy: 2063, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-cyclone-medium +block-cultivator-medium rotate: false - xy: 1129, 253 + xy: 2249, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-cyclone-small +block-cultivator-small rotate: false - xy: 2313, 167 + xy: 1662, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-cyclone-tiny +block-cultivator-tiny rotate: false - xy: 3275, 209 + xy: 935, 102 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-cyclone-xlarge +block-cultivator-xlarge rotate: false xy: 1957, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-metal-large +block-cyclone-large rotate: false - xy: 2185, 371 + xy: 2105, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-metal-medium +block-cyclone-medium rotate: false - xy: 1163, 253 + xy: 2283, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-metal-small +block-cyclone-small rotate: false - xy: 2339, 193 + xy: 1688, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-metal-tiny +block-cyclone-tiny rotate: false - xy: 3293, 209 + xy: 953, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-metal-xlarge +block-cyclone-xlarge rotate: false xy: 2007, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-1-large +block-dacite-boulder-large rotate: false - xy: 2227, 371 + xy: 2147, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-1-medium +block-dacite-boulder-medium rotate: false - xy: 1197, 253 + xy: 2317, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-1-small +block-dacite-boulder-small rotate: false - xy: 2339, 167 + xy: 1714, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-1-tiny +block-dacite-boulder-tiny rotate: false - xy: 3311, 209 + xy: 971, 138 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-1-xlarge +block-dacite-boulder-xlarge rotate: false xy: 2057, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-2-large +block-dacite-large rotate: false - xy: 2269, 371 + xy: 2189, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-2-medium +block-dacite-medium rotate: false - xy: 1231, 253 + xy: 2351, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-2-small +block-dacite-small rotate: false - xy: 2365, 193 + xy: 1740, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-2-tiny +block-dacite-tiny rotate: false - xy: 3329, 209 + xy: 989, 156 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-2-xlarge +block-dacite-wall-large + rotate: false + xy: 2231, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dacite-wall-medium + rotate: false + xy: 2385, 169 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dacite-wall-small + rotate: false + xy: 1766, 75 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dacite-wall-tiny + rotate: false + xy: 899, 30 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dacite-wall-xlarge rotate: false xy: 2107, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-3-large - rotate: false - xy: 2311, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-dark-panel-3-medium - rotate: false - xy: 1265, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-dark-panel-3-small - rotate: false - xy: 2365, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-dark-panel-3-tiny - rotate: false - xy: 3347, 209 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-dark-panel-3-xlarge +block-dacite-xlarge rotate: false xy: 2157, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-4-large +block-dark-metal-large rotate: false - xy: 2353, 371 + xy: 2273, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-4-medium +block-dark-metal-medium rotate: false - xy: 1299, 253 + xy: 2419, 169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-4-small +block-dark-metal-small rotate: false - xy: 2391, 193 + xy: 1792, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-4-tiny +block-dark-metal-tiny rotate: false - xy: 3365, 209 + xy: 917, 48 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-4-xlarge +block-dark-metal-xlarge rotate: false xy: 2207, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-5-large +block-dark-panel-1-large rotate: false - xy: 2395, 371 + xy: 2315, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-5-medium +block-dark-panel-1-medium rotate: false - xy: 1333, 253 + xy: 2455, 194 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-5-small +block-dark-panel-1-small rotate: false - xy: 2391, 167 + xy: 1818, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-5-tiny +block-dark-panel-1-tiny rotate: false - xy: 3383, 209 + xy: 935, 84 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-5-xlarge +block-dark-panel-1-xlarge rotate: false xy: 2257, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dark-panel-6-large +block-dark-panel-2-large rotate: false - xy: 2437, 371 + xy: 2357, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dark-panel-6-medium +block-dark-panel-2-medium rotate: false - xy: 1367, 253 + xy: 2707, 245 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dark-panel-6-small +block-dark-panel-2-small rotate: false - xy: 2417, 193 + xy: 1844, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dark-panel-6-tiny +block-dark-panel-2-tiny rotate: false - xy: 3401, 209 + xy: 935, 66 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dark-panel-6-xlarge +block-dark-panel-2-xlarge rotate: false xy: 2307, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-large +block-dark-panel-3-large rotate: false - xy: 2479, 371 + xy: 2399, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-darksand-medium +block-dark-panel-3-medium rotate: false - xy: 1401, 253 + xy: 2453, 160 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-darksand-small +block-dark-panel-3-small rotate: false - xy: 2417, 167 + xy: 1870, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-darksand-tainted-water-large +block-dark-panel-3-tiny rotate: false - xy: 2521, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-medium - rotate: false - xy: 1435, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-small - rotate: false - xy: 2443, 193 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-darksand-tainted-water-tiny - rotate: false - xy: 3419, 209 + xy: 953, 102 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-darksand-tainted-water-xlarge +block-dark-panel-3-xlarge rotate: false xy: 2357, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-tiny +block-dark-panel-4-large rotate: false - xy: 3437, 209 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-darksand-water-large - rotate: false - xy: 2563, 371 + xy: 2441, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-darksand-water-medium +block-dark-panel-4-medium rotate: false - xy: 1469, 253 + xy: 2497, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-darksand-water-small +block-dark-panel-4-small rotate: false - xy: 2443, 167 + xy: 1896, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-darksand-water-tiny +block-dark-panel-4-tiny rotate: false - xy: 3455, 209 + xy: 971, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-darksand-water-xlarge +block-dark-panel-4-xlarge rotate: false xy: 2407, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-darksand-xlarge +block-dark-panel-5-large + rotate: false + xy: 2483, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-5-medium + rotate: false + xy: 2749, 261 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-5-small + rotate: false + xy: 1922, 75 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-5-tiny + rotate: false + xy: 989, 138 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-5-xlarge rotate: false xy: 2457, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-deepwater-large +block-dark-panel-6-large rotate: false - xy: 2605, 371 + xy: 2525, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-deepwater-medium +block-dark-panel-6-medium rotate: false - xy: 1503, 253 + xy: 2783, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-deepwater-small +block-dark-panel-6-small rotate: false - xy: 2469, 193 + xy: 1948, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-deepwater-tiny +block-dark-panel-6-tiny rotate: false - xy: 3473, 209 + xy: 917, 30 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-deepwater-xlarge +block-dark-panel-6-xlarge rotate: false xy: 2507, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-differential-generator-large +block-darksand-large rotate: false - xy: 2647, 371 + xy: 2567, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-differential-generator-medium +block-darksand-medium rotate: false - xy: 1537, 253 + xy: 2817, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-differential-generator-small +block-darksand-small rotate: false - xy: 2469, 167 + xy: 4040, 284 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-differential-generator-tiny +block-darksand-tainted-water-large rotate: false - xy: 3491, 209 + xy: 2609, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-medium + rotate: false + xy: 2875, 309 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-small + rotate: false + xy: 4066, 284 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-tiny + rotate: false + xy: 935, 48 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-differential-generator-xlarge +block-darksand-tainted-water-xlarge rotate: false xy: 2557, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-diode-large +block-darksand-tiny rotate: false - xy: 2689, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-diode-medium - rotate: false - xy: 1571, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-diode-small - rotate: false - xy: 2495, 193 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-diode-tiny - rotate: false - xy: 3509, 209 + xy: 953, 84 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-diode-xlarge +block-darksand-water-large + rotate: false + xy: 2651, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-water-medium + rotate: false + xy: 2909, 308 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-water-small + rotate: false + xy: 2582, 85 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-water-tiny + rotate: false + xy: 953, 66 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-xlarge rotate: false xy: 2607, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-disassembler-large - rotate: false - xy: 2731, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-disassembler-medium - rotate: false - xy: 1605, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-disassembler-small - rotate: false - xy: 2495, 167 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-disassembler-tiny - rotate: false - xy: 3527, 209 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-disassembler-xlarge +block-darksand-xlarge rotate: false xy: 2657, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-distributor-large +block-deepwater-large rotate: false - xy: 2773, 371 + xy: 2693, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-distributor-medium +block-deepwater-medium rotate: false - xy: 1639, 253 + xy: 2943, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-distributor-small +block-deepwater-small rotate: false - xy: 2521, 193 + xy: 2582, 59 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-distributor-tiny +block-deepwater-tiny rotate: false - xy: 3545, 209 + xy: 971, 102 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-distributor-xlarge +block-deepwater-xlarge rotate: false xy: 2707, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-door-large +block-differential-generator-large rotate: false - xy: 2815, 371 + xy: 2735, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-door-large-large +block-differential-generator-medium rotate: false - xy: 2857, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-door-large-medium - rotate: false - xy: 1673, 253 + xy: 2977, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-door-large-small +block-differential-generator-small rotate: false - xy: 2521, 167 + xy: 1976, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-door-large-tiny +block-differential-generator-tiny rotate: false - xy: 3563, 209 + xy: 989, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-door-large-xlarge +block-differential-generator-xlarge rotate: false xy: 2757, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-door-medium +block-diode-large rotate: false - xy: 1707, 253 + xy: 2777, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-diode-medium + rotate: false + xy: 3011, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-door-small +block-diode-small rotate: false - xy: 2547, 193 + xy: 2002, 81 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-door-tiny +block-diode-tiny rotate: false - xy: 3581, 209 + xy: 935, 30 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-door-xlarge +block-diode-xlarge rotate: false xy: 2807, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-dunerocks-large +block-dirt-large rotate: false - xy: 2899, 371 + xy: 2819, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-dunerocks-medium +block-dirt-medium rotate: false - xy: 1741, 253 + xy: 3045, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-dunerocks-small +block-dirt-small rotate: false - xy: 2547, 167 + xy: 2111, 82 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-dunerocks-tiny +block-dirt-tiny rotate: false - xy: 3599, 209 + xy: 953, 48 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-dunerocks-xlarge +block-dirt-wall-large + rotate: false + xy: 2861, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dirt-wall-medium + rotate: false + xy: 3079, 308 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dirt-wall-small + rotate: false + xy: 3593, 339 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dirt-wall-tiny + rotate: false + xy: 971, 84 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dirt-wall-xlarge rotate: false xy: 2857, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-duo-large - rotate: false - xy: 2941, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-duo-medium - rotate: false - xy: 1775, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-duo-small - rotate: false - xy: 2573, 193 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-duo-tiny - rotate: false - xy: 3617, 209 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-duo-xlarge +block-dirt-xlarge rotate: false xy: 2907, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-exponential-reconstructor-large +block-disassembler-large rotate: false - xy: 2983, 371 + xy: 2903, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-exponential-reconstructor-medium +block-disassembler-medium rotate: false - xy: 1809, 253 + xy: 3113, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-exponential-reconstructor-small +block-disassembler-small rotate: false - xy: 2573, 167 + xy: 3619, 339 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-exponential-reconstructor-tiny +block-disassembler-tiny rotate: false - xy: 3635, 209 + xy: 971, 66 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-exponential-reconstructor-xlarge +block-disassembler-xlarge rotate: false xy: 2957, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-force-projector-large +block-distributor-large rotate: false - xy: 3025, 371 + xy: 2945, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-force-projector-medium +block-distributor-medium rotate: false - xy: 1843, 253 + xy: 3147, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-force-projector-small +block-distributor-small rotate: false - xy: 2599, 193 + xy: 2175, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-force-projector-tiny +block-distributor-tiny rotate: false - xy: 3653, 209 + xy: 989, 102 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-force-projector-xlarge +block-distributor-xlarge rotate: false xy: 3007, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-fuse-large +block-door-large rotate: false - xy: 3067, 371 + xy: 2987, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-fuse-medium +block-door-large-large rotate: false - xy: 1877, 253 + xy: 3029, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-door-large-medium + rotate: false + xy: 3181, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-fuse-small +block-door-large-small rotate: false - xy: 2599, 167 + xy: 2201, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-fuse-tiny +block-door-large-tiny rotate: false - xy: 3671, 209 + xy: 953, 30 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-fuse-xlarge +block-door-large-xlarge rotate: false xy: 3057, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-graphite-press-large +block-door-medium rotate: false - xy: 3109, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-graphite-press-medium - rotate: false - xy: 1911, 253 + xy: 3215, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-graphite-press-small +block-door-small rotate: false - xy: 2625, 193 + xy: 2227, 71 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-graphite-press-tiny +block-door-tiny rotate: false - xy: 3689, 209 + xy: 971, 48 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-graphite-press-xlarge +block-door-xlarge rotate: false xy: 3107, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-grass-large +block-dune-wall-large rotate: false - xy: 3151, 371 + xy: 3071, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-grass-medium +block-dune-wall-medium rotate: false - xy: 1945, 253 + xy: 3249, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-grass-small +block-dune-wall-small rotate: false - xy: 2625, 167 + xy: 2253, 71 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-grass-tiny +block-dune-wall-tiny rotate: false - xy: 1950, 138 + xy: 989, 84 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-grass-xlarge +block-dune-wall-xlarge rotate: false xy: 3157, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ground-factory-large +block-duo-large rotate: false - xy: 3193, 371 + xy: 3113, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ground-factory-medium +block-duo-medium rotate: false - xy: 1979, 253 + xy: 3283, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ground-factory-small +block-duo-small rotate: false - xy: 1820, 119 + xy: 2279, 71 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ground-factory-tiny +block-duo-tiny rotate: false - xy: 1950, 120 + xy: 989, 66 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ground-factory-xlarge +block-duo-xlarge rotate: false xy: 3207, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hail-large +block-exponential-reconstructor-large rotate: false - xy: 3235, 371 + xy: 3155, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hail-medium +block-exponential-reconstructor-medium rotate: false - xy: 2013, 253 + xy: 3317, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hail-small +block-exponential-reconstructor-small rotate: false - xy: 1854, 153 + xy: 2137, 69 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hail-tiny +block-exponential-reconstructor-tiny rotate: false - xy: 1950, 102 + xy: 971, 30 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hail-xlarge +block-exponential-reconstructor-xlarge rotate: false xy: 3257, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-holostone-large +block-force-projector-large rotate: false - xy: 3277, 371 + xy: 3197, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-holostone-medium +block-force-projector-medium rotate: false - xy: 2047, 253 + xy: 3351, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-holostone-small +block-force-projector-small rotate: false - xy: 1975, 141 + xy: 3585, 117 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-holostone-tiny +block-force-projector-tiny rotate: false - xy: 1950, 84 + xy: 989, 48 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-holostone-xlarge +block-force-projector-xlarge rotate: false xy: 3307, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hotrock-large +block-fuse-large rotate: false - xy: 3319, 371 + xy: 3239, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hotrock-medium +block-fuse-medium rotate: false - xy: 2081, 253 + xy: 3385, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hotrock-small +block-fuse-small rotate: false - xy: 2001, 141 + xy: 3591, 214 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hotrock-tiny +block-fuse-tiny rotate: false - xy: 2833, 113 + xy: 989, 30 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hotrock-xlarge +block-fuse-xlarge rotate: false xy: 3357, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-hyper-processor-large +block-graphite-press-large rotate: false - xy: 3361, 371 + xy: 3281, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-hyper-processor-medium +block-graphite-press-medium rotate: false - xy: 2115, 253 + xy: 3419, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-hyper-processor-small +block-graphite-press-small rotate: false - xy: 2027, 141 + xy: 2591, 191 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-hyper-processor-tiny +block-graphite-press-tiny rotate: false - xy: 2851, 113 + xy: 899, 12 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-hyper-processor-xlarge +block-graphite-press-xlarge rotate: false xy: 3407, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ice-large +block-grass-large rotate: false - xy: 3403, 371 + xy: 3323, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ice-medium +block-grass-medium rotate: false - xy: 2149, 253 + xy: 3453, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ice-small +block-grass-small rotate: false - xy: 2053, 141 + xy: 2617, 193 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ice-snow-large +block-grass-tiny rotate: false - xy: 3445, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-ice-snow-medium - rotate: false - xy: 2183, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-ice-snow-small - rotate: false - xy: 2079, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-ice-snow-tiny - rotate: false - xy: 2869, 113 + xy: 917, 12 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ice-snow-xlarge +block-grass-xlarge rotate: false xy: 3457, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ice-tiny +block-ground-factory-large rotate: false - xy: 2887, 113 + xy: 3365, 371 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ground-factory-medium + rotate: false + xy: 3487, 308 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ground-factory-small + rotate: false + xy: 2591, 165 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ground-factory-tiny + rotate: false + xy: 935, 12 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ice-xlarge +block-ground-factory-xlarge rotate: false xy: 3507, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-icerocks-large +block-hail-large rotate: false - xy: 3487, 371 + xy: 3407, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-icerocks-medium +block-hail-medium rotate: false - xy: 2217, 253 + xy: 2489, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-icerocks-small +block-hail-small rotate: false - xy: 2105, 141 + xy: 2617, 167 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-icerocks-tiny +block-hail-tiny rotate: false - xy: 2905, 113 + xy: 953, 12 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-icerocks-xlarge +block-hail-xlarge rotate: false xy: 3557, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ignarock-large +block-hotrock-large rotate: false - xy: 3529, 371 + xy: 3449, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ignarock-medium +block-hotrock-medium rotate: false - xy: 2251, 253 + xy: 2487, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ignarock-small +block-hotrock-small rotate: false - xy: 2131, 141 + xy: 2589, 139 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ignarock-tiny +block-hotrock-tiny rotate: false - xy: 2923, 113 + xy: 971, 12 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ignarock-xlarge +block-hotrock-xlarge rotate: false xy: 3607, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-illuminator-large +block-hyper-processor-large rotate: false - xy: 3571, 371 + xy: 3491, 371 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-illuminator-medium +block-hyper-processor-medium rotate: false - xy: 2285, 253 + xy: 3842, 287 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-illuminator-small +block-hyper-processor-small rotate: false - xy: 2157, 141 + xy: 2589, 113 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-illuminator-tiny +block-hyper-processor-tiny rotate: false - xy: 2941, 113 + xy: 989, 12 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-illuminator-xlarge +block-hyper-processor-xlarge rotate: false xy: 3657, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-impact-reactor-large +block-ice-large rotate: false - xy: 3613, 371 + xy: 859, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-impact-reactor-medium +block-ice-medium rotate: false - xy: 2319, 253 + xy: 3876, 287 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-impact-reactor-small +block-ice-small rotate: false - xy: 2183, 141 + xy: 2608, 87 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-impact-reactor-tiny +block-ice-snow-large rotate: false - xy: 2959, 113 + xy: 859, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-snow-medium + rotate: false + xy: 3910, 287 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-small + rotate: false + xy: 2608, 61 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-snow-tiny + rotate: false + xy: 1007, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-impact-reactor-xlarge +block-ice-snow-xlarge rotate: false xy: 3707, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-incinerator-large +block-ice-tiny rotate: false - xy: 3655, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-incinerator-medium - rotate: false - xy: 2353, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-incinerator-small - rotate: false - xy: 2209, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-incinerator-tiny - rotate: false - xy: 1968, 123 + xy: 1007, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-incinerator-xlarge +block-ice-wall-large + rotate: false + xy: 901, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-wall-medium + rotate: false + xy: 3944, 289 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-wall-small + rotate: false + xy: 2028, 75 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-wall-tiny + rotate: false + xy: 1007, 97 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-wall-xlarge rotate: false xy: 3757, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-inverted-sorter-large - rotate: false - xy: 3697, 371 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-inverted-sorter-medium - rotate: false - xy: 2387, 253 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-inverted-sorter-small - rotate: false - xy: 2235, 141 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-inverted-sorter-tiny - rotate: false - xy: 1968, 105 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-inverted-sorter-xlarge +block-ice-xlarge rotate: false xy: 3807, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-item-source-large +block-illuminator-large rotate: false - xy: 3739, 371 + xy: 859, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-item-source-medium +block-illuminator-medium rotate: false - xy: 2421, 253 + xy: 1160, 127 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-item-source-small +block-illuminator-small rotate: false - xy: 2261, 141 + xy: 2054, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-item-source-tiny +block-illuminator-tiny rotate: false - xy: 1986, 123 + xy: 1007, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-item-source-xlarge +block-illuminator-xlarge rotate: false xy: 3857, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-item-void-large +block-impact-reactor-large rotate: false - xy: 3781, 371 + xy: 901, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-item-void-medium +block-impact-reactor-medium rotate: false - xy: 2455, 253 + xy: 1195, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-item-void-small +block-impact-reactor-small rotate: false - xy: 2287, 141 + xy: 2080, 76 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-item-void-tiny +block-impact-reactor-tiny rotate: false - xy: 1986, 105 + xy: 1007, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-item-void-xlarge +block-impact-reactor-xlarge rotate: false xy: 3907, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-junction-large +block-incinerator-large rotate: false - xy: 3823, 371 + xy: 943, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-junction-medium +block-incinerator-medium rotate: false - xy: 2489, 253 + xy: 1229, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-junction-small +block-incinerator-small rotate: false - xy: 2313, 141 + xy: 3555, 316 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-junction-tiny +block-incinerator-tiny rotate: false - xy: 1968, 87 + xy: 1007, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-junction-xlarge +block-incinerator-xlarge rotate: false xy: 3957, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-kiln-large +block-inverted-sorter-large rotate: false - xy: 3865, 371 + xy: 859, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-kiln-medium +block-inverted-sorter-medium rotate: false - xy: 2523, 253 + xy: 1263, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-kiln-small +block-inverted-sorter-small rotate: false - xy: 2339, 141 + xy: 3581, 313 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-kiln-tiny +block-inverted-sorter-tiny rotate: false - xy: 2004, 123 + xy: 1007, 25 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-kiln-xlarge +block-inverted-sorter-xlarge rotate: false xy: 4007, 463 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-lancer-large +block-item-source-large rotate: false - xy: 3907, 371 + xy: 901, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-lancer-medium +block-item-source-medium rotate: false - xy: 2557, 253 + xy: 1297, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-lancer-small +block-item-source-small rotate: false - xy: 2365, 141 + xy: 3607, 313 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-lancer-tiny +block-item-source-tiny rotate: false - xy: 2004, 105 + xy: 1025, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-lancer-xlarge +block-item-source-xlarge rotate: false xy: 345, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-laser-drill-large +block-item-void-large rotate: false - xy: 3949, 371 + xy: 943, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-laser-drill-medium +block-item-void-medium rotate: false - xy: 2591, 253 + xy: 1331, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-laser-drill-small +block-item-void-small rotate: false - xy: 2391, 141 + xy: 3633, 313 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-laser-drill-tiny +block-item-void-tiny rotate: false - xy: 1986, 87 + xy: 1025, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-laser-drill-xlarge +block-item-void-xlarge rotate: false xy: 395, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-launch-pad-large +block-junction-large rotate: false - xy: 3991, 371 + xy: 985, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-launch-pad-large-large +block-junction-medium rotate: false - xy: 131, 4 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-launch-pad-large-medium - rotate: false - xy: 2625, 253 + xy: 1365, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-launch-pad-large-small +block-junction-small rotate: false - xy: 2417, 141 + xy: 3659, 304 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-launch-pad-large-tiny +block-junction-tiny rotate: false - xy: 2022, 123 + xy: 1025, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-launch-pad-large-xlarge +block-junction-xlarge rotate: false xy: 445, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-launch-pad-medium +block-kiln-large rotate: false - xy: 1007, 177 + xy: 901, 203 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-kiln-medium + rotate: false + xy: 1399, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-launch-pad-small +block-kiln-small rotate: false - xy: 2443, 141 + xy: 3685, 304 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-launch-pad-tiny +block-kiln-tiny rotate: false - xy: 2022, 105 + xy: 1025, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-launch-pad-xlarge +block-kiln-xlarge rotate: false xy: 495, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-junction-large +block-lancer-large rotate: false - xy: 173, 4 + xy: 943, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-junction-medium +block-lancer-medium rotate: false - xy: 1007, 143 + xy: 1433, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-junction-small +block-lancer-small rotate: false - xy: 2469, 141 + xy: 3711, 304 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-junction-tiny +block-lancer-tiny rotate: false - xy: 2004, 87 + xy: 1025, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-junction-xlarge +block-lancer-xlarge rotate: false xy: 545, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-router-large +block-large-logic-display-large rotate: false - xy: 215, 4 + xy: 985, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-router-medium +block-large-logic-display-medium rotate: false - xy: 1007, 109 + xy: 1467, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-router-small +block-large-logic-display-small rotate: false - xy: 2495, 141 + xy: 3565, 287 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-router-tiny +block-large-logic-display-tiny rotate: false - xy: 2040, 123 + xy: 1025, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-router-xlarge +block-large-logic-display-xlarge rotate: false xy: 595, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-source-large +block-laser-drill-large rotate: false - xy: 4033, 371 + xy: 1027, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-source-medium +block-laser-drill-medium rotate: false - xy: 1007, 75 + xy: 1501, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-source-small +block-laser-drill-small rotate: false - xy: 2521, 141 + xy: 3591, 287 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-source-tiny +block-laser-drill-tiny rotate: false - xy: 2040, 105 + xy: 1025, 25 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-source-xlarge +block-laser-drill-xlarge rotate: false xy: 645, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-tank-large +block-launch-pad-large rotate: false - xy: 901, 221 + xy: 943, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-liquid-tank-medium +block-launch-pad-large-large rotate: false - xy: 1007, 41 + xy: 985, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-medium + rotate: false + xy: 1535, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-tank-small +block-launch-pad-large-small rotate: false - xy: 2547, 141 + xy: 3617, 287 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-tank-tiny +block-launch-pad-large-tiny rotate: false - xy: 2022, 87 + xy: 1007, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-tank-xlarge +block-launch-pad-large-xlarge rotate: false xy: 695, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-liquid-void-large +block-launch-pad-medium rotate: false - xy: 901, 179 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-liquid-void-medium - rotate: false - xy: 1007, 7 + xy: 1569, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-liquid-void-small +block-launch-pad-small rotate: false - xy: 2573, 141 + xy: 3595, 261 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-liquid-void-tiny +block-launch-pad-tiny rotate: false - xy: 2058, 123 + xy: 1025, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-liquid-void-xlarge +block-launch-pad-xlarge rotate: false xy: 231, 96 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-logic-display-large +block-liquid-junction-large rotate: false - xy: 881, 137 + xy: 1027, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-logic-display-medium +block-liquid-junction-medium rotate: false - xy: 1041, 177 + xy: 1603, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-logic-display-small +block-liquid-junction-small rotate: false - xy: 2599, 141 + xy: 3621, 261 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-logic-display-tiny +block-liquid-junction-tiny rotate: false - xy: 2058, 105 + xy: 4030, 212 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-logic-display-xlarge +block-liquid-junction-xlarge rotate: false xy: 231, 46 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-logic-processor-large +block-liquid-router-large rotate: false - xy: 881, 95 + xy: 1069, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-logic-processor-medium +block-liquid-router-medium rotate: false - xy: 1041, 143 + xy: 1637, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-logic-processor-small +block-liquid-router-small rotate: false - xy: 2625, 141 + xy: 3617, 235 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-logic-processor-tiny +block-liquid-router-tiny rotate: false - xy: 2040, 87 + xy: 4030, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-logic-processor-xlarge +block-liquid-router-xlarge rotate: false xy: 745, 354 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-magmarock-large +block-liquid-source-large rotate: false - xy: 881, 53 + xy: 985, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-magmarock-medium +block-liquid-source-medium rotate: false - xy: 1041, 109 + xy: 1671, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-magmarock-small +block-liquid-source-small rotate: false - xy: 4067, 345 + xy: 3617, 209 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-magmarock-tiny +block-liquid-source-tiny rotate: false - xy: 2076, 123 + xy: 2663, 141 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-magmarock-xlarge +block-liquid-source-xlarge rotate: false xy: 281, 107 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mass-driver-large +block-liquid-tank-large rotate: false - xy: 881, 11 + xy: 1027, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mass-driver-medium +block-liquid-tank-medium rotate: false - xy: 1041, 75 + xy: 1705, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mass-driver-small +block-liquid-tank-small rotate: false - xy: 2651, 227 + xy: 3614, 183 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mass-driver-tiny +block-liquid-tank-tiny rotate: false - xy: 2076, 105 + xy: 2666, 159 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mass-driver-xlarge +block-liquid-tank-xlarge rotate: false xy: 281, 57 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mechanical-drill-large +block-liquid-void-large rotate: false - xy: 923, 137 + xy: 1069, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mechanical-drill-medium +block-liquid-void-medium rotate: false - xy: 1041, 41 + xy: 1739, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mechanical-drill-small +block-liquid-void-small rotate: false - xy: 2651, 201 + xy: 3614, 157 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mechanical-drill-tiny +block-liquid-void-tiny rotate: false - xy: 2058, 87 + xy: 2663, 123 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mechanical-drill-xlarge +block-liquid-void-xlarge rotate: false xy: 795, 366 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mechanical-pump-large +block-logic-display-large rotate: false - xy: 923, 95 + xy: 1111, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mechanical-pump-medium +block-logic-display-medium rotate: false - xy: 1041, 7 + xy: 1773, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mechanical-pump-small +block-logic-display-small rotate: false - xy: 2651, 175 + xy: 3614, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mechanical-pump-tiny +block-logic-display-tiny rotate: false - xy: 2094, 123 + xy: 2661, 105 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mechanical-pump-xlarge +block-logic-display-xlarge rotate: false xy: 309, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-meltdown-large +block-logic-processor-large rotate: false - xy: 923, 53 + xy: 1027, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-meltdown-medium +block-logic-processor-medium rotate: false - xy: 1053, 211 + xy: 1807, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-meltdown-small +block-logic-processor-small rotate: false - xy: 2651, 149 + xy: 3611, 105 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-meltdown-tiny +block-logic-processor-tiny rotate: false - xy: 2094, 105 + xy: 2660, 87 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-meltdown-xlarge +block-logic-processor-xlarge rotate: false xy: 309, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-melter-large +block-magmarock-large rotate: false - xy: 923, 11 + xy: 1069, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-melter-medium +block-magmarock-medium rotate: false - xy: 1087, 219 + xy: 1841, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-melter-small +block-magmarock-small rotate: false - xy: 1747, 23 + xy: 1974, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-melter-tiny +block-magmarock-tiny rotate: false - xy: 2076, 87 + xy: 2660, 69 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-melter-xlarge +block-magmarock-xlarge rotate: false xy: 359, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-memory-cell-large +block-mass-driver-large rotate: false - xy: 1001, 321 + xy: 1111, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-memory-cell-medium +block-mass-driver-medium rotate: false - xy: 1121, 219 + xy: 1875, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-memory-cell-small +block-mass-driver-small rotate: false - xy: 1781, 57 + xy: 2000, 55 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-memory-cell-tiny +block-mass-driver-tiny rotate: false - xy: 2112, 123 + xy: 2660, 51 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-memory-cell-xlarge +block-mass-driver-xlarge rotate: false xy: 309, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mend-projector-large +block-mechanical-drill-large rotate: false - xy: 1043, 329 + xy: 1153, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mend-projector-medium +block-mechanical-drill-medium rotate: false - xy: 1155, 219 + xy: 1909, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mend-projector-small +block-mechanical-drill-small rotate: false - xy: 1773, 31 + xy: 2026, 49 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mend-projector-tiny +block-mechanical-drill-tiny rotate: false - xy: 2112, 105 + xy: 2660, 33 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mend-projector-xlarge +block-mechanical-drill-xlarge rotate: false xy: 359, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-mender-large +block-mechanical-pump-large rotate: false - xy: 1085, 329 + xy: 1069, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-mender-medium +block-mechanical-pump-medium rotate: false - xy: 1189, 219 + xy: 1943, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-mender-small +block-mechanical-pump-small rotate: false - xy: 1820, 93 + xy: 2052, 49 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-mender-tiny +block-mechanical-pump-tiny rotate: false - xy: 2094, 87 + xy: 4037, 264 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-mender-xlarge +block-mechanical-pump-xlarge rotate: false xy: 409, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-message-large +block-meltdown-large rotate: false - xy: 1127, 329 + xy: 1111, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-message-medium +block-meltdown-medium rotate: false - xy: 1223, 219 + xy: 1977, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-message-small +block-meltdown-small rotate: false - xy: 1880, 153 + xy: 3643, 235 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-message-tiny +block-meltdown-tiny rotate: false - xy: 2130, 123 + xy: 4037, 246 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-message-xlarge +block-meltdown-xlarge rotate: false xy: 359, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-2-large +block-melter-large rotate: false - xy: 1169, 329 + xy: 1153, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-2-medium +block-melter-medium rotate: false - xy: 1257, 219 + xy: 2011, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-2-small +block-melter-small rotate: false - xy: 1906, 155 + xy: 3643, 209 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-2-tiny +block-melter-tiny rotate: false - xy: 2130, 105 + xy: 4055, 266 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-2-xlarge +block-melter-xlarge rotate: false xy: 409, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-3-large +block-memory-bank-large rotate: false - xy: 1211, 329 + xy: 1195, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-3-medium +block-memory-bank-medium rotate: false - xy: 1291, 219 + xy: 2045, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-3-small +block-memory-bank-small rotate: false - xy: 1846, 119 + xy: 3640, 183 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-3-tiny +block-memory-bank-tiny rotate: false - xy: 2112, 87 + xy: 4055, 248 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-3-xlarge +block-memory-bank-xlarge rotate: false xy: 459, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-5-large +block-memory-cell-large rotate: false - xy: 1253, 329 + xy: 1111, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-5-medium +block-memory-cell-medium rotate: false - xy: 1325, 219 + xy: 2079, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-5-small +block-memory-cell-small rotate: false - xy: 1846, 93 + xy: 3640, 157 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-5-tiny +block-memory-cell-tiny rotate: false - xy: 2148, 123 + xy: 4073, 266 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-5-xlarge +block-memory-cell-xlarge rotate: false xy: 409, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-damaged-large +block-mend-projector-large rotate: false - xy: 1295, 329 + xy: 1153, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-damaged-medium +block-mend-projector-medium rotate: false - xy: 1359, 219 + xy: 2113, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-damaged-small +block-mend-projector-small rotate: false - xy: 1872, 127 + xy: 3640, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-damaged-tiny +block-mend-projector-tiny rotate: false - xy: 2148, 105 + xy: 4073, 248 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-damaged-xlarge +block-mend-projector-xlarge rotate: false xy: 459, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-metal-floor-large +block-mender-large rotate: false - xy: 1337, 329 + xy: 1195, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-metal-floor-medium +block-mender-medium rotate: false - xy: 1393, 219 + xy: 2147, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-metal-floor-small +block-mender-small rotate: false - xy: 1872, 101 + xy: 3637, 105 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-metal-floor-tiny +block-mender-tiny rotate: false - xy: 2130, 87 + xy: 4030, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-metal-floor-xlarge +block-mender-xlarge rotate: false xy: 509, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-micro-processor-large +block-message-large rotate: false - xy: 1379, 329 + xy: 1237, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-micro-processor-medium +block-message-medium rotate: false - xy: 1427, 219 + xy: 2181, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-micro-processor-small +block-message-small rotate: false - xy: 2651, 123 + xy: 3647, 261 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-micro-processor-tiny +block-message-tiny rotate: false - xy: 2166, 123 + xy: 4030, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-micro-processor-xlarge +block-message-xlarge rotate: false xy: 459, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-moss-large +block-metal-floor-2-large rotate: false - xy: 1421, 329 + xy: 1153, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-moss-medium +block-metal-floor-2-medium rotate: false - xy: 1461, 219 + xy: 2215, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-moss-small +block-metal-floor-2-small rotate: false - xy: 1773, 5 + xy: 3673, 278 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-moss-tiny +block-metal-floor-2-tiny rotate: false - xy: 2166, 105 + xy: 4030, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-moss-xlarge +block-metal-floor-2-xlarge rotate: false xy: 509, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-multi-press-large +block-metal-floor-3-large rotate: false - xy: 1463, 329 + xy: 1195, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-multi-press-medium +block-metal-floor-3-medium rotate: false - xy: 1495, 219 + xy: 2249, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-multi-press-small +block-metal-floor-3-small rotate: false - xy: 1799, 31 + xy: 3699, 278 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-multi-press-tiny +block-metal-floor-3-tiny rotate: false - xy: 2148, 87 + xy: 4030, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-multi-press-xlarge +block-metal-floor-3-xlarge rotate: false xy: 559, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-large +block-metal-floor-5-large rotate: false - xy: 1505, 329 + xy: 1237, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-medium +block-metal-floor-5-medium rotate: false - xy: 1529, 219 + xy: 2283, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-small +block-metal-floor-5-small rotate: false - xy: 1799, 5 + xy: 3673, 252 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-tiny +block-metal-floor-5-tiny rotate: false - xy: 2184, 123 + xy: 4030, 104 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-multiplicative-reconstructor-xlarge +block-metal-floor-5-xlarge rotate: false xy: 509, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-naval-factory-large +block-metal-floor-damaged-large rotate: false - xy: 1547, 329 + xy: 1279, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-naval-factory-medium +block-metal-floor-damaged-medium rotate: false - xy: 1563, 219 + xy: 2317, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-naval-factory-small +block-metal-floor-damaged-small rotate: false - xy: 1898, 127 + xy: 3699, 252 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-naval-factory-tiny +block-metal-floor-damaged-tiny rotate: false - xy: 2184, 105 + xy: 2681, 141 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-naval-factory-xlarge +block-metal-floor-damaged-xlarge rotate: false xy: 559, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-oil-extractor-large +block-metal-floor-large rotate: false - xy: 1589, 329 + xy: 1195, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-oil-extractor-medium +block-metal-floor-medium rotate: false - xy: 1597, 219 + xy: 2351, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-oil-extractor-small +block-metal-floor-small rotate: false - xy: 1898, 101 + xy: 3669, 226 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-oil-extractor-tiny +block-metal-floor-tiny rotate: false - xy: 2166, 87 + xy: 2681, 123 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-oil-extractor-xlarge +block-metal-floor-xlarge rotate: false xy: 609, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-coal-large +block-micro-processor-large rotate: false - xy: 1631, 329 + xy: 1237, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-coal-medium +block-micro-processor-medium rotate: false - xy: 1631, 219 + xy: 2385, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-coal-small +block-micro-processor-small rotate: false - xy: 1872, 75 + xy: 3695, 226 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-coal-tiny +block-micro-processor-tiny rotate: false - xy: 2202, 123 + xy: 2679, 105 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-coal-xlarge +block-micro-processor-xlarge rotate: false xy: 559, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-copper-large +block-moss-large rotate: false - xy: 1673, 329 + xy: 1279, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-copper-medium +block-moss-medium rotate: false - xy: 1665, 219 + xy: 2419, 135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-copper-small +block-moss-small rotate: false - xy: 1898, 75 + xy: 3669, 200 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-copper-tiny +block-moss-tiny rotate: false - xy: 2202, 105 + xy: 2678, 87 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-copper-xlarge +block-moss-xlarge rotate: false xy: 609, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-lead-large +block-mud-large rotate: false - xy: 1715, 329 + xy: 1321, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-lead-medium +block-mud-medium rotate: false - xy: 1699, 219 + xy: 2453, 126 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-lead-small +block-mud-small rotate: false - xy: 3720, 245 + xy: 3695, 200 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-lead-tiny +block-mud-tiny rotate: false - xy: 2184, 87 + xy: 2678, 69 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-lead-xlarge +block-mud-xlarge rotate: false xy: 659, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-scrap-large +block-multi-press-large rotate: false - xy: 1757, 329 + xy: 1237, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-scrap-medium +block-multi-press-medium rotate: false - xy: 1733, 219 + xy: 2487, 111 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-scrap-small +block-multi-press-small rotate: false - xy: 3746, 245 + xy: 3666, 174 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-scrap-tiny +block-multi-press-tiny rotate: false - xy: 2220, 123 + xy: 2678, 51 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-scrap-xlarge +block-multi-press-xlarge rotate: false xy: 609, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-thorium-large +block-multiplicative-reconstructor-large rotate: false - xy: 1799, 329 + xy: 1279, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-thorium-medium +block-multiplicative-reconstructor-medium rotate: false - xy: 1767, 219 + xy: 2531, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-thorium-small +block-multiplicative-reconstructor-small rotate: false - xy: 3772, 245 + xy: 3666, 148 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-thorium-tiny +block-multiplicative-reconstructor-tiny rotate: false - xy: 2220, 105 + xy: 2678, 33 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-thorium-xlarge +block-multiplicative-reconstructor-xlarge rotate: false xy: 659, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ore-titanium-large +block-naval-factory-large rotate: false - xy: 1841, 329 + xy: 1321, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ore-titanium-medium +block-naval-factory-medium rotate: false - xy: 1801, 219 + xy: 2523, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ore-titanium-small +block-naval-factory-small rotate: false - xy: 3798, 245 + xy: 3692, 174 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ore-titanium-tiny +block-naval-factory-tiny rotate: false - xy: 2202, 87 + xy: 2684, 159 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ore-titanium-xlarge +block-naval-factory-xlarge rotate: false xy: 709, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-dome-large +block-oil-extractor-large rotate: false - xy: 1883, 329 + xy: 1363, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-dome-medium +block-oil-extractor-medium rotate: false - xy: 1835, 219 + xy: 2521, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-dome-small +block-oil-extractor-small rotate: false - xy: 3824, 245 + xy: 3692, 148 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-dome-tiny +block-oil-extractor-tiny rotate: false - xy: 2238, 123 + xy: 2702, 159 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-dome-xlarge +block-oil-extractor-xlarge rotate: false xy: 659, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overdrive-projector-large +block-ore-coal-large rotate: false - xy: 1925, 329 + xy: 1279, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overdrive-projector-medium +block-ore-coal-medium rotate: false - xy: 1869, 219 + xy: 2521, 111 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overdrive-projector-small +block-ore-coal-small rotate: false - xy: 3850, 245 + xy: 3666, 122 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overdrive-projector-tiny +block-ore-coal-tiny rotate: false - xy: 2238, 105 + xy: 2699, 141 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overdrive-projector-xlarge +block-ore-coal-xlarge rotate: false xy: 709, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-overflow-gate-large +block-ore-copper-large rotate: false - xy: 1967, 329 + xy: 1321, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-overflow-gate-medium +block-ore-copper-medium rotate: false - xy: 1903, 219 + xy: 2565, 217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-overflow-gate-small +block-ore-copper-small rotate: false - xy: 3876, 245 + xy: 3692, 122 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-overflow-gate-tiny +block-ore-copper-tiny rotate: false - xy: 2220, 87 + xy: 2699, 123 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-overflow-gate-xlarge +block-ore-copper-xlarge rotate: false xy: 709, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-parallax-large +block-ore-lead-large rotate: false - xy: 2009, 329 + xy: 1363, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-parallax-medium +block-ore-lead-medium rotate: false - xy: 1937, 219 + xy: 2599, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-parallax-small +block-ore-lead-small rotate: false - xy: 3902, 245 + xy: 3663, 96 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-parallax-tiny +block-ore-lead-tiny rotate: false - xy: 2256, 123 + xy: 2697, 105 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-parallax-xlarge +block-ore-lead-xlarge rotate: false xy: 759, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-payload-conveyor-large +block-ore-scrap-large rotate: false - xy: 2051, 329 + xy: 1405, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-payload-conveyor-medium +block-ore-scrap-medium rotate: false - xy: 1971, 219 + xy: 2633, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-payload-conveyor-small +block-ore-scrap-small rotate: false - xy: 3928, 245 + xy: 3689, 96 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-payload-conveyor-tiny +block-ore-scrap-tiny rotate: false - xy: 2256, 105 + xy: 2696, 87 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-payload-conveyor-xlarge +block-ore-scrap-xlarge rotate: false xy: 759, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-payload-router-large +block-ore-thorium-large rotate: false - xy: 2093, 329 + xy: 1321, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-payload-router-medium +block-ore-thorium-medium rotate: false - xy: 2005, 219 + xy: 2667, 220 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-payload-router-small +block-ore-thorium-small rotate: false - xy: 3954, 245 + xy: 3725, 278 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-payload-router-tiny +block-ore-thorium-tiny rotate: false - xy: 2238, 87 + xy: 2696, 69 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-payload-router-xlarge +block-ore-thorium-xlarge rotate: false xy: 759, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pebbles-large +block-ore-titanium-large rotate: false - xy: 2135, 329 + xy: 1363, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pebbles-medium +block-ore-titanium-medium rotate: false - xy: 2039, 219 + xy: 2701, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pebbles-small +block-ore-titanium-small rotate: false - xy: 3980, 245 + xy: 3725, 252 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pebbles-tiny +block-ore-titanium-tiny rotate: false - xy: 2274, 123 + xy: 2696, 51 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pebbles-xlarge +block-ore-titanium-xlarge rotate: false xy: 809, 316 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conduit-large +block-overdrive-dome-large rotate: false - xy: 2177, 329 + xy: 1405, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conduit-medium +block-overdrive-dome-medium rotate: false - xy: 2073, 219 + xy: 2667, 186 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conduit-small +block-overdrive-dome-small rotate: false - xy: 4006, 245 + xy: 3721, 226 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conduit-tiny +block-overdrive-dome-tiny rotate: false - xy: 2274, 105 + xy: 2696, 33 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conduit-xlarge +block-overdrive-dome-xlarge rotate: false xy: 809, 266 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-conveyor-large +block-overdrive-projector-large rotate: false - xy: 2219, 329 + xy: 1447, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-conveyor-medium +block-overdrive-projector-medium rotate: false - xy: 2107, 219 + xy: 2701, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-conveyor-small +block-overdrive-projector-small rotate: false - xy: 4032, 245 + xy: 3721, 200 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-conveyor-tiny +block-overdrive-projector-tiny rotate: false - xy: 2256, 87 + xy: 2717, 141 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-conveyor-xlarge +block-overdrive-projector-xlarge rotate: false xy: 809, 216 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-large +block-overflow-gate-large rotate: false - xy: 2261, 329 + xy: 1363, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-wall-large-large +block-overflow-gate-medium rotate: false - xy: 2303, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-phase-wall-large-medium - rotate: false - xy: 2141, 219 + xy: 2741, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-wall-large-small +block-overflow-gate-small rotate: false - xy: 4058, 245 + xy: 3718, 174 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-wall-large-tiny +block-overflow-gate-tiny rotate: false - xy: 2292, 123 + xy: 2735, 141 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-wall-large-xlarge +block-overflow-gate-xlarge rotate: false xy: 809, 166 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-wall-medium +block-parallax-large rotate: false - xy: 2175, 219 + xy: 1405, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-parallax-medium + rotate: false + xy: 2735, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-wall-small +block-parallax-small rotate: false - xy: 1924, 129 + xy: 3718, 148 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-wall-tiny +block-parallax-tiny rotate: false - xy: 2292, 105 + xy: 2717, 123 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-wall-xlarge +block-parallax-xlarge rotate: false xy: 281, 7 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-phase-weaver-large +block-payload-conveyor-large rotate: false - xy: 2345, 329 + xy: 1447, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-phase-weaver-medium +block-payload-conveyor-medium rotate: false - xy: 2209, 219 + xy: 2775, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-phase-weaver-small +block-payload-conveyor-small rotate: false - xy: 1924, 103 + xy: 3718, 122 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-phase-weaver-tiny +block-payload-conveyor-tiny rotate: false - xy: 2274, 87 + xy: 2715, 105 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-phase-weaver-xlarge +block-payload-conveyor-xlarge rotate: false xy: 331, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pine-large +block-payload-router-large rotate: false - xy: 2387, 329 + xy: 1489, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pine-medium +block-payload-router-medium rotate: false - xy: 2243, 219 + xy: 2809, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pine-small +block-payload-router-small rotate: false - xy: 1924, 77 + xy: 3715, 96 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pine-tiny +block-payload-router-tiny rotate: false - xy: 2310, 123 + xy: 2714, 87 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pine-xlarge +block-payload-router-xlarge rotate: false xy: 331, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-compressor-large +block-pebbles-large rotate: false - xy: 2429, 329 + xy: 1405, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-compressor-medium +block-pebbles-medium rotate: false - xy: 2277, 219 + xy: 2769, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-compressor-small +block-pebbles-small rotate: false - xy: 1807, 59 + xy: 3751, 287 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-compressor-tiny +block-pebbles-tiny rotate: false - xy: 2310, 105 + xy: 2735, 123 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-compressor-xlarge +block-pebbles-xlarge rotate: false xy: 381, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-conveyor-large +block-phase-conduit-large rotate: false - xy: 2471, 329 + xy: 1447, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-conveyor-medium +block-phase-conduit-medium rotate: false - xy: 2311, 219 + xy: 2803, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-conveyor-small +block-phase-conduit-small rotate: false - xy: 1833, 67 + xy: 3751, 261 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-conveyor-tiny +block-phase-conduit-tiny rotate: false - xy: 2292, 87 + xy: 2733, 105 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-conveyor-xlarge +block-phase-conduit-xlarge rotate: false xy: 331, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-large +block-phase-conveyor-large rotate: false - xy: 2513, 329 + xy: 1489, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-plastanium-wall-large-large +block-phase-conveyor-medium rotate: false - xy: 2555, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plastanium-wall-large-medium - rotate: false - xy: 2345, 219 + xy: 2735, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-wall-large-small +block-phase-conveyor-small rotate: false - xy: 1833, 41 + xy: 3777, 287 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-wall-large-tiny +block-phase-conveyor-tiny rotate: false - xy: 2328, 123 + xy: 2732, 87 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-wall-large-xlarge +block-phase-conveyor-xlarge rotate: false xy: 381, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plastanium-wall-medium +block-phase-wall-large rotate: false - xy: 2379, 219 + xy: 1531, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-large + rotate: false + xy: 1447, 203 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-medium + rotate: false + xy: 2769, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plastanium-wall-small +block-phase-wall-large-small rotate: false - xy: 1825, 15 + xy: 3777, 261 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plastanium-wall-tiny +block-phase-wall-large-tiny rotate: false - xy: 2328, 105 + xy: 2714, 69 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plastanium-wall-xlarge +block-phase-wall-large-xlarge rotate: false xy: 431, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-plated-conduit-large +block-phase-wall-medium rotate: false - xy: 2597, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-plated-conduit-medium - rotate: false - xy: 2413, 219 + xy: 2803, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-plated-conduit-small +block-phase-wall-small rotate: false - xy: 1859, 49 + xy: 3803, 287 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-plated-conduit-tiny +block-phase-wall-tiny rotate: false - xy: 2310, 87 + xy: 2714, 51 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-plated-conduit-xlarge +block-phase-wall-xlarge rotate: false xy: 381, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pneumatic-drill-large +block-phase-weaver-large rotate: false - xy: 2639, 329 + xy: 1489, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pneumatic-drill-medium +block-phase-weaver-medium rotate: false - xy: 2447, 219 + xy: 2557, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pneumatic-drill-small +block-phase-weaver-small rotate: false - xy: 1885, 49 + xy: 3803, 261 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pneumatic-drill-tiny +block-phase-weaver-tiny rotate: false - xy: 2346, 123 + xy: 2732, 69 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pneumatic-drill-xlarge +block-phase-weaver-xlarge rotate: false xy: 431, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-large +block-pine-large rotate: false - xy: 2681, 329 + xy: 1531, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-node-large-large +block-pine-medium rotate: false - xy: 2723, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-power-node-large-medium - rotate: false - xy: 2481, 219 + xy: 2555, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-node-large-small +block-pine-small rotate: false - xy: 1911, 49 + xy: 3829, 261 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-node-large-tiny +block-pine-tiny rotate: false - xy: 2346, 105 + xy: 2714, 33 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-node-large-xlarge +block-pine-xlarge rotate: false xy: 481, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-node-medium +block-plastanium-compressor-large rotate: false - xy: 2515, 219 + xy: 1573, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-compressor-medium + rotate: false + xy: 2555, 111 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-node-small +block-plastanium-compressor-small rotate: false - xy: 1937, 51 + xy: 3855, 261 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-node-tiny +block-plastanium-compressor-tiny rotate: false - xy: 2328, 87 + xy: 2732, 51 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-node-xlarge +block-plastanium-compressor-xlarge rotate: false xy: 431, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-source-large +block-plastanium-conveyor-large rotate: false - xy: 2765, 329 + xy: 1489, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-source-medium +block-plastanium-conveyor-medium rotate: false - xy: 2549, 219 + xy: 2843, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-source-small +block-plastanium-conveyor-small rotate: false - xy: 1851, 15 + xy: 3881, 261 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-source-tiny +block-plastanium-conveyor-tiny rotate: false - xy: 2364, 123 + xy: 2732, 33 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-source-xlarge +block-plastanium-conveyor-xlarge rotate: false xy: 481, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-power-void-large +block-plastanium-wall-large rotate: false - xy: 2807, 329 + xy: 1531, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-power-void-medium +block-plastanium-wall-large-large rotate: false - xy: 2583, 219 + xy: 1573, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-medium + rotate: false + xy: 2837, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-power-void-small +block-plastanium-wall-large-small rotate: false - xy: 1877, 23 + xy: 3907, 261 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-power-void-tiny +block-plastanium-wall-large-tiny rotate: false - xy: 2364, 105 + xy: 4055, 230 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-power-void-xlarge +block-plastanium-wall-large-xlarge rotate: false xy: 531, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulse-conduit-large +block-plastanium-wall-medium rotate: false - xy: 2849, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-pulse-conduit-medium - rotate: false - xy: 2617, 219 + xy: 2837, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulse-conduit-small +block-plastanium-wall-small rotate: false - xy: 1903, 23 + xy: 3933, 261 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulse-conduit-tiny +block-plastanium-wall-tiny rotate: false - xy: 2346, 87 + xy: 4073, 230 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulse-conduit-xlarge +block-plastanium-wall-xlarge rotate: false xy: 481, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pulverizer-large +block-plated-conduit-large rotate: false - xy: 2891, 329 + xy: 1615, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pulverizer-medium +block-plated-conduit-medium rotate: false - xy: 1075, 177 + xy: 2851, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pulverizer-small +block-plated-conduit-small rotate: false - xy: 1929, 23 + xy: 3751, 235 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pulverizer-tiny +block-plated-conduit-tiny rotate: false - xy: 2382, 123 + xy: 4048, 212 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pulverizer-xlarge +block-plated-conduit-xlarge rotate: false xy: 531, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-pyratite-mixer-large +block-pneumatic-drill-large rotate: false - xy: 2933, 329 + xy: 1531, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-pyratite-mixer-medium +block-pneumatic-drill-medium rotate: false - xy: 1075, 143 + xy: 2877, 219 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-pyratite-mixer-small +block-pneumatic-drill-small rotate: false - xy: 1955, 25 + xy: 3777, 235 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-pyratite-mixer-tiny +block-pneumatic-drill-tiny rotate: false - xy: 2382, 105 + xy: 4066, 212 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-pyratite-mixer-xlarge +block-pneumatic-drill-xlarge rotate: false xy: 581, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-repair-point-large +block-power-node-large rotate: false - xy: 2975, 329 + xy: 1573, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-repair-point-medium +block-power-node-large-large rotate: false - xy: 1075, 109 + xy: 1615, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-medium + rotate: false + xy: 2871, 185 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-repair-point-small +block-power-node-large-small rotate: false - xy: 2833, 235 + xy: 3803, 235 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-repair-point-tiny +block-power-node-large-tiny rotate: false - xy: 2364, 87 + xy: 4048, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-repair-point-xlarge +block-power-node-large-xlarge rotate: false xy: 531, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-resupply-point-large +block-power-node-medium rotate: false - xy: 3017, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-resupply-point-medium - rotate: false - xy: 1075, 75 + xy: 2871, 151 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-resupply-point-small +block-power-node-small rotate: false - xy: 2859, 227 + xy: 3829, 235 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-resupply-point-tiny +block-power-node-tiny rotate: false - xy: 2400, 123 + xy: 4066, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-resupply-point-xlarge +block-power-node-xlarge rotate: false xy: 581, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-ripple-large +block-power-source-large rotate: false - xy: 3059, 329 + xy: 1657, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-ripple-medium +block-power-source-medium rotate: false - xy: 1075, 41 + xy: 2885, 253 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-ripple-small +block-power-source-small rotate: false - xy: 2885, 227 + xy: 3855, 235 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-ripple-tiny +block-power-source-tiny rotate: false - xy: 2400, 105 + xy: 4048, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-ripple-xlarge +block-power-source-xlarge rotate: false xy: 631, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rock-large +block-power-void-large rotate: false - xy: 3101, 329 + xy: 1573, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rock-medium +block-power-void-medium rotate: false - xy: 1075, 7 + xy: 2919, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rock-small +block-power-void-small rotate: false - xy: 2911, 227 + xy: 3881, 235 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rock-tiny +block-power-void-tiny rotate: false - xy: 2382, 87 + xy: 4066, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rock-xlarge +block-power-void-xlarge rotate: false xy: 581, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rocks-large +block-pulse-conduit-large rotate: false - xy: 3143, 329 + xy: 1615, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rocks-medium +block-pulse-conduit-medium rotate: false - xy: 1109, 185 + xy: 2953, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rocks-small +block-pulse-conduit-small rotate: false - xy: 2937, 227 + xy: 3907, 235 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rocks-tiny +block-pulse-conduit-tiny rotate: false - xy: 2418, 123 + xy: 4048, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rocks-xlarge +block-pulse-conduit-xlarge rotate: false xy: 631, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rotary-pump-large +block-pulverizer-large rotate: false - xy: 3185, 329 + xy: 1657, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rotary-pump-medium +block-pulverizer-medium rotate: false - xy: 1109, 151 + xy: 2987, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rotary-pump-small +block-pulverizer-small rotate: false - xy: 2963, 227 + xy: 3933, 235 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rotary-pump-tiny +block-pulverizer-tiny rotate: false - xy: 2418, 105 + xy: 4066, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rotary-pump-xlarge +block-pulverizer-xlarge rotate: false xy: 681, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-router-large +block-pyratite-mixer-large rotate: false - xy: 3227, 329 + xy: 1699, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-router-medium +block-pyratite-mixer-medium rotate: false - xy: 1143, 185 + xy: 3021, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-router-small +block-pyratite-mixer-small rotate: false - xy: 2989, 227 + xy: 3747, 209 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-router-tiny +block-pyratite-mixer-tiny rotate: false - xy: 2400, 87 + xy: 4048, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-router-xlarge +block-pyratite-mixer-xlarge rotate: false xy: 631, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-rtg-generator-large +block-repair-point-large rotate: false - xy: 3269, 329 + xy: 1615, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-rtg-generator-medium +block-repair-point-medium rotate: false - xy: 1109, 117 + xy: 3055, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-rtg-generator-small +block-repair-point-small rotate: false - xy: 3015, 227 + xy: 3773, 209 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-rtg-generator-tiny +block-repair-point-tiny rotate: false - xy: 2436, 123 + xy: 4066, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-rtg-generator-xlarge +block-repair-point-xlarge rotate: false xy: 681, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salt-large +block-resupply-point-large rotate: false - xy: 3311, 329 + xy: 1657, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salt-medium +block-resupply-point-medium rotate: false - xy: 1143, 151 + xy: 3089, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salt-small +block-resupply-point-small rotate: false - xy: 3041, 227 + xy: 3799, 209 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salt-tiny +block-resupply-point-tiny rotate: false - xy: 2436, 105 + xy: 4048, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salt-xlarge +block-resupply-point-xlarge rotate: false xy: 731, 154 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-saltrocks-large +block-ripple-large rotate: false - xy: 3353, 329 + xy: 1699, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-saltrocks-medium +block-ripple-medium rotate: false - xy: 1177, 185 + xy: 3123, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-saltrocks-small +block-ripple-small rotate: false - xy: 3067, 227 + xy: 3825, 209 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-saltrocks-tiny +block-ripple-tiny rotate: false - xy: 2418, 87 + xy: 4066, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-saltrocks-xlarge +block-ripple-xlarge rotate: false xy: 681, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-salvo-large +block-rotary-pump-large rotate: false - xy: 3395, 329 + xy: 1741, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-salvo-medium +block-rotary-pump-medium rotate: false - xy: 1109, 83 + xy: 3157, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-salvo-small +block-rotary-pump-small rotate: false - xy: 3093, 227 + xy: 3851, 209 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-salvo-tiny +block-rotary-pump-tiny rotate: false - xy: 2454, 123 + xy: 4048, 104 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-salvo-xlarge +block-rotary-pump-xlarge rotate: false xy: 731, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-boulder-large +block-router-large rotate: false - xy: 3437, 329 + xy: 1657, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-boulder-medium +block-router-medium rotate: false - xy: 1143, 117 + xy: 3191, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-boulder-small +block-router-small rotate: false - xy: 3119, 227 + xy: 3877, 209 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-boulder-tiny +block-router-tiny rotate: false - xy: 2454, 105 + xy: 4066, 104 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-boulder-xlarge +block-router-xlarge rotate: false xy: 731, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-large +block-rtg-generator-large rotate: false - xy: 3479, 329 + xy: 1699, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sand-medium +block-rtg-generator-medium rotate: false - xy: 1177, 151 + xy: 3225, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sand-small +block-rtg-generator-small rotate: false - xy: 3145, 227 + xy: 3903, 209 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sand-tiny +block-rtg-generator-tiny rotate: false - xy: 2436, 87 + xy: 4053, 86 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sand-water-large - rotate: false - xy: 3521, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sand-water-medium - rotate: false - xy: 1211, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sand-water-small - rotate: false - xy: 3171, 227 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sand-water-tiny - rotate: false - xy: 2472, 123 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sand-water-xlarge +block-rtg-generator-xlarge rotate: false xy: 331, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sand-xlarge +block-salt-large + rotate: false + xy: 1741, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salt-medium + rotate: false + xy: 3259, 274 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-small + rotate: false + xy: 3929, 209 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salt-tiny + rotate: false + xy: 4071, 86 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salt-wall-large + rotate: false + xy: 1783, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salt-wall-medium + rotate: false + xy: 3293, 274 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-wall-small + rotate: false + xy: 3747, 183 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salt-wall-tiny + rotate: false + xy: 4053, 68 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salt-wall-xlarge rotate: false xy: 381, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sandrocks-large - rotate: false - xy: 3563, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-sandrocks-medium - rotate: false - xy: 1109, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-sandrocks-small - rotate: false - xy: 3197, 227 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-sandrocks-tiny - rotate: false - xy: 2472, 105 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-sandrocks-xlarge +block-salt-xlarge rotate: false xy: 431, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scatter-large +block-salvo-large rotate: false - xy: 3605, 329 + xy: 1699, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scatter-medium +block-salvo-medium rotate: false - xy: 1143, 83 + xy: 3327, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scatter-small +block-salvo-small rotate: false - xy: 3223, 227 + xy: 3773, 183 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scatter-tiny +block-salvo-tiny rotate: false - xy: 2454, 87 + xy: 4071, 68 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scatter-xlarge +block-salvo-xlarge rotate: false xy: 481, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scorch-large +block-sand-boulder-large rotate: false - xy: 3647, 329 + xy: 1741, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scorch-medium +block-sand-boulder-medium rotate: false - xy: 1177, 117 + xy: 3361, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scorch-small +block-sand-boulder-small rotate: false - xy: 3249, 227 + xy: 3799, 183 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scorch-tiny +block-sand-boulder-tiny rotate: false - xy: 2490, 123 + xy: 2753, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scorch-xlarge +block-sand-boulder-xlarge rotate: false xy: 531, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-large +block-sand-large rotate: false - xy: 3689, 329 + xy: 1783, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-medium +block-sand-medium rotate: false - xy: 1211, 151 + xy: 3395, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-small +block-sand-small rotate: false - xy: 3275, 227 + xy: 3825, 183 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-tiny +block-sand-tiny rotate: false - xy: 2490, 105 + xy: 2771, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-gigantic-xlarge +block-sand-wall-large + rotate: false + xy: 1825, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-wall-medium + rotate: false + xy: 3429, 274 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-wall-small + rotate: false + xy: 3851, 183 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-wall-tiny + rotate: false + xy: 2789, 133 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-wall-xlarge rotate: false xy: 581, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-huge-large +block-sand-water-large rotate: false - xy: 3731, 329 + xy: 1741, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-scrap-wall-huge-medium +block-sand-water-medium rotate: false - xy: 1245, 185 + xy: 3463, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-huge-small +block-sand-water-small rotate: false - xy: 3301, 227 + xy: 3877, 183 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-huge-tiny +block-sand-water-tiny rotate: false - xy: 2472, 87 + xy: 2807, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-huge-xlarge +block-sand-water-xlarge rotate: false xy: 631, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-large - rotate: false - xy: 3773, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-large - rotate: false - xy: 3815, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-scrap-wall-large-medium - rotate: false - xy: 1109, 15 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-scrap-wall-large-small - rotate: false - xy: 3327, 227 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-scrap-wall-large-tiny - rotate: false - xy: 2508, 123 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-scrap-wall-large-xlarge +block-sand-xlarge rotate: false xy: 681, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-scrap-wall-medium +block-scatter-large rotate: false - xy: 1143, 49 + xy: 1783, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scatter-medium + rotate: false + xy: 3497, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-scrap-wall-small +block-scatter-small rotate: false - xy: 3353, 227 + xy: 3903, 183 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-scrap-wall-tiny +block-scatter-tiny rotate: false - xy: 2508, 105 + xy: 2825, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-scrap-wall-xlarge +block-scatter-xlarge rotate: false xy: 731, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-segment-large +block-scorch-large rotate: false - xy: 3857, 329 + xy: 1825, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-segment-medium +block-scorch-medium rotate: false - xy: 1177, 83 + xy: 2919, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-segment-small +block-scorch-small rotate: false - xy: 3379, 227 + xy: 3929, 183 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-segment-tiny +block-scorch-tiny rotate: false - xy: 2490, 87 + xy: 2843, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-segment-xlarge +block-scorch-xlarge rotate: false xy: 781, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-separator-large +block-scrap-wall-gigantic-large rotate: false - xy: 3899, 329 + xy: 1867, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-separator-medium +block-scrap-wall-gigantic-medium rotate: false - xy: 1211, 117 + xy: 2953, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-separator-small +block-scrap-wall-gigantic-small rotate: false - xy: 3405, 227 + xy: 3744, 157 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-separator-tiny +block-scrap-wall-gigantic-tiny rotate: false - xy: 2526, 123 + xy: 2861, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-separator-xlarge +block-scrap-wall-gigantic-xlarge rotate: false xy: 781, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-boulder-large +block-scrap-wall-huge-large rotate: false - xy: 3941, 329 + xy: 1783, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shale-boulder-medium +block-scrap-wall-huge-medium rotate: false - xy: 1245, 151 + xy: 2987, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-boulder-small +block-scrap-wall-huge-small rotate: false - xy: 3431, 227 + xy: 3744, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-boulder-tiny +block-scrap-wall-huge-tiny rotate: false - xy: 2526, 105 + xy: 2879, 133 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-boulder-xlarge +block-scrap-wall-huge-xlarge rotate: false xy: 781, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shale-large +block-scrap-wall-large rotate: false - xy: 3983, 329 + xy: 1825, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shale-medium +block-scrap-wall-large-large rotate: false - xy: 1279, 185 + xy: 1867, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-medium + rotate: false + xy: 3021, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shale-small +block-scrap-wall-large-small rotate: false - xy: 3457, 227 + xy: 3770, 157 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shale-tiny +block-scrap-wall-large-tiny rotate: false - xy: 2508, 87 + xy: 2753, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shale-xlarge +block-scrap-wall-large-xlarge rotate: false xy: 831, 116 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shalerocks-large +block-scrap-wall-medium rotate: false - xy: 4025, 329 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-shalerocks-medium - rotate: false - xy: 1143, 15 + xy: 3055, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shalerocks-small +block-scrap-wall-small rotate: false - xy: 3483, 227 + xy: 3770, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shalerocks-tiny +block-scrap-wall-tiny rotate: false - xy: 2544, 123 + xy: 2771, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shalerocks-xlarge +block-scrap-wall-xlarge rotate: false xy: 831, 66 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shock-mine-large +block-segment-large rotate: false - xy: 951, 271 + xy: 1909, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shock-mine-medium +block-segment-medium rotate: false - xy: 1177, 49 + xy: 3089, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shock-mine-small +block-segment-small rotate: false - xy: 3509, 227 + xy: 3796, 157 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shock-mine-tiny +block-segment-tiny rotate: false - xy: 2544, 105 + xy: 2789, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shock-mine-xlarge +block-segment-xlarge rotate: false xy: 831, 16 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-shrubs-large +block-separator-large rotate: false - xy: 943, 229 + xy: 1825, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-shrubs-medium +block-separator-medium rotate: false - xy: 1211, 83 + xy: 3123, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-shrubs-small +block-separator-small rotate: false - xy: 3535, 227 + xy: 3796, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-shrubs-tiny +block-separator-tiny rotate: false - xy: 2526, 87 + xy: 2807, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-shrubs-xlarge +block-separator-xlarge rotate: false xy: 859, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-silicon-crucible-large +block-shale-boulder-large rotate: false - xy: 943, 187 + xy: 1867, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-silicon-crucible-medium +block-shale-boulder-medium rotate: false - xy: 1245, 117 + xy: 3157, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-silicon-crucible-small +block-shale-boulder-small rotate: false - xy: 3561, 227 + xy: 3822, 157 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-silicon-crucible-tiny +block-shale-boulder-tiny rotate: false - xy: 2562, 123 + xy: 2825, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-silicon-crucible-xlarge +block-shale-boulder-xlarge rotate: false xy: 909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-silicon-smelter-large +block-shale-large rotate: false - xy: 993, 279 + xy: 1909, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-silicon-smelter-medium +block-shale-medium rotate: false - xy: 1279, 151 + xy: 3191, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-silicon-smelter-small +block-shale-small rotate: false - xy: 3587, 227 + xy: 3822, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-silicon-smelter-tiny +block-shale-tiny rotate: false - xy: 2562, 105 + xy: 2843, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-silicon-smelter-xlarge +block-shale-wall-large + rotate: false + xy: 1951, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-wall-medium + rotate: false + xy: 3225, 240 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-wall-small + rotate: false + xy: 3848, 157 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-wall-tiny + rotate: false + xy: 2861, 115 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-wall-xlarge rotate: false xy: 959, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-slag-large - rotate: false - xy: 965, 145 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-slag-medium - rotate: false - xy: 1313, 185 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-slag-small - rotate: false - xy: 3613, 227 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-slag-tiny - rotate: false - xy: 2544, 87 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-slag-xlarge +block-shale-xlarge rotate: false xy: 1009, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-large +block-shock-mine-large rotate: false - xy: 965, 103 + xy: 1867, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snow-medium +block-shock-mine-medium rotate: false - xy: 1177, 15 + xy: 3259, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snow-pine-large +block-shock-mine-small rotate: false - xy: 965, 61 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-snow-pine-medium - rotate: false - xy: 1211, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-snow-pine-small - rotate: false - xy: 3639, 227 + xy: 3848, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snow-pine-tiny +block-shock-mine-tiny rotate: false - xy: 2580, 123 + xy: 2879, 115 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snow-pine-xlarge +block-shock-mine-xlarge rotate: false xy: 1059, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snow-small +block-shrubs-large rotate: false - xy: 3665, 227 + xy: 1909, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shrubs-medium + rotate: false + xy: 3293, 240 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-small + rotate: false + xy: 3874, 157 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snow-tiny +block-shrubs-tiny rotate: false - xy: 2580, 105 + xy: 2897, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snow-xlarge +block-shrubs-xlarge rotate: false xy: 1109, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snowrock-large +block-silicon-crucible-large rotate: false - xy: 965, 19 + xy: 1951, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snowrock-medium +block-silicon-crucible-medium rotate: false - xy: 1245, 83 + xy: 3327, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snowrock-small +block-silicon-crucible-small rotate: false - xy: 3691, 227 + xy: 3874, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snowrock-tiny +block-silicon-crucible-tiny rotate: false - xy: 2562, 87 + xy: 2915, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snowrock-xlarge +block-silicon-crucible-xlarge rotate: false xy: 1159, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-snowrocks-large +block-silicon-smelter-large rotate: false - xy: 1043, 287 + xy: 1993, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-snowrocks-medium +block-silicon-smelter-medium rotate: false - xy: 1279, 117 + xy: 3361, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-snowrocks-small +block-silicon-smelter-small rotate: false - xy: 3717, 219 + xy: 3900, 157 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-snowrocks-tiny +block-silicon-smelter-tiny rotate: false - xy: 2598, 123 + xy: 2933, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-snowrocks-xlarge +block-silicon-smelter-xlarge rotate: false xy: 1209, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-solar-panel-large +block-slag-large rotate: false - xy: 1085, 287 + xy: 1909, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-solar-panel-large-large +block-slag-medium rotate: false - xy: 1127, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-solar-panel-large-medium - rotate: false - xy: 1313, 151 + xy: 3395, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-solar-panel-large-small +block-slag-small rotate: false - xy: 3743, 219 + xy: 3900, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-solar-panel-large-tiny +block-slag-tiny rotate: false - xy: 2598, 105 + xy: 2951, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-solar-panel-large-xlarge +block-slag-xlarge rotate: false xy: 1259, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-solar-panel-medium +block-snow-boulder-large rotate: false - xy: 1347, 185 + xy: 1951, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-boulder-medium + rotate: false + xy: 3429, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-solar-panel-small +block-snow-boulder-small rotate: false - xy: 3769, 219 + xy: 3926, 157 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-solar-panel-tiny +block-snow-boulder-tiny rotate: false - xy: 2580, 87 + xy: 2969, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-solar-panel-xlarge +block-snow-boulder-xlarge rotate: false xy: 1309, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sorter-large +block-snow-large rotate: false - xy: 1169, 287 + xy: 1993, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sorter-medium +block-snow-medium rotate: false - xy: 1211, 15 + xy: 3463, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sorter-small +block-snow-pine-large rotate: false - xy: 3795, 219 + xy: 2035, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-pine-medium + rotate: false + xy: 3497, 240 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-small + rotate: false + xy: 3926, 131 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sorter-tiny +block-snow-pine-tiny rotate: false - xy: 2616, 123 + xy: 2987, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sorter-xlarge +block-snow-pine-xlarge rotate: false xy: 1359, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spawn-large +block-snow-small rotate: false - xy: 1211, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spawn-medium - rotate: false - xy: 1245, 49 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spawn-small - rotate: false - xy: 3821, 219 + xy: 3744, 105 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spawn-tiny +block-snow-tiny rotate: false - xy: 2616, 105 + xy: 3005, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spawn-xlarge +block-snow-wall-large + rotate: false + xy: 1951, 203 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-wall-medium + rotate: false + xy: 3521, 308 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-wall-small + rotate: false + xy: 3770, 105 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-wall-tiny + rotate: false + xy: 3023, 120 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-wall-xlarge rotate: false xy: 1409, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spectre-large - rotate: false - xy: 1253, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spectre-medium - rotate: false - xy: 1279, 83 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-spectre-small - rotate: false - xy: 3847, 219 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-spectre-tiny - rotate: false - xy: 2598, 87 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-spectre-xlarge +block-snow-xlarge rotate: false xy: 1459, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-cluster-large +block-solar-panel-large rotate: false - xy: 1295, 287 + xy: 1993, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-cluster-medium +block-solar-panel-large-large rotate: false - xy: 1313, 117 + xy: 2035, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-medium + rotate: false + xy: 3531, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-cluster-small +block-solar-panel-large-small rotate: false - xy: 3873, 219 + xy: 3796, 105 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-cluster-tiny +block-solar-panel-large-tiny rotate: false - xy: 2616, 87 + xy: 3041, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-cluster-xlarge +block-solar-panel-large-xlarge rotate: false xy: 1509, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-moss-large +block-solar-panel-medium rotate: false - xy: 1337, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-spore-moss-medium - rotate: false - xy: 1347, 151 + xy: 3531, 240 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-moss-small +block-solar-panel-small rotate: false - xy: 3899, 219 + xy: 3822, 105 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-moss-tiny +block-solar-panel-tiny rotate: false - xy: 2703, 110 + xy: 3059, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-moss-xlarge +block-solar-panel-xlarge rotate: false xy: 1559, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-pine-large +block-sorter-large rotate: false - xy: 1379, 287 + xy: 2077, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-pine-medium +block-sorter-medium rotate: false - xy: 1381, 185 + xy: 2911, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-pine-small +block-sorter-small rotate: false - xy: 3925, 219 + xy: 3848, 105 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-pine-tiny +block-sorter-tiny rotate: false - xy: 2721, 110 + xy: 3077, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-pine-xlarge +block-sorter-xlarge rotate: false xy: 1609, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-spore-press-large +block-spawn-large rotate: false - xy: 1421, 287 + xy: 1993, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-spore-press-medium +block-spawn-medium rotate: false - xy: 1245, 15 + xy: 2945, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-spore-press-small +block-spawn-small rotate: false - xy: 3951, 219 + xy: 3874, 105 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-spore-press-tiny +block-spawn-tiny rotate: false - xy: 1721, 5 + xy: 3095, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-spore-press-xlarge +block-spawn-xlarge rotate: false xy: 1659, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-sporerocks-large +block-spectre-large rotate: false - xy: 1463, 287 + xy: 2035, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-sporerocks-medium +block-spectre-medium rotate: false - xy: 1279, 49 + xy: 2979, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-sporerocks-small +block-spectre-small rotate: false - xy: 3977, 219 + xy: 3900, 105 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-sporerocks-tiny +block-spectre-tiny rotate: false - xy: 1739, 5 + xy: 3113, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-sporerocks-xlarge +block-spectre-xlarge rotate: false xy: 1709, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-stone-large +block-spore-cluster-large rotate: false - xy: 1505, 287 + xy: 2077, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-stone-medium +block-spore-cluster-medium rotate: false - xy: 1313, 83 + xy: 3013, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-stone-small +block-spore-cluster-small rotate: false - xy: 4003, 219 + xy: 3926, 105 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-stone-tiny +block-spore-cluster-tiny rotate: false - xy: 1877, 5 + xy: 3131, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-stone-xlarge +block-spore-cluster-xlarge rotate: false xy: 1759, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-tower-large +block-spore-moss-large rotate: false - xy: 1547, 287 + xy: 2119, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-tower-medium +block-spore-moss-medium rotate: false - xy: 1347, 117 + xy: 3047, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-tower-small +block-spore-moss-small rotate: false - xy: 4029, 219 + xy: 3959, 257 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-tower-tiny +block-spore-moss-tiny rotate: false - xy: 1895, 5 + xy: 3149, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-tower-xlarge +block-spore-moss-xlarge rotate: false xy: 1809, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-wall-large +block-spore-pine-large rotate: false - xy: 1589, 287 + xy: 2035, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-surge-wall-large-large +block-spore-pine-medium rotate: false - xy: 1631, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-surge-wall-large-medium - rotate: false - xy: 1381, 151 + xy: 3081, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-wall-large-small +block-spore-pine-small rotate: false - xy: 4055, 219 + xy: 3959, 231 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-wall-large-tiny +block-spore-pine-tiny rotate: false - xy: 1913, 5 + xy: 3167, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-wall-large-xlarge +block-spore-pine-xlarge rotate: false xy: 1859, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-surge-wall-medium +block-spore-press-large rotate: false - xy: 1415, 185 + xy: 2077, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-press-medium + rotate: false + xy: 3115, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-surge-wall-small +block-spore-press-small rotate: false - xy: 2677, 248 + xy: 3955, 205 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-surge-wall-tiny +block-spore-press-tiny rotate: false - xy: 1931, 5 + xy: 3185, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-surge-wall-xlarge +block-spore-press-xlarge rotate: false xy: 1909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-swarmer-large +block-spore-wall-large rotate: false - xy: 1673, 287 + xy: 2119, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-swarmer-medium +block-spore-wall-medium rotate: false - xy: 1279, 15 + xy: 3149, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-swarmer-small +block-spore-wall-small rotate: false - xy: 2677, 222 + xy: 3955, 179 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-swarmer-tiny +block-spore-wall-tiny rotate: false - xy: 3041, 191 + xy: 3203, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-swarmer-xlarge +block-spore-wall-xlarge rotate: false xy: 1959, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-switch-large +block-steam-generator-large rotate: false - xy: 1715, 287 + xy: 2161, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-switch-medium +block-steam-generator-medium rotate: false - xy: 1313, 49 + xy: 3183, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-switch-small +block-steam-generator-small rotate: false - xy: 2677, 196 + xy: 3952, 153 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-switch-tiny +block-steam-generator-tiny rotate: false - xy: 3059, 191 + xy: 3221, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-switch-xlarge +block-steam-generator-xlarge rotate: false xy: 2009, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tainted-water-large +block-stone-large rotate: false - xy: 1757, 287 + xy: 2077, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tainted-water-medium +block-stone-medium rotate: false - xy: 1347, 83 + xy: 3217, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tainted-water-small +block-stone-small rotate: false - xy: 2677, 170 + xy: 3952, 127 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tainted-water-tiny +block-stone-tiny rotate: false - xy: 3077, 191 + xy: 3239, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tainted-water-xlarge +block-stone-wall-large + rotate: false + xy: 2119, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-wall-medium + rotate: false + xy: 3251, 206 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-wall-small + rotate: false + xy: 3952, 101 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-wall-tiny + rotate: false + xy: 3257, 120 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-wall-xlarge rotate: false xy: 2059, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tar-large - rotate: false - xy: 1799, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-tar-medium - rotate: false - xy: 1381, 117 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-tar-small - rotate: false - xy: 2677, 144 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-tar-tiny - rotate: false - xy: 3095, 191 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-tar-xlarge +block-stone-xlarge rotate: false xy: 2109, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tendrils-large +block-surge-tower-large rotate: false - xy: 1841, 287 + xy: 2161, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tendrils-medium +block-surge-tower-medium rotate: false - xy: 1415, 151 + xy: 3285, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tendrils-small +block-surge-tower-small rotate: false - xy: 2677, 118 + xy: 3741, 79 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tendrils-tiny +block-surge-tower-tiny rotate: false - xy: 3113, 191 + xy: 3275, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tendrils-xlarge +block-surge-tower-xlarge rotate: false xy: 2159, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-tetrative-reconstructor-large +block-surge-wall-large rotate: false - xy: 1883, 287 + xy: 2203, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-tetrative-reconstructor-medium +block-surge-wall-large-large rotate: false - xy: 1449, 185 + xy: 2119, 203 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-medium + rotate: false + xy: 3319, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-tetrative-reconstructor-small +block-surge-wall-large-small rotate: false - xy: 2703, 232 + xy: 3767, 79 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-tetrative-reconstructor-tiny +block-surge-wall-large-tiny rotate: false - xy: 3131, 191 + xy: 3293, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-tetrative-reconstructor-xlarge +block-surge-wall-large-xlarge rotate: false xy: 2209, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-generator-large +block-surge-wall-medium rotate: false - xy: 1925, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thermal-generator-medium - rotate: false - xy: 1313, 15 + xy: 3353, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-generator-small +block-surge-wall-small rotate: false - xy: 2729, 232 + xy: 3793, 79 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-generator-tiny +block-surge-wall-tiny rotate: false - xy: 3149, 191 + xy: 3311, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-generator-xlarge +block-surge-wall-xlarge rotate: false xy: 2259, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thermal-pump-large +block-swarmer-large rotate: false - xy: 1967, 287 + xy: 2161, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thermal-pump-medium +block-swarmer-medium rotate: false - xy: 1347, 49 + xy: 3387, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thermal-pump-small +block-swarmer-small rotate: false - xy: 2703, 206 + xy: 3819, 79 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thermal-pump-tiny +block-swarmer-tiny rotate: false - xy: 3167, 191 + xy: 3329, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thermal-pump-xlarge +block-swarmer-xlarge rotate: false xy: 2309, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-reactor-large +block-switch-large rotate: false - xy: 2009, 287 + xy: 2203, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-reactor-medium +block-switch-medium rotate: false - xy: 1381, 83 + xy: 3421, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-reactor-small +block-switch-small rotate: false - xy: 2755, 232 + xy: 3845, 79 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-reactor-tiny +block-switch-tiny rotate: false - xy: 3185, 191 + xy: 3347, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-reactor-xlarge +block-switch-xlarge rotate: false xy: 2359, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-large +block-tainted-water-large rotate: false - xy: 2051, 287 + xy: 2245, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thorium-wall-large-large +block-tainted-water-medium rotate: false - xy: 2093, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-thorium-wall-large-medium - rotate: false - xy: 1415, 117 + xy: 3455, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-large-small +block-tainted-water-small rotate: false - xy: 2703, 180 + xy: 3871, 79 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-large-tiny +block-tainted-water-tiny rotate: false - xy: 3203, 191 + xy: 3365, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-large-xlarge +block-tainted-water-xlarge rotate: false xy: 2409, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thorium-wall-medium +block-tar-large rotate: false - xy: 1449, 151 + xy: 2161, 203 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tar-medium + rotate: false + xy: 3489, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thorium-wall-small +block-tar-small rotate: false - xy: 2729, 206 + xy: 3897, 79 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thorium-wall-tiny +block-tar-tiny rotate: false - xy: 3221, 191 + xy: 3383, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thorium-wall-xlarge +block-tar-xlarge rotate: false xy: 2459, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-thruster-large +block-tendrils-large rotate: false - xy: 2135, 287 + xy: 2203, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-thruster-medium +block-tendrils-medium rotate: false - xy: 1483, 185 + xy: 3523, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-thruster-small +block-tendrils-small rotate: false - xy: 2781, 232 + xy: 3923, 79 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-thruster-tiny +block-tendrils-tiny rotate: false - xy: 3239, 191 + xy: 3401, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-thruster-xlarge +block-tendrils-xlarge rotate: false xy: 2509, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-conveyor-large +block-tetrative-reconstructor-large rotate: false - xy: 2177, 287 + xy: 2245, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-conveyor-medium +block-tetrative-reconstructor-medium rotate: false - xy: 1347, 15 + xy: 2905, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-conveyor-small +block-tetrative-reconstructor-small rotate: false - xy: 2807, 232 + xy: 3949, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-conveyor-tiny +block-tetrative-reconstructor-tiny rotate: false - xy: 3257, 191 + xy: 3419, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-conveyor-xlarge +block-tetrative-reconstructor-xlarge rotate: false xy: 2559, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-large +block-thermal-generator-large rotate: false - xy: 2219, 287 + xy: 2287, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-titanium-wall-large-large +block-thermal-generator-medium rotate: false - xy: 2261, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-titanium-wall-large-medium - rotate: false - xy: 1381, 49 + xy: 2939, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-large-small +block-thermal-generator-small rotate: false - xy: 2703, 154 + xy: 3981, 205 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-large-tiny +block-thermal-generator-tiny rotate: false - xy: 3275, 191 + xy: 3437, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-large-xlarge +block-thermal-generator-xlarge rotate: false xy: 2609, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-titanium-wall-medium +block-thermal-pump-large rotate: false - xy: 1415, 83 + xy: 2203, 203 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-pump-medium + rotate: false + xy: 2973, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-titanium-wall-small +block-thermal-pump-small rotate: false - xy: 2729, 180 + xy: 3981, 179 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-titanium-wall-tiny +block-thermal-pump-tiny rotate: false - xy: 3293, 191 + xy: 3455, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-titanium-wall-xlarge +block-thermal-pump-xlarge rotate: false xy: 2659, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-turbine-generator-large +block-thorium-reactor-large rotate: false - xy: 2303, 287 + xy: 2245, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-turbine-generator-medium +block-thorium-reactor-medium rotate: false - xy: 1449, 117 + xy: 3007, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-turbine-generator-small +block-thorium-reactor-small rotate: false - xy: 2755, 206 + xy: 3978, 153 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-turbine-generator-tiny +block-thorium-reactor-tiny rotate: false - xy: 3311, 191 + xy: 3473, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-turbine-generator-xlarge +block-thorium-reactor-xlarge rotate: false xy: 2709, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-underflow-gate-large +block-thorium-wall-large rotate: false - xy: 2345, 287 + xy: 2287, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-underflow-gate-medium +block-thorium-wall-large-large rotate: false - xy: 1483, 151 + xy: 2329, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-medium + rotate: false + xy: 3041, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-underflow-gate-small +block-thorium-wall-large-small rotate: false - xy: 2703, 128 + xy: 3978, 127 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-underflow-gate-tiny +block-thorium-wall-large-tiny rotate: false - xy: 3329, 191 + xy: 3491, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-underflow-gate-xlarge +block-thorium-wall-large-xlarge rotate: false xy: 2759, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-unloader-large +block-thorium-wall-medium rotate: false - xy: 2387, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-unloader-medium - rotate: false - xy: 1517, 185 + xy: 3075, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-unloader-small +block-thorium-wall-small rotate: false - xy: 2729, 154 + xy: 3978, 101 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-unloader-tiny +block-thorium-wall-tiny rotate: false - xy: 3347, 191 + xy: 3509, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-unloader-xlarge +block-thorium-wall-xlarge rotate: false xy: 2809, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-vault-large +block-thruster-large rotate: false - xy: 2429, 287 + xy: 2245, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-vault-medium +block-thruster-medium rotate: false - xy: 1381, 15 + xy: 3109, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-vault-small +block-thruster-small rotate: false - xy: 2755, 180 + xy: 3975, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-vault-tiny +block-thruster-tiny rotate: false - xy: 3365, 191 + xy: 3527, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-vault-xlarge +block-thruster-xlarge rotate: false xy: 2859, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-extractor-large +block-titanium-conveyor-large rotate: false - xy: 2471, 287 + xy: 2287, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-extractor-medium +block-titanium-conveyor-medium rotate: false - xy: 1415, 49 + xy: 3143, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-extractor-small +block-titanium-conveyor-small rotate: false - xy: 2781, 206 + xy: 1015, 151 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-extractor-tiny +block-titanium-conveyor-tiny rotate: false - xy: 3383, 191 + xy: 3545, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-extractor-xlarge +block-titanium-conveyor-xlarge rotate: false xy: 2909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-water-large +block-titanium-wall-large rotate: false - xy: 2513, 287 + xy: 2329, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-water-medium +block-titanium-wall-large-large rotate: false - xy: 1449, 83 + xy: 2371, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-medium + rotate: false + xy: 3177, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-water-small +block-titanium-wall-large-small rotate: false - xy: 2729, 128 + xy: 1632, 56 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-water-tiny +block-titanium-wall-large-tiny rotate: false - xy: 3401, 191 + xy: 3563, 120 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-water-xlarge +block-titanium-wall-large-xlarge rotate: false xy: 2959, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-wave-large +block-titanium-wall-medium rotate: false - xy: 2555, 287 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-wave-medium - rotate: false - xy: 1483, 117 + xy: 3211, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-wave-small +block-titanium-wall-small rotate: false - xy: 2755, 154 + xy: 1658, 49 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-wave-tiny +block-titanium-wall-tiny rotate: false - xy: 3419, 191 + xy: 2751, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-wave-xlarge +block-titanium-wall-xlarge rotate: false xy: 3009, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-dead-large +block-underflow-gate-large rotate: false - xy: 2597, 287 + xy: 2287, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-dead-medium +block-underflow-gate-medium rotate: false - xy: 1517, 151 + xy: 3245, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-dead-small +block-underflow-gate-small rotate: false - xy: 2781, 180 + xy: 1684, 49 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-dead-tiny +block-underflow-gate-tiny rotate: false - xy: 3437, 191 + xy: 2769, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-dead-xlarge +block-underflow-gate-xlarge rotate: false xy: 3059, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -block-white-tree-large +block-unloader-large rotate: false - xy: 2639, 287 + xy: 2329, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -block-white-tree-medium +block-unloader-medium rotate: false - xy: 1551, 185 + xy: 3279, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -block-white-tree-small +block-unloader-small rotate: false - xy: 2807, 206 + xy: 1710, 49 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -block-white-tree-tiny +block-unloader-tiny rotate: false - xy: 3455, 191 + xy: 2787, 97 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -block-white-tree-xlarge +block-unloader-xlarge rotate: false xy: 3109, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +block-vault-large + rotate: false + xy: 2371, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-vault-medium + rotate: false + xy: 3313, 172 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-vault-small + rotate: false + xy: 1736, 49 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-vault-tiny + rotate: false + xy: 2805, 97 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-vault-xlarge + rotate: false + xy: 3159, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-extractor-large + rotate: false + xy: 2413, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-extractor-medium + rotate: false + xy: 3347, 172 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-extractor-small + rotate: false + xy: 1762, 49 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-extractor-tiny + rotate: false + xy: 2823, 97 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-extractor-xlarge + rotate: false + xy: 3209, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-large + rotate: false + xy: 2329, 203 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-medium + rotate: false + xy: 3381, 172 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-small + rotate: false + xy: 1788, 49 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-tiny + rotate: false + xy: 2841, 97 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-xlarge + rotate: false + xy: 3259, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wave-large + rotate: false + xy: 2371, 245 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wave-medium + rotate: false + xy: 3415, 172 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wave-small + rotate: false + xy: 1814, 49 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wave-tiny + rotate: false + xy: 2859, 97 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wave-xlarge + rotate: false + xy: 3309, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-dead-large + rotate: false + xy: 2413, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-dead-medium + rotate: false + xy: 3449, 172 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-dead-small + rotate: false + xy: 1840, 49 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-dead-tiny + rotate: false + xy: 2877, 97 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-dead-xlarge + rotate: false + xy: 3359, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-large + rotate: false + xy: 2455, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-medium + rotate: false + xy: 3483, 172 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-small + rotate: false + xy: 1866, 49 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-tiny + rotate: false + xy: 2750, 79 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-xlarge + rotate: false + xy: 3409, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 button rotate: false - xy: 3807, 271 + xy: 3221, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17697,7 +19132,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 3731, 300 + xy: 4059, 397 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17705,7 +19140,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 3769, 300 + xy: 4059, 368 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17713,7 +19148,15 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 3807, 300 + xy: 4059, 339 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-disabled + rotate: false + xy: 4059, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17721,7 +19164,7 @@ button-edge-4 index: -1 button-edge-over-4 rotate: false - xy: 3845, 300 + xy: 4059, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17729,7 +19172,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 3883, 300 + xy: 2833, 300 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17737,7 +19180,7 @@ button-over index: -1 button-red rotate: false - xy: 3921, 300 + xy: 2917, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17745,7 +19188,7 @@ button-red index: -1 button-right rotate: false - xy: 4035, 300 + xy: 3031, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17753,7 +19196,7 @@ button-right index: -1 button-right-down rotate: false - xy: 3959, 300 + xy: 2955, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17761,7 +19204,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 3997, 300 + xy: 2993, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17769,7 +19212,7 @@ button-right-over index: -1 button-select rotate: false - xy: 2833, 209 + xy: 1892, 49 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -17777,7 +19220,7 @@ button-select index: -1 button-square rotate: false - xy: 3731, 271 + xy: 3145, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17785,7 +19228,7 @@ button-square index: -1 button-square-down rotate: false - xy: 821, 434 + xy: 3069, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17793,7 +19236,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 2681, 274 + xy: 3107, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17801,7 +19244,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 3769, 271 + xy: 3183, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17809,63 +19252,63 @@ button-trans index: -1 check-disabled rotate: false - xy: 1415, 15 + xy: 3517, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 1449, 49 + xy: 2905, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 1483, 83 + xy: 2939, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 1517, 117 + xy: 2973, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 1551, 151 + xy: 3007, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 1585, 185 + xy: 3041, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 771, 404 + xy: 795, 354 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 crater rotate: false - xy: 309, 184 + xy: 2641, 113 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 cursor rotate: false - xy: 1001, 13 + xy: 2701, 248 size: 4, 4 orig: 4, 4 offset: 0, 0 @@ -17879,7 +19322,7 @@ discord-banner index: -1 flat-down-base rotate: false - xy: 3845, 271 + xy: 3259, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -17894,7 +19337,7 @@ info-banner index: -1 inventory rotate: false - xy: 2755, 112 + xy: 1918, 33 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -17902,147 +19345,147 @@ inventory index: -1 item-blast-compound-icon rotate: false - xy: 1449, 15 + xy: 3075, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-icon rotate: false - xy: 1483, 49 + xy: 3109, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-icon rotate: false - xy: 1517, 83 + xy: 3143, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-icon rotate: false - xy: 1551, 117 + xy: 3177, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-icon rotate: false - xy: 1585, 151 + xy: 3211, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-icon rotate: false - xy: 1619, 185 + xy: 3245, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-icon rotate: false - xy: 1483, 15 + xy: 3279, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-icon rotate: false - xy: 1517, 49 + xy: 3313, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-icon rotate: false - xy: 1551, 83 + xy: 3347, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-icon rotate: false - xy: 1585, 117 + xy: 3381, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-icon rotate: false - xy: 1619, 151 + xy: 3415, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-icon rotate: false - xy: 1653, 185 + xy: 3449, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-icon rotate: false - xy: 1517, 15 + xy: 3483, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-icon rotate: false - xy: 1551, 49 + xy: 3517, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-icon rotate: false - xy: 1585, 83 + xy: 3557, 206 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-icon rotate: false - xy: 1619, 117 + xy: 3551, 172 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-icon rotate: false - xy: 1653, 151 + xy: 3551, 138 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-icon rotate: false - xy: 1687, 185 + xy: 1194, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-icon rotate: false - xy: 1551, 15 + xy: 1228, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-icon rotate: false - xy: 1585, 49 + xy: 1262, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logic-node rotate: false - xy: 1619, 83 + xy: 1296, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -18063,7 +19506,7 @@ nomap index: -1 pane rotate: false - xy: 3921, 271 + xy: 3335, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18071,7 +19514,7 @@ pane index: -1 pane-2 rotate: false - xy: 3883, 271 + xy: 3297, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18079,7 +19522,7 @@ pane-2 index: -1 scroll rotate: false - xy: 2807, 169 + xy: 1970, 18 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -18087,7 +19530,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 2833, 261 + xy: 1015, 177 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -18095,21 +19538,21 @@ scroll-horizontal index: -1 scroll-knob-horizontal-black rotate: false - xy: 2681, 303 + xy: 859, 177 size: 40, 24 orig: 40, 24 offset: 0, 0 index: -1 scroll-knob-vertical-black rotate: false - xy: 2781, 138 + xy: 1944, 33 size: 24, 40 orig: 24, 40 offset: 0, 0 index: -1 scroll-knob-vertical-thin rotate: false - xy: 845, 374 + xy: 1043, 85 size: 12, 40 orig: 12, 40 offset: 0, 0 @@ -18123,28 +19566,28 @@ selection index: -1 slider rotate: false - xy: 259, 147 + xy: 3611, 133 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 1789, 111 + xy: 3978, 283 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 1823, 145 + xy: 4009, 282 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 1857, 179 + xy: 2144, 95 size: 29, 38 orig: 29, 38 offset: 0, 0 @@ -18158,7 +19601,7 @@ slider-vertical index: -1 underline rotate: false - xy: 2757, 258 + xy: 901, 174 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18166,7 +19609,7 @@ underline index: -1 underline-2 rotate: false - xy: 3959, 271 + xy: 3373, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18174,7 +19617,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 3997, 271 + xy: 3411, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18182,7 +19625,7 @@ underline-disabled index: -1 underline-red rotate: false - xy: 4035, 271 + xy: 3449, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18190,7 +19633,7 @@ underline-red index: -1 underline-white rotate: false - xy: 2719, 258 + xy: 3487, 342 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -18198,847 +19641,1170 @@ underline-white index: -1 unit-alpha-large rotate: false - xy: 2723, 287 + xy: 2371, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-alpha-medium rotate: false - xy: 1653, 117 + xy: 1330, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-alpha-small rotate: false - xy: 2833, 183 + xy: 1996, 29 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-alpha-tiny rotate: false - xy: 3473, 191 + xy: 2750, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-alpha-xlarge rotate: false - xy: 3159, 413 + xy: 3459, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-antumbra-large rotate: false - xy: 2765, 287 - size: 40, 40 - orig: 40, 40 + xy: 821, 421 + size: 36, 40 + orig: 36, 40 offset: 0, 0 index: -1 unit-antumbra-medium rotate: false - xy: 1687, 151 - size: 32, 32 - orig: 32, 32 + xy: 2175, 101 + size: 28, 32 + orig: 28, 32 offset: 0, 0 index: -1 unit-antumbra-small rotate: false - xy: 2859, 201 - size: 24, 24 - orig: 24, 24 + xy: 4007, 204 + size: 21, 24 + orig: 21, 24 offset: 0, 0 index: -1 unit-antumbra-tiny rotate: false - xy: 3491, 191 - size: 16, 16 - orig: 16, 16 + xy: 2858, 43 + size: 14, 16 + orig: 14, 16 offset: 0, 0 index: -1 unit-antumbra-xlarge rotate: false - xy: 3209, 413 - size: 48, 48 - orig: 48, 48 + xy: 3709, 330 + size: 43, 48 + orig: 43, 48 offset: 0, 0 index: -1 unit-arkyid-large rotate: false - xy: 2807, 287 + xy: 2413, 245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-arkyid-medium rotate: false - xy: 1721, 185 + xy: 1364, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-arkyid-small rotate: false - xy: 2781, 112 + xy: 2022, 23 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-arkyid-tiny rotate: false - xy: 3509, 191 + xy: 2768, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-arkyid-xlarge rotate: false - xy: 3259, 413 + xy: 3509, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-atrax-large rotate: false - xy: 2849, 287 - size: 40, 40 - orig: 40, 40 + xy: 2455, 298 + size: 40, 29 + orig: 40, 29 offset: 0, 0 index: -1 unit-atrax-medium rotate: false - xy: 1585, 15 - size: 32, 32 - orig: 32, 32 + xy: 1398, 110 + size: 32, 23 + orig: 32, 23 offset: 0, 0 index: -1 unit-atrax-small rotate: false - xy: 2807, 143 - size: 24, 24 - orig: 24, 24 + xy: 2048, 30 + size: 24, 17 + orig: 24, 17 offset: 0, 0 index: -1 unit-atrax-tiny rotate: false - xy: 3527, 191 - size: 16, 16 - orig: 16, 16 + xy: 2833, 287 + size: 16, 11 + orig: 16, 11 offset: 0, 0 index: -1 unit-atrax-xlarge rotate: false - xy: 3309, 413 - size: 48, 48 - orig: 48, 48 + xy: 3559, 427 + size: 48, 34 + orig: 48, 34 offset: 0, 0 index: -1 unit-beta-large rotate: false - xy: 2891, 287 - size: 40, 40 - orig: 40, 40 + xy: 2497, 331 + size: 40, 38 + orig: 40, 38 offset: 0, 0 index: -1 unit-beta-medium rotate: false - xy: 1619, 49 - size: 32, 32 - orig: 32, 32 + xy: 1432, 103 + size: 32, 30 + orig: 32, 30 offset: 0, 0 index: -1 unit-beta-small rotate: false - xy: 2833, 157 - size: 24, 24 - orig: 24, 24 + xy: 2615, 113 + size: 24, 23 + orig: 24, 23 offset: 0, 0 index: -1 unit-beta-tiny rotate: false - xy: 3545, 191 - size: 16, 16 - orig: 16, 16 + xy: 2768, 62 + size: 16, 15 + orig: 16, 15 offset: 0, 0 index: -1 unit-beta-xlarge rotate: false - xy: 3359, 413 - size: 48, 48 - orig: 48, 48 + xy: 3609, 415 + size: 48, 46 + orig: 48, 46 offset: 0, 0 index: -1 unit-bryde-large rotate: false - xy: 2933, 287 + xy: 2413, 203 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-bryde-medium rotate: false - xy: 1653, 83 + xy: 1466, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-bryde-small rotate: false - xy: 2885, 201 + xy: 1996, 3 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-bryde-tiny rotate: false - xy: 3563, 191 + xy: 2750, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-bryde-xlarge rotate: false - xy: 3409, 413 + xy: 3659, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +unit-corvus-large + rotate: false + xy: 2455, 270 + size: 40, 26 + orig: 40, 26 + offset: 0, 0 + index: -1 +unit-corvus-medium + rotate: false + xy: 3926, 341 + size: 31, 20 + orig: 31, 20 + offset: 0, 0 + index: -1 +unit-corvus-small + rotate: false + xy: 3643, 287 + size: 24, 15 + orig: 24, 15 + offset: 0, 0 + index: -1 +unit-corvus-tiny + rotate: false + xy: 771, 404 + size: 15, 10 + orig: 15, 10 + offset: 0, 0 + index: -1 +unit-corvus-xlarge + rotate: false + xy: 3709, 430 + size: 48, 31 + orig: 48, 31 + offset: 0, 0 + index: -1 unit-crawler-large rotate: false - xy: 2975, 287 + xy: 2497, 289 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-crawler-medium rotate: false - xy: 1687, 117 + xy: 1500, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-crawler-small rotate: false - xy: 2859, 175 + xy: 2048, 4 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-crawler-tiny rotate: false - xy: 3581, 191 + xy: 2786, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-crawler-xlarge rotate: false - xy: 3459, 413 + xy: 3759, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-large rotate: false - xy: 3017, 287 + xy: 2539, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-dagger-medium rotate: false - xy: 1721, 151 + xy: 1534, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-dagger-small rotate: false - xy: 2807, 117 + xy: 2634, 87 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-dagger-tiny rotate: false - xy: 3599, 191 + xy: 2768, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-dagger-xlarge rotate: false - xy: 3509, 413 + xy: 3809, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-eclipse-large rotate: false - xy: 3059, 287 + xy: 2455, 228 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-eclipse-medium rotate: false - xy: 1755, 185 + xy: 1568, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-eclipse-small rotate: false - xy: 2833, 131 + xy: 2634, 61 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-eclipse-tiny rotate: false - xy: 3617, 191 + xy: 2786, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-eclipse-xlarge rotate: false - xy: 3559, 413 + xy: 3859, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-flare-large rotate: false - xy: 3101, 287 + xy: 2497, 247 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-flare-medium rotate: false - xy: 1619, 15 + xy: 1602, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-flare-small rotate: false - xy: 2911, 201 + xy: 2074, 23 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-flare-tiny rotate: false - xy: 3635, 191 + xy: 2804, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-flare-xlarge rotate: false - xy: 3609, 413 + xy: 3909, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-fortress-large rotate: false - xy: 3143, 287 - size: 40, 40 - orig: 40, 40 + xy: 2581, 337 + size: 40, 32 + orig: 40, 32 offset: 0, 0 index: -1 unit-fortress-medium rotate: false - xy: 1653, 49 - size: 32, 32 - orig: 32, 32 + xy: 1636, 108 + size: 32, 25 + orig: 32, 25 offset: 0, 0 index: -1 unit-fortress-small rotate: false - xy: 2859, 149 - size: 24, 24 - orig: 24, 24 + xy: 2022, 2 + size: 24, 19 + orig: 24, 19 offset: 0, 0 index: -1 unit-fortress-tiny rotate: false - xy: 3653, 191 - size: 16, 16 - orig: 16, 16 + xy: 4037, 232 + size: 16, 12 + orig: 16, 12 offset: 0, 0 index: -1 unit-fortress-xlarge rotate: false - xy: 3659, 413 - size: 48, 48 - orig: 48, 48 + xy: 3959, 423 + size: 48, 38 + orig: 48, 38 offset: 0, 0 index: -1 unit-gamma-large rotate: false - xy: 3185, 287 + xy: 2539, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-gamma-medium rotate: false - xy: 1687, 83 + xy: 1670, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-gamma-small rotate: false - xy: 2885, 175 + xy: 2078, 49 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-gamma-tiny rotate: false - xy: 3671, 191 + xy: 2804, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-gamma-xlarge rotate: false - xy: 3709, 413 + xy: 4009, 413 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-horizon-large rotate: false - xy: 3227, 287 + xy: 2581, 295 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-horizon-medium rotate: false - xy: 1721, 117 + xy: 1704, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-horizon-small rotate: false - xy: 2937, 201 + xy: 2100, 23 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-horizon-tiny rotate: false - xy: 3689, 191 + xy: 2822, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-horizon-xlarge rotate: false - xy: 3759, 413 + xy: 3709, 380 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mace-large rotate: false - xy: 3269, 287 + xy: 2623, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mace-medium rotate: false - xy: 1755, 151 + xy: 1738, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mace-small rotate: false - xy: 2885, 149 + xy: 4004, 153 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mace-tiny rotate: false - xy: 2989, 139 + xy: 2822, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mace-xlarge rotate: false - xy: 3809, 413 + xy: 3759, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-mega-large rotate: false - xy: 3311, 287 + xy: 2665, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mega-medium rotate: false - xy: 1789, 185 + xy: 1772, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mega-small rotate: false - xy: 2911, 175 + xy: 4004, 127 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mega-tiny rotate: false - xy: 3007, 157 + xy: 2840, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mega-xlarge rotate: false - xy: 3859, 413 + xy: 3809, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-minke-large rotate: false - xy: 3353, 287 - size: 40, 40 - orig: 40, 40 + xy: 1089, 161 + size: 34, 40 + orig: 34, 40 offset: 0, 0 index: -1 unit-minke-medium rotate: false - xy: 1653, 15 - size: 32, 32 - orig: 32, 32 + xy: 2293, 101 + size: 27, 32 + orig: 27, 32 offset: 0, 0 index: -1 unit-minke-small rotate: false - xy: 2963, 201 - size: 24, 24 - orig: 24, 24 + xy: 309, 178 + size: 20, 24 + orig: 20, 24 offset: 0, 0 index: -1 unit-minke-tiny rotate: false - xy: 3007, 139 - size: 16, 16 - orig: 16, 16 + xy: 2720, 159 + size: 13, 16 + orig: 13, 16 offset: 0, 0 index: -1 unit-minke-xlarge rotate: false - xy: 3909, 413 - size: 48, 48 - orig: 48, 48 + xy: 3799, 313 + size: 41, 48 + orig: 41, 48 offset: 0, 0 index: -1 unit-mono-large rotate: false - xy: 3395, 287 + xy: 2707, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-mono-medium rotate: false - xy: 1687, 49 + xy: 1806, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-mono-small rotate: false - xy: 2911, 149 + xy: 4004, 101 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-mono-tiny rotate: false - xy: 3707, 201 + xy: 2840, 61 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-mono-xlarge rotate: false - xy: 3959, 413 + xy: 3859, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-nova-large rotate: false - xy: 3437, 287 + xy: 2749, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-nova-medium rotate: false - xy: 1721, 83 + xy: 1840, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-nova-small rotate: false - xy: 2937, 175 + xy: 4001, 75 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-nova-tiny rotate: false - xy: 3725, 201 + xy: 2858, 79 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-nova-xlarge rotate: false - xy: 4009, 413 + xy: 3909, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +unit-oct-large + rotate: false + xy: 2791, 329 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-oct-medium + rotate: false + xy: 1874, 101 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-oct-small + rotate: false + xy: 4027, 75 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-oct-tiny + rotate: false + xy: 2858, 61 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-oct-xlarge + rotate: false + xy: 3959, 373 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-omura-large + rotate: false + xy: 3565, 240 + size: 28, 40 + orig: 28, 40 + offset: 0, 0 + index: -1 +unit-omura-medium + rotate: false + xy: 2643, 185 + size: 22, 32 + orig: 22, 32 + offset: 0, 0 + index: -1 +unit-omura-small + rotate: false + xy: 2876, 71 + size: 16, 24 + orig: 16, 24 + offset: 0, 0 + index: -1 +unit-omura-tiny + rotate: false + xy: 3829, 295 + size: 11, 16 + orig: 11, 16 + offset: 0, 0 + index: -1 +unit-omura-xlarge + rotate: false + xy: 1125, 153 + size: 33, 48 + orig: 33, 48 + offset: 0, 0 + index: -1 unit-poly-large rotate: false - xy: 3479, 287 + xy: 2833, 329 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-poly-medium rotate: false - xy: 1755, 117 + xy: 1908, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-poly-small rotate: false - xy: 2989, 201 + xy: 2608, 35 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-poly-tiny rotate: false - xy: 3743, 201 + xy: 2786, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-poly-xlarge rotate: false - xy: 859, 363 + xy: 4009, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-pulsar-large rotate: false - xy: 3521, 287 - size: 40, 40 - orig: 40, 40 + xy: 2539, 251 + size: 40, 34 + orig: 40, 34 offset: 0, 0 index: -1 unit-pulsar-medium rotate: false - xy: 1789, 151 - size: 32, 32 - orig: 32, 32 + xy: 3525, 342 + size: 32, 27 + orig: 32, 27 offset: 0, 0 index: -1 unit-pulsar-small rotate: false - xy: 2937, 149 - size: 24, 24 - orig: 24, 24 + xy: 2074, 1 + size: 24, 20 + orig: 24, 20 offset: 0, 0 index: -1 unit-pulsar-tiny rotate: false - xy: 3761, 201 - size: 16, 16 - orig: 16, 16 + xy: 1, 1 + size: 16, 13 + orig: 16, 13 offset: 0, 0 index: -1 unit-pulsar-xlarge rotate: false - xy: 859, 313 + xy: 131, 4 + size: 48, 40 + orig: 48, 40 + offset: 0, 0 + index: -1 +unit-quad-large + rotate: false + xy: 2581, 253 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-quad-medium + rotate: false + xy: 2078, 102 + size: 31, 31 + orig: 31, 31 + offset: 0, 0 + index: -1 +unit-quad-small + rotate: false + xy: 2634, 35 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-quad-tiny + rotate: false + xy: 3737, 313 + size: 15, 15 + orig: 15, 15 + offset: 0, 0 + index: -1 +unit-quad-xlarge + rotate: false + xy: 3559, 377 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-quasar-large rotate: false - xy: 3563, 287 + xy: 2623, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-quasar-medium rotate: false - xy: 1823, 185 + xy: 1942, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-quasar-small rotate: false - xy: 2963, 175 + xy: 3985, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-quasar-tiny rotate: false - xy: 3779, 201 + xy: 2804, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-quasar-xlarge rotate: false - xy: 909, 363 + xy: 3609, 365 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +unit-reign-large + rotate: false + xy: 2875, 343 + size: 40, 26 + orig: 40, 26 + offset: 0, 0 + index: -1 +unit-reign-medium + rotate: false + xy: 2871, 287 + size: 31, 20 + orig: 31, 20 + offset: 0, 0 + index: -1 +unit-reign-small + rotate: false + xy: 3926, 324 + size: 24, 15 + orig: 24, 15 + offset: 0, 0 + index: -1 +unit-reign-tiny + rotate: false + xy: 4040, 310 + size: 15, 10 + orig: 15, 10 + offset: 0, 0 + index: -1 +unit-reign-xlarge + rotate: false + xy: 3659, 380 + size: 48, 31 + orig: 48, 31 + offset: 0, 0 + index: -1 unit-risso-large rotate: false - xy: 3605, 287 - size: 40, 40 - orig: 40, 40 + xy: 1052, 161 + size: 35, 40 + orig: 35, 40 offset: 0, 0 index: -1 unit-risso-medium rotate: false - xy: 1687, 15 - size: 32, 32 - orig: 32, 32 + xy: 2205, 101 + size: 28, 32 + orig: 28, 32 offset: 0, 0 index: -1 unit-risso-small rotate: false - xy: 3015, 201 - size: 24, 24 - orig: 24, 24 + xy: 2643, 159 + size: 21, 24 + orig: 21, 24 offset: 0, 0 index: -1 unit-risso-tiny rotate: false - xy: 3797, 201 - size: 16, 16 - orig: 16, 16 + xy: 2305, 69 + size: 14, 16 + orig: 14, 16 offset: 0, 0 index: -1 unit-risso-xlarge rotate: false - xy: 859, 263 + xy: 3754, 313 + size: 43, 48 + orig: 43, 48 + offset: 0, 0 + index: -1 +unit-scepter-large + rotate: false + xy: 2623, 253 + size: 40, 32 + orig: 40, 32 + offset: 0, 0 + index: -1 +unit-scepter-medium + rotate: false + xy: 1976, 107 + size: 32, 26 + orig: 32, 26 + offset: 0, 0 + index: -1 +unit-scepter-small + rotate: false + xy: 2615, 138 + size: 24, 19 + orig: 24, 19 + offset: 0, 0 + index: -1 +unit-scepter-tiny + rotate: false + xy: 19, 1 + size: 16, 13 + orig: 16, 13 + offset: 0, 0 + index: -1 +unit-scepter-xlarge + rotate: false + xy: 181, 5 + size: 48, 39 + orig: 48, 39 + offset: 0, 0 + index: -1 +unit-sei-large + rotate: false + xy: 2665, 287 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +unit-sei-medium + rotate: false + xy: 3559, 343 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unit-sei-small + rotate: false + xy: 4011, 256 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +unit-sei-tiny + rotate: false + xy: 2822, 43 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +unit-sei-xlarge + rotate: false + xy: 3959, 323 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-spiroct-large rotate: false - xy: 3647, 287 - size: 40, 40 - orig: 40, 40 + xy: 2665, 254 + size: 40, 31 + orig: 40, 31 offset: 0, 0 index: -1 unit-spiroct-medium rotate: false - xy: 1721, 49 - size: 32, 32 - orig: 32, 32 + xy: 2111, 108 + size: 31, 25 + orig: 31, 25 offset: 0, 0 index: -1 unit-spiroct-small rotate: false - xy: 2963, 149 - size: 24, 24 - orig: 24, 24 + xy: 2100, 2 + size: 24, 19 + orig: 24, 19 offset: 0, 0 index: -1 unit-spiroct-tiny rotate: false - xy: 3815, 201 - size: 16, 16 - orig: 16, 16 + xy: 2305, 87 + size: 15, 12 + orig: 15, 12 offset: 0, 0 index: -1 unit-spiroct-xlarge rotate: false - xy: 909, 313 - size: 48, 48 - orig: 48, 48 + xy: 231, 6 + size: 48, 38 + orig: 48, 38 + offset: 0, 0 + index: -1 +unit-toxopid-large + rotate: false + xy: 1160, 161 + size: 33, 40 + orig: 33, 40 + offset: 0, 0 + index: -1 +unit-toxopid-medium + rotate: false + xy: 781, 170 + size: 26, 32 + orig: 26, 32 + offset: 0, 0 + index: -1 +unit-toxopid-small + rotate: false + xy: 2641, 133 + size: 20, 24 + orig: 20, 24 + offset: 0, 0 + index: -1 +unit-toxopid-tiny + rotate: false + xy: 2904, 290 + size: 13, 16 + orig: 13, 16 + offset: 0, 0 + index: -1 +unit-toxopid-xlarge + rotate: false + xy: 2707, 279 + size: 40, 48 + orig: 40, 48 + offset: 0, 0 + index: -1 +unit-vela-large + rotate: false + xy: 2749, 295 + size: 40, 32 + orig: 40, 32 + offset: 0, 0 + index: -1 +unit-vela-medium + rotate: false + xy: 2010, 107 + size: 32, 26 + orig: 32, 26 + offset: 0, 0 + index: -1 +unit-vela-small + rotate: false + xy: 3985, 235 + size: 24, 19 + orig: 24, 19 + offset: 0, 0 + index: -1 +unit-vela-tiny + rotate: false + xy: 37, 1 + size: 16, 13 + orig: 16, 13 + offset: 0, 0 + index: -1 +unit-vela-xlarge + rotate: false + xy: 4009, 322 + size: 48, 39 + orig: 48, 39 offset: 0, 0 index: -1 unit-zenith-large rotate: false - xy: 3689, 287 + xy: 2791, 287 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 unit-zenith-medium rotate: false - xy: 1755, 83 + xy: 2044, 101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unit-zenith-small rotate: false - xy: 2989, 175 + xy: 4011, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 unit-zenith-tiny rotate: false - xy: 3833, 201 + xy: 2840, 43 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 unit-zenith-xlarge rotate: false - xy: 959, 363 + xy: 3659, 330 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +wavepane + rotate: false + xy: 939, 174 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 white-pane rotate: false - xy: 2795, 258 + xy: 977, 174 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -19046,14 +20812,14 @@ white-pane index: -1 whiteui rotate: false - xy: 1815, 106 + xy: 3754, 375 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 1946, 156 + xy: 3585, 143 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 dcf1e3748b..9554a5639d 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 f78c27b739..d6e59f26a8 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..6e90118bff 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 1f61b9736f..55262ad933 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 0897ef00d5..5150c19461 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..99d5567fda 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,8 +60,10 @@ public class Vars implements Loadable{ public static final String serverJsonURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers.json"; /** URL to the JSON file containing all the BE servers. Only queried in BE. */ public static final String serverJsonBeURL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_be.json"; + /** URL to the JSON file containing all the BE servers. Only queried in the V6 alpha (will be removed once it's out). */ + public static final String serverJsonV6URL = "https://raw.githubusercontent.com/Anuken/Mindustry/master/servers_v6.json"; /** URL of the github issue report template.*/ - public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md"; + public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?labels=bug&template=bug_report.md"; /** list of built-in servers.*/ public static final Seq defaultServers = Seq.with(); /** maximum distance between mine and core that supports automatic transferring */ @@ -78,20 +80,24 @@ 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 */ public static final float sectorDestructionTurns = 3f; /** min armor fraction damage; e.g. 0.05 = at least 5% damage */ - public static final float minArmorDamage = 0.05f; + public static final float minArmorDamage = 0.1f; /** launch animation duration */ public static final float launchDuration = 140f; + /** size of tiles in units */ + public static final int tilesize = 8; + /** size of one tile payload (^2) */ + public static final float tilePayload = tilesize * tilesize; /** tile used in certain situations, instead of null */ public static Tile emptyTile; /** for map generator dialog */ public static boolean updateEditorOnChange = false; - /** size of tiles in units */ - public static final int tilesize = 8; /** all choosable player colors in join/host dialog */ public static final Color[] playerColors = { Color.valueOf("82759a"), @@ -199,8 +205,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 26ec43e74b..25aec37c97 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -6,6 +6,7 @@ import arc.math.*; import arc.math.geom.*; import arc.struct.EnumSet; import arc.struct.*; +import arc.util.ArcAnnotate.*; import mindustry.content.*; import mindustry.game.EventType.*; import mindustry.game.*; @@ -33,11 +34,11 @@ public class BlockIndexer{ /** Maps each team ID to a quarant. A quadrant is a grid of bits, where each bit is set if and only if there is a block of that team in that quadrant. */ private GridBits[] structQuadrants; /** Stores all damaged tile entities by team. */ - private BuildingArray[] damagedTiles = new BuildingArray[Team.all.length]; + private ObjectSet[] damagedTiles = new ObjectSet[Team.all.length]; /** All ores available on this map. */ private ObjectSet allOres = new ObjectSet<>(); /** Stores teams that are present here as tiles. */ - 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 +53,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){ @@ -70,9 +71,10 @@ public class BlockIndexer{ Events.on(WorldLoadEvent.class, event -> { scanOres.clear(); scanOres.addAll(Item.getAllOres()); - damagedTiles = new BuildingArray[Team.all.length]; + damagedTiles = new ObjectSet[Team.all.length]; flagMap = new TileArray[Team.all.length][BlockFlag.all.length]; unitCaps = new int[Team.all.length]; + activeTeams = new Seq<>(Team.class); for(int i = 0; i < flagMap.length; i++){ for(int j = 0; j < BlockFlag.all.length; j++){ @@ -138,16 +140,16 @@ public class BlockIndexer{ } /** Returns all damaged tiles by team. */ - public BuildingArray getDamaged(Team team){ - returnArray.clear(); + public ObjectSet getDamaged(Team team){ + breturnArray.clear(); if(damagedTiles[team.id] == null){ - damagedTiles[team.id] = new BuildingArray(); + damagedTiles[team.id] = new ObjectSet<>(); } - BuildingArray set = damagedTiles[team.id]; + ObjectSet set = damagedTiles[team.id]; for(Building build : set){ - if((!build.isValid() || build.team != team || !build.damaged()) || build.block instanceof BuildBlock){ + if((!build.isValid() || build.team != team || !build.damaged()) || build.block instanceof ConstructBlock){ breturnArray.add(build); } } @@ -164,6 +166,11 @@ public class BlockIndexer{ return flagMap[team.id][type.ordinal()]; } + @Nullable + public Tile findClosestFlag(float x, float y, Team team, BlockFlag flag){ + return Geometry.findClosest(x, y, getAllied(team, flag)); + } + public boolean eachBlock(Teamc team, float range, Boolf pred, Cons cons){ return eachBlock(team.team(), team.getX(), team.getY(), range, pred, cons); } @@ -213,14 +220,17 @@ public class BlockIndexer{ public void notifyTileDamaged(Building entity){ if(damagedTiles[entity.team.id] == null){ - damagedTiles[entity.team.id] = new BuildingArray(); + damagedTiles[entity.team.id] = new ObjectSet(); } damagedTiles[entity.team.id].add(entity); } 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 +261,15 @@ public class BlockIndexer{ if(e == null) continue; - if(e.team != team || !pred.get(e) || !e.block().targetable) + if(e.team != team || !pred.get(e) || !e.block.targetable) continue; float ndst = e.dst2(x, y); if(ndst < range2 && (closest == null || //this one is closer, and it is at least of equal priority - (ndst < dst && (!usePriority || closest.block().priority.ordinal() <= e.block().priority.ordinal())) || + (ndst < dst && (!usePriority || closest.block.priority.ordinal() <= e.block.priority.ordinal())) || //priority is used, and new block has higher priority regardless of range - (usePriority && closest.block().priority.ordinal() < e.block().priority.ordinal()))){ + (usePriority && closest.block.priority.ordinal() < e.block.priority.ordinal()))){ dst = ndst; closest = e; } @@ -472,35 +482,4 @@ public class BlockIndexer{ return tiles.iterator(); } } - - //TODO copy-pasted code, generics would be nice here - public static class BuildingArray implements Iterable{ - private Seq tiles = new Seq<>(false, 16); - private IntSet contained = new IntSet(); - - public void add(Building tile){ - if(contained.add(tile.pos())){ - tiles.add(tile); - } - } - - public void remove(Building tile){ - if(contained.remove(tile.pos())){ - tiles.remove(tile); - } - } - - public int size(){ - return tiles.size; - } - - public Building first(){ - return tiles.first(); - } - - @Override - public Iterator iterator(){ - return tiles.iterator(); - } - } } diff --git a/core/src/mindustry/ai/Pathfinder.java b/core/src/mindustry/ai/Pathfinder.java index 222cc7df74..a1aa2cb3af 100644 --- a/core/src/mindustry/ai/Pathfinder.java +++ b/core/src/mindustry/ai/Pathfinder.java @@ -23,52 +23,110 @@ 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) ? 6000 : 0) + + (PathTile.damages(tile) ? 30 : 0), + + //legs + (team, tile) -> PathTile.legSolid(tile) ? impassable : 1 + + (PathTile.solid(tile) ? 5 : 0), + + //water + (team, tile) -> PathTile.solid(tile) || !PathTile.liquid(tile) ? 200 : 2 + //TODO cannot go through blocks - pathfinding isn't great + (PathTile.nearGround(tile) || PathTile.nearSolid(tile) ? 14 : 0) + + (PathTile.deep(tile) ? -1 : 0) + + (PathTile.damages(tile) ? 35 : 0) + ); + + //maps team, cost, type to flow field + Flowfield[][][] cache; + /** tile data, see PathTileStruct */ - private int[][] tiles; + int[][] tiles = new int[0][0]; /** unordered array of path data for iteration only. DO NOT iterate or access this in the main thread. */ - 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), 80), + tile.getTeamID(), + tile.solid(), + tile.floor().isLiquid, + tile.staticDarkness() >= 2, + nearLiquid, + nearGround, + nearSolid, + tile.floor().isDeep(), + tile.floor().damageTaken > 0.00001f + ); } /** Starts or restarts the pathfinding thread. */ @@ -104,7 +162,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 +189,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 +226,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 +279,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 +291,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 +306,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 +334,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 +374,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 +395,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 +410,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 +423,101 @@ 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; + //whether the floor damages + boolean damages; } } 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/formations/patterns/CircleFormation.java b/core/src/mindustry/ai/formations/patterns/CircleFormation.java index c658c48bf0..0988657adf 100644 --- a/core/src/mindustry/ai/formations/patterns/CircleFormation.java +++ b/core/src/mindustry/ai/formations/patterns/CircleFormation.java @@ -5,20 +5,14 @@ import arc.math.geom.*; import mindustry.ai.formations.*; public class CircleFormation extends FormationPattern{ - /** The radius of one member. This is needed to determine how close we can pack a given number of members around circle. */ - public float memberRadius; /** Angle offset. */ public float angleOffset = 0; - public CircleFormation(float memberRadius){ - this.memberRadius = memberRadius; - } - @Override public Vec3 calculateSlotLocation(Vec3 outLocation, int slotNumber){ if(slots > 1){ float angle = (360f * slotNumber) / slots; - float radius = memberRadius / (float)Math.sin(180f / slots * Mathf.degRad); + float radius = spacing / (float)Math.sin(180f / slots * Mathf.degRad); outLocation.set(Angles.trnsx(angle, radius), Angles.trnsy(angle, radius), angle); }else{ outLocation.set(0, 0, 360f * slotNumber); diff --git a/core/src/mindustry/ai/types/BuilderAI.java b/core/src/mindustry/ai/types/BuilderAI.java index 149f4ef6d0..6b89adcce3 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 = 1500; + 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 6f4eae425f..0758f9016a 100644 --- a/core/src/mindustry/ai/types/FlyingAI.java +++ b/core/src/mindustry/ai/types/FlyingAI.java @@ -1,7 +1,6 @@ package mindustry.ai.types; import arc.math.*; -import arc.util.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.world.meta.*; @@ -12,20 +11,12 @@ public class FlyingAI extends AIController{ @Override public void updateMovement(){ - if(unit.moving()){ - unit.lookAt(unit.vel.angle()); - } - - if(unit.isFlying()){ - unit.wobble(); - } - if(target != null && unit.hasWeapons() && command() == UnitCommand.attack){ if(unit.type().weapons.first().rotate){ moveTo(target, unit.range() * 0.8f); unit.lookAt(target); }else{ - attack(80f); + attack(100f); } } @@ -34,8 +25,7 @@ public class FlyingAI extends AIController{ } if(command() == UnitCommand.rally){ - target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); - moveTo(target, 60f); + moveTo(targetFlag(unit.x, unit.y, BlockFlag.rally, false), 60f); } } @@ -67,7 +57,7 @@ public class FlyingAI extends AIController{ vec.setAngle(Mathf.slerpDelta(unit.vel().angle(), vec.angle(), 0.6f)); } - vec.setLength(unit.type().speed * Time.delta); + vec.setLength(unit.type().speed); unit.moveAt(vec); } diff --git a/core/src/mindustry/ai/types/FormationAI.java b/core/src/mindustry/ai/types/FormationAI.java index 9ef064cfe1..e2680b4f2b 100644 --- a/core/src/mindustry/ai/types/FormationAI.java +++ b/core/src/mindustry/ai/types/FormationAI.java @@ -1,11 +1,12 @@ package mindustry.ai.types; +import arc.math.*; import arc.math.geom.*; import arc.util.ArcAnnotate.*; -import mindustry.*; import mindustry.ai.formations.*; import mindustry.entities.units.*; import mindustry.gen.*; +import mindustry.type.*; public class FormationAI extends AIController implements FormationMember{ public Unit leader; @@ -25,38 +26,44 @@ public class FormationAI extends AIController implements FormationMember{ @Override public void updateUnit(){ + UnitType type = unit.type(); + if(leader.dead){ unit.resetController(); return; } - unit.controlWeapons(leader.isRotate(), leader.isShooting); + if(unit.type().canBoost && unit.canPassOn()){ + unit.elevation = Mathf.approachDelta(unit.elevation, 0f, 0.08f); + } + + unit.controlWeapons(true, leader.isShooting); // unit.moveAt(Tmp.v1.set(deltaX, deltaY).limit(unit.type().speed)); - if(leader.isShooting){ - unit.aimLook(leader.aimX(), leader.aimY()); - }else{ - if(!leader.moving() || !unit.type().rotateShooting){ - if(unit.moving()){ - unit.lookAt(unit.vel.angle()); - } - }else{ - unit.lookAt(leader.rotation); - } + + unit.aim(leader.aimX(), leader.aimY()); + + if(unit.type().rotateShooting){ + unit.lookAt(leader.aimX(), leader.aimY()); + }else if(unit.moving()){ + unit.lookAt(unit.vel.angle()); } Vec2 realtarget = vec.set(target); - if(unit.isGrounded() && Vars.world.raycast(unit.tileX(), unit.tileY(), leader.tileX(), leader.tileY(), Vars.world::solid)){ - realtarget.set(Vars.pathfinder.getTargetTile(unit.tileOn(), unit.team, leader)); - } + float margin = 3f; - unit.moveAt(realtarget.sub(unit).limit(unit.type().speed)); + if(unit.dst(realtarget) <= margin){ + unit.vel.approachDelta(Vec2.ZERO, type.speed * type.accel / 2f); + }else{ + unit.moveAt(realtarget.sub(unit).limit(type.speed)); + } } @Override public void removed(Unit unit){ if(formation != null){ formation.removeMember(this); + unit.resetController(); } } @@ -66,7 +73,7 @@ public class FormationAI extends AIController implements FormationMember{ //TODO return formation size //eturn ((Commanderc)unit).formation(). } - return unit.hitSize * 1.7f; + return unit.hitSize * 1f; } @Override diff --git a/core/src/mindustry/ai/types/GroundAI.java b/core/src/mindustry/ai/types/GroundAI.java index d7b112554e..bd6b13a25c 100644 --- a/core/src/mindustry/ai/types/GroundAI.java +++ b/core/src/mindustry/ai/types/GroundAI.java @@ -1,14 +1,15 @@ package mindustry.ai.types; import arc.math.*; -import mindustry.ai.Pathfinder.*; +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.*; public class GroundAI extends AIController{ @@ -20,8 +21,9 @@ public class GroundAI extends AIController{ Building core = unit.closestEnemyCore(); - if(core != null && unit.within(core, unit.range() / 1.1f)){ + 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){ @@ -32,24 +34,24 @@ public class GroundAI extends AIController{ if(spawner != null && unit.within(spawner, state.rules.dropZoneRadius + 120f)) move = false; } - if(move) 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)){ - moveToCore(FlagTarget.rallyPoints); + moveTo(Pathfinder.fieldRally); } } - if(unit.type().canBoost){ + if(unit.type().canBoost && unit.tileOn() != null && !unit.tileOn().solid()){ unit.elevation = Mathf.approachDelta(unit.elevation, 0f, 0.08f); } - if(!Units.invalidateTarget(target, unit, unit.range())){ + if(!Units.invalidateTarget(target, unit, unit.range()) && unit.type().rotateShooting){ if(unit.type().hasWeapons()){ - unit.aimLook(Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed)); + unit.lookAt(Predict.intercept(unit, target, unit.type().weapons.first().bullet.speed)); } }else if(unit.moving()){ unit.lookAt(unit.vel().angle()); @@ -71,40 +73,14 @@ 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 pathTarget){ + int costType = unit.pathType(); 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, pathTarget)); - 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..c4e654ce29 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; } @@ -51,7 +44,7 @@ public class MinerAI extends AIController{ } if(ore != null){ - moveTo(ore, unit.type().range / 1.5f); + moveTo(ore, unit.type().range / 2f); if(unit.within(ore, unit.type().range)){ miner.mineTile(ore); @@ -63,6 +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..84baf1c555 --- /dev/null +++ b/core/src/mindustry/ai/types/RepairAI.java @@ -0,0 +1,34 @@ +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 * 0.8f)){ + moveTo(target, unit.type().range * 0.8f); + } + + if(target.within(unit, unit.type().range)){ + 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 275bc68204..93ab98a7c0 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; @@ -22,12 +24,12 @@ public class SuicideAI extends GroundAI{ Building core = unit.closestEnemyCore(); - boolean rotate = false, shoot = false; + boolean rotate = false, shoot = false, moveToTarget = false; if(!Units.invalidateTarget(target, unit, unit.range())){ 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)); @@ -53,13 +55,22 @@ public class SuicideAI extends GroundAI{ } if(!blocked){ + moveToTarget = true; //move towards target directly unit.moveAt(vec.set(target).sub(unit).limit(unit.type().speed)); } - }else{ - if(core != null){ - moveToCore(FlagTarget.enemyCores); + } + + if(!moveToTarget){ + if(command() == UnitCommand.rally){ + Teamc target = targetFlag(unit.x, unit.y, BlockFlag.rally, false); + + if(target != null && !unit.within(target, 70f)){ + moveTo(Pathfinder.fieldRally); + } + }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..9a075f8f40 100644 --- a/core/src/mindustry/async/PhysicsProcess.java +++ b/core/src/mindustry/async/PhysicsProcess.java @@ -1,31 +1,25 @@ package mindustry.async; -import arc.box2d.*; -import arc.box2d.BodyDef.*; +import arc.math.*; import arc.math.geom.*; +import arc.math.geom.QuadTree.*; import arc.struct.*; +import mindustry.*; import mindustry.entities.*; +import mindustry.async.PhysicsProcess.PhysicsWorld.*; import mindustry.gen.*; public class PhysicsProcess implements AsyncProcess{ - private Physics physics; + private static final int + layers = 3, + layerGround = 0, + layerLegs = 1, + layerFlying = 2; + + private PhysicsWorld physics; private Seq refs = new Seq<>(false); - private BodyDef def; - - private EntityGroup group; - private Filter flying = new Filter(){{ - maskBits = categoryBits = 2; - }}, ground = new Filter(){{ - maskBits = categoryBits = 1; - }}; - - public PhysicsProcess(){ - def = new BodyDef(); - def.type = BodyType.dynamicBody; - - //currently only enabled for units - group = Groups.unit; - } + //currently only enabled for units + private EntityGroup group = Groups.unit; @Override public void begin(){ @@ -34,48 +28,39 @@ public class PhysicsProcess implements AsyncProcess{ //remove stale entities refs.removeAll(ref -> { if(!ref.entity.isAdded()){ - physics.destroyBody(ref.body); + physics.remove(ref.body); + ref.entity.physref(null); return true; } return false; }); - //find entities without bodies and assign them - for(Physicsc entity : group){ - boolean grounded = entity.isGrounded(); + //find Unit without bodies and assign them + for(Unit entity : group){ if(entity.physref() == null){ - //add bodies to entities that have none - FixtureDef fd = new FixtureDef(); - fd.shape = new CircleShape(entity.hitSize() / 2f); - fd.density = 5f; - fd.restitution = 0.0f; - fd.filter.maskBits = fd.filter.categoryBits = (grounded ? ground : flying).maskBits; - - def.position.set(entity); - - Body body = physics.createBody(def); - body.createFixture(fd); + PhysicsBody body = new PhysicsBody(); + body.x = entity.x(); + body.y = entity.y(); + body.mass = entity.mass(); + body.radius = entity.hitSize() / 2f; PhysicRef ref = new PhysicRef(entity, body); refs.add(ref); entity.physref(ref); + + physics.add(body); } //save last position PhysicRef ref = entity.physref(); - if(ref.wasGround != grounded){ - if(ref.body.getFixtureList().isEmpty()) continue; - - //set correct filter - ref.body.getFixtureList().first().setFilterData(grounded ? ground : flying); - ref.wasGround = grounded; - } - - ref.velocity.set(entity.deltaX(), entity.deltaY()); - ref.position.set(entity); + ref.body.layer = + entity.type().allowLegStep ? layerLegs : + entity.isGrounded() ? layerGround : layerFlying; + ref.x = entity.x(); + ref.y = entity.y(); } } @@ -86,26 +71,11 @@ public class PhysicsProcess implements AsyncProcess{ //get last position vectors before step for(PhysicRef ref : refs){ //force set target position - ref.body.setPosition(ref.position.x, ref.position.y); - - //save last position for delta - ref.lastPosition.set(ref.body.getPosition()); - - //write velocity - ref.body.setLinearVelocity(ref.velocity); - - ref.lastVelocity.set(ref.velocity); + ref.body.x = ref.x; + ref.body.y = ref.y; } - physics.step(1f/45f, 5, 8); - - //get delta vectors - for(PhysicRef ref : refs){ - //get delta vector - ref.delta.set(ref.body.getPosition()).sub(ref.lastPosition); - - ref.velocity.set(ref.body.getLinearVelocity()); - } + physics.update(); } @Override @@ -116,13 +86,8 @@ public class PhysicsProcess implements AsyncProcess{ for(PhysicRef ref : refs){ Physicsc entity = ref.entity; - entity.move(ref.delta.x, ref.delta.y); - - //save last position - ref.position.set(entity); - - //add delta velocity - this doesn't work very well yet - //entity.vel().add(ref.velocity).sub(ref.lastVelocity); + //move by delta + entity.move(ref.body.x - ref.x, ref.body.y - ref.y); } } @@ -130,7 +95,6 @@ public class PhysicsProcess implements AsyncProcess{ public void reset(){ if(physics != null){ refs.clear(); - physics.dispose(); physics = null; } } @@ -139,18 +103,95 @@ public class PhysicsProcess implements AsyncProcess{ public void init(){ reset(); - physics = new Physics(new Vec2(), true); + physics = new PhysicsWorld(Vars.world.getQuadBounds(new Rect())); } public static class PhysicRef{ - Physicsc entity; - Body body; - boolean wasGround = true; - Vec2 lastPosition = new Vec2(), delta = new Vec2(), velocity = new Vec2(), lastVelocity = new Vec2(), position = new Vec2(); + public Physicsc entity; + public PhysicsBody body; + public float x, y; - public PhysicRef(Physicsc entity, Body body){ + public PhysicRef(Physicsc entity, PhysicsBody body){ this.entity = entity; this.body = body; } } + + //world for simulating physics in a different thread + public static class PhysicsWorld{ + //how much to soften movement by + private static final float scl = 1.25f; + + private final QuadTree[] trees = new QuadTree[layers]; + private final Seq bodies = new Seq<>(false, 16, PhysicsBody.class); + private final Seq seq = new Seq<>(PhysicsBody.class); + private final Rect rect = new Rect(); + private final Vec2 vec = new Vec2(); + + public PhysicsWorld(Rect bounds){ + for(int i = 0; i < layers; i++){ + trees[i] = new QuadTree<>(new Rect(bounds)); + } + } + + public void add(PhysicsBody body){ + bodies.add(body); + } + + public void remove(PhysicsBody body){ + bodies.remove(body); + } + + public void update(){ + for(int i = 0; i < layers; i++){ + trees[i].clear(); + } + + for(int i = 0; i < bodies.size; i++){ + PhysicsBody body = bodies.items[i]; + body.collided = false; + trees[body.layer].insert(body); + } + + for(int i = 0; i < bodies.size; i++){ + PhysicsBody body = bodies.items[i]; + body.hitbox(rect); + + seq.size = 0; + trees[body.layer].intersect(rect, seq); + + for(int j = 0; j < seq.size; j++){ + PhysicsBody other = seq.items[j]; + + if(other == body || other.collided) continue; + + float rs = body.radius + other.radius; + float dst = Mathf.dst(body.x, body.y, other.x, other.y); + + if(dst < rs){ + vec.set(body.x - other.x, body.y - other.y).setLength(rs - dst); + float ms = body.mass + other.mass; + float m1 = other.mass / ms, m2 = body.mass / ms; + + body.x += vec.x * m1 / scl; + body.y += vec.y * m1 / scl; + other.x -= vec.x * m2 / scl; + other.y -= vec.y * m2 / scl; + } + } + body.collided = true; + } + } + + public static class PhysicsBody implements QuadTreeObject{ + public float x, y, radius, mass; + public int layer = 0; + public boolean collided = false; + + @Override + public void hitbox(Rect out){ + out.setCentered(x, y, radius * 2, radius * 2); + } + } + } } diff --git a/core/src/mindustry/async/TeamIndexProcess.java b/core/src/mindustry/async/TeamIndexProcess.java index c4dbede3a7..13a234bbbc 100644 --- a/core/src/mindustry/async/TeamIndexProcess.java +++ b/core/src/mindustry/async/TeamIndexProcess.java @@ -5,6 +5,7 @@ import mindustry.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.type.*; +import mindustry.world.blocks.payloads.*; import java.util.*; @@ -13,7 +14,6 @@ public class TeamIndexProcess implements AsyncProcess{ private QuadTree[] trees = new QuadTree[Team.all.length]; private int[] counts = new int[Team.all.length]; private int[][] typeCounts = new int[Team.all.length][0]; - private int[][] activeCounts = new int[Team.all.length][0]; public QuadTree tree(Team team){ if(trees[team.id] == null) trees[team.id] = new QuadTree<>(Vars.world.getQuadBounds(new Rect())); @@ -29,10 +29,6 @@ public class TeamIndexProcess implements AsyncProcess{ return typeCounts[team.id].length <= type.id ? 0 : typeCounts[team.id][type.id]; } - public int countActive(Team team, UnitType type){ - return activeCounts[team.id].length <= type.id ? 0 : activeCounts[team.id][type.id]; - } - public void updateCount(Team team, UnitType type, int amount){ counts[team.id] += amount; if(typeCounts[team.id].length <= type.id){ @@ -41,11 +37,16 @@ public class TeamIndexProcess implements AsyncProcess{ typeCounts[team.id][type.id] += amount; } - public void updateActiveCount(Team team, UnitType type, int amount){ - if(activeCounts[team.id].length <= type.id){ - activeCounts[team.id] = new int[Vars.content.units().size]; + private void count(Unit unit){ + updateCount(unit.team, unit.type(), 1); + + if(unit instanceof Payloadc){ + ((Payloadc)unit).payloads().each(p -> { + if(p instanceof UnitPayload){ + count(((UnitPayload)p).unit); + } + }); } - activeCounts[team.id][type.id] += amount; } @Override @@ -63,7 +64,6 @@ public class TeamIndexProcess implements AsyncProcess{ } Arrays.fill(typeCounts[team.id], 0); - Arrays.fill(activeCounts[team.id], 0); } Arrays.fill(counts, 0); @@ -71,8 +71,7 @@ public class TeamIndexProcess implements AsyncProcess{ for(Unit unit : Groups.unit){ tree(unit.team).insert(unit); - updateCount(unit.team, unit.type(), 1); - if(!unit.deactivated) updateActiveCount(unit.team, unit.type(), 1); + count(unit); } } diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index dfb5198bf1..65b7c7f84a 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -34,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, mud, 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, @@ -64,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 @@ -83,7 +83,7 @@ public class Blocks implements ContentList{ repairPoint, resupplyPoint, //logic - message, switchBlock, microProcessor, logicProcessor, hyperProcessor, logicDisplay, memoryCell, + message, switchBlock, microProcessor, logicProcessor, hyperProcessor, largeLogicDisplay, logicDisplay, memoryCell, memoryBank, //campaign launchPad, launchPadLarge, @@ -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"){{ @@ -209,11 +208,14 @@ public class Blocks implements ContentList{ liquidDrop = Liquids.slag; isLiquid = true; cacheLayer = CacheLayer.slag; + attributes.set(Attribute.heat, 0.85f); + + emitLight = true; + lightRadius = 40f; + lightColor = Color.orange.cpy().a(0.38f); }}; - stone = new Floor("stone"){{ - - }}; + stone = new Floor("stone"); craters = new Floor("craters"){{ variants = 3; @@ -224,14 +226,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,12 +242,12 @@ 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; + lightRadius = 50f; lightColor = Color.orange.cpy().a(0.3f); }}; @@ -261,13 +263,23 @@ public class Blocks implements ContentList{ attributes.set(Attribute.oil, 1.5f); }}; + dirt = new Floor("dirt"); + + mud = new Floor("mud"){{ + speedMultiplier = 0.6f; + variants = 3; + status = StatusEffects.muddy; + statusDuration = 30f; + attributes.set(Attribute.water, 1f); + cacheLayer = CacheLayer.mud; + albedo = 0.35f; + }}; + ((ShallowLiquid)darksandTaintedWater).set(Blocks.taintedWater, Blocks.darksand); ((ShallowLiquid)sandWater).set(Blocks.water, Blocks.sand); ((ShallowLiquid)darksandWater).set(Blocks.water, Blocks.darksand); - holostone = new Floor("holostone"){{ - - }}; + dacite = new Floor("dacite"); grass = new Floor("grass"){{ attributes.set(Attribute.water, 0.1f); @@ -295,46 +307,51 @@ public class Blocks implements ContentList{ attributes.set(Attribute.water, 0.3f); }}; - cliffs = new StaticWall("cliffs"){{ - variants = 1; - fillsTile = false; - }}; - - rocks = new StaticWall("rocks"){{ + stoneWall = new StaticWall("stone-wall"){{ variants = 2; }}; - sporerocks = new StaticWall("sporerocks"){{ + sporeWall = new StaticWall("spore-wall"){{ variants = 2; }}; - rock = new Rock("rock"){{ + boulder = new Boulder("boulder"){{ variants = 2; }}; - snowrock = new Rock("snowrock"){{ + snowBoulder = new Boulder("snow-boulder"){{ + variants = 2; + snow.asFloor().decoration = ice.asFloor().decoration = iceSnow.asFloor().decoration = this; + }}; + + dirtWall = new StaticWall("dirt-wall"){{ variants = 2; }}; - icerocks = new StaticWall("icerocks"){{ + daciteWall = new StaticWall("dacite-wall"){{ + variants = 2; + }}; + + iceWall = new StaticWall("ice-wall"){{ variants = 2; iceSnow.asFloor().wall = this; }}; - snowrocks = new StaticWall("snowrocks"){{ + snowWall = new StaticWall("snow-wall"){{ variants = 2; }}; - duneRocks = new StaticWall("dunerocks"){{ + duneWall = new StaticWall("dune-wall"){{ variants = 2; + basalt.asFloor().wall = darksandWater.asFloor().wall = darksandTaintedWater.asFloor().wall = this; }}; - sandRocks = new StaticWall("sandrocks"){{ + sandWall = new StaticWall("sand-wall"){{ variants = 2; + sandWater.asFloor().wall = this; }}; - saltRocks = new StaticWall("saltrocks"){{ - }}; + saltWall = new StaticWall("salt-wall"); sporePine = new StaticTree("spore-pine"){{ variants = 0; @@ -348,17 +365,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 +380,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 +405,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 +524,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 +533,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 +784,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"){{ @@ -791,7 +808,7 @@ public class Blocks implements ContentList{ }}; door = new Door("door"){{ - requirements(Category.defense, with(Items.graphite, 6, Items.silicon, 4)); + requirements(Category.defense, with(Items.titanium, 6, Items.silicon, 4)); health = 100 * wallHealthMultiplier; }}; @@ -853,7 +870,8 @@ public class Blocks implements ContentList{ size = 2; reload = 250f; range = 85f; - healPercent = 14f; + healPercent = 11f; + phaseBoost = 15f; health = 80 * size * size; consumes.item(Items.phasefabric).boost(); }}; @@ -1011,7 +1029,7 @@ public class Blocks implements ContentList{ mechanicalPump = new Pump("mechanical-pump"){{ requirements(Category.liquid, with(Items.copper, 15, Items.metaglass, 10)); - pumpAmount = 0.1f; + pumpAmount = 0.11f; }}; rotaryPump = new Pump("rotary-pump"){{ @@ -1086,14 +1104,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,34 +1148,35 @@ public class Blocks implements ContentList{ powerProduction = 1.8f; generateEffect = Fx.redgeneratespark; size = 2; + floating = true; }}; - turbineGenerator = new BurnerGenerator("turbine-generator"){{ + steamGenerator = new BurnerGenerator("steam-generator"){{ requirements(Category.power, with(Items.copper, 35, Items.graphite, 25, Items.lead, 40, Items.silicon, 30)); - powerProduction = 6f; + powerProduction = 5.5f; itemDuration = 90f; - consumes.liquid(Liquids.water, 0.05f); + consumes.liquid(Liquids.water, 0.1f); 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"){{ @@ -1176,7 +1195,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); @@ -1256,7 +1275,7 @@ public class Blocks implements ContentList{ rotateSpeed = 1.4f; attribute = Attribute.water; - consumes.power(1f); + consumes.power(1.5f); }}; cultivator = new Cultivator("cultivator"){{ @@ -1269,7 +1288,7 @@ public class Blocks implements ContentList{ hasItems = true; consumes.power(0.80f); - consumes.liquid(Liquids.water, 0.18f); + consumes.liquid(Liquids.water, 0.2f); }}; oilExtractor = new Fracker("oil-extractor"){{ @@ -1309,7 +1328,7 @@ public class Blocks implements ContentList{ requirements(Category.effect, with(Items.copper, 3000, Items.lead, 3000, Items.silicon, 2000)); unitType = UnitTypes.beta; - health = 2000; + health = 3500; itemCapacity = 9000; size = 4; @@ -1320,7 +1339,7 @@ public class Blocks implements ContentList{ requirements(Category.effect, with(Items.copper, 8000, Items.lead, 8000, Items.silicon, 5000, Items.thorium, 4000)); unitType = UnitTypes.gamma; - health = 4000; + health = 6000; itemCapacity = 13000; size = 5; @@ -1341,7 +1360,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 @@ -1366,7 +1385,7 @@ public class Blocks implements ContentList{ ammoUseEffect = Fx.shellEjectSmall; health = 250; inaccuracy = 2f; - rotatespeed = 10f; + rotateSpeed = 10f; }}; scatter = new ItemTurret("scatter"){{ @@ -1384,7 +1403,7 @@ public class Blocks implements ContentList{ targetGround = false; recoilAmount = 2f; - rotatespeed = 15f; + rotateSpeed = 15f; inaccuracy = 17f; shootCone = 35f; @@ -1481,14 +1500,14 @@ public class Blocks implements ContentList{ arc = new PowerTurret("arc"){{ requirements(Category.turret, with(Items.copper, 35, Items.lead, 50)); shootType = new LightningBulletType(){{ - damage = 21; + damage = 20; lightningLength = 25; collidesAir = false; }}; reloadTime = 35f; shootCone = 40f; - rotatespeed = 8f; - powerUse = 4f; + rotateSpeed = 8f; + powerUse = 3f; targetAir = false; range = 90f; shootEffect = Fx.lightningShoot; @@ -1504,14 +1523,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"){{ @@ -1558,15 +1577,16 @@ public class Blocks implements ContentList{ }}; segment = new PointDefenseTurret("segment"){{ - requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phasefabric, 25)); + requirements(Category.turret, with(Items.silicon, 130, Items.thorium, 80, Items.phasefabric, 40)); + health = 250 * size * size; + range = 140f; hasPower = true; - consumes.power(3f); + consumes.powerCond(8f, (PointDefenseBuild b) -> b.target != null); size = 2; shootLength = 5f; - bulletDamage = 12f; - reloadTime = 20f; - health = 190 * size * size; + bulletDamage = 25f; + reloadTime = 10f; }}; fuse = new ItemTurret("fuse"){{ @@ -1585,8 +1605,10 @@ public class Blocks implements ContentList{ health = 220 * size * size; shootSound = Sounds.shotgun; + float brange = range + 10f; + ammo(Items.thorium, new ShrapnelBulletType(){{ - length = range + 10f; + length = brange; damage = 105f; ammoMultiplier = 6f; }}); @@ -1609,6 +1631,7 @@ public class Blocks implements ContentList{ reloadTime = 60f; ammoEjectBack = 5f; ammoUseEffect = Fx.shellEjectBig; + ammoPerShot = 2; cooldown = 0.03f; velocityInaccuracy = 0.2f; restitution = 0.02f; @@ -1634,7 +1657,7 @@ public class Blocks implements ContentList{ range = 200f; size = 3; recoilAmount = 3f; - rotatespeed = 10f; + rotateSpeed = 10f; inaccuracy = 10f; shootCone = 30f; shootSound = Sounds.shootSnap; @@ -1643,7 +1666,7 @@ public class Blocks implements ContentList{ }}; spectre = new ItemTurret("spectre"){{ - requirements(Category.turret, with(Items.copper, 350, Items.graphite, 300, Items.surgealloy, 250, Items.plastanium, 175, Items.thorium, 250)); + requirements(Category.turret, with(Items.copper, 900, Items.graphite, 300, Items.surgealloy, 250, Items.plastanium, 175, Items.thorium, 250)); ammo( Items.graphite, Bullets.standardDenseBig, Items.pyratite, Bullets.standardIncendiaryBig, @@ -1669,7 +1692,7 @@ public class Blocks implements ContentList{ }}; meltdown = new LaserTurret("meltdown"){{ - requirements(Category.turret, with(Items.copper, 250, Items.lead, 350, Items.graphite, 300, Items.surgealloy, 325, Items.silicon, 325)); + requirements(Category.turret, with(Items.copper, 1200, Items.lead, 350, Items.graphite, 300, Items.surgealloy, 325, Items.silicon, 325)); shootEffect = Fx.shootBigSmoke2; shootCone = 40f; recoilAmount = 4f; @@ -1679,13 +1702,13 @@ public class Blocks implements ContentList{ reloadTime = 90f; firingMoveFract = 0.5f; shootDuration = 220f; - powerUse = 14f; + powerUse = 17f; shootSound = Sounds.laserbig; activeSound = Sounds.beam; activeSoundVolume = 2f; shootType = new ContinuousLaserBulletType(70){{ - length = 220f; + length = 200f; hitEffect = Fx.hitMeltdown; drawSize = 420f; @@ -1731,11 +1754,11 @@ 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; consumes.power(1.2f); + floating = true; }}; additiveReconstructor = new Reconstructor("additive-reconstructor"){{ @@ -1758,11 +1781,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; @@ -1777,11 +1800,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, 450)); + requirements(Category.units, with(Items.lead, 2000, Items.silicon, 1000, Items.titanium, 2000, Items.thorium, 750, Items.plastanium, 450, Items.phasefabric, 600)); size = 7; consumes.power(13f); - consumes.items(with(Items.silicon, 450, Items.titanium, 550, Items.plastanium, 550)); + consumes.items(with(Items.silicon, 850, Items.titanium, 750, Items.plastanium, 650)); consumes.liquid(Liquids.cryofluid, 1f); constructTime = 60f * 60f * 1.5f; @@ -1789,15 +1812,20 @@ public class Blocks implements ContentList{ upgrades = new UnitType[][]{ {UnitTypes.zenith, UnitTypes.antumbra}, + {UnitTypes.spiroct, UnitTypes.arkyid}, + {UnitTypes.fortress, UnitTypes.scepter}, + {UnitTypes.bryde, UnitTypes.sei}, + {UnitTypes.mega, UnitTypes.quad}, + {UnitTypes.quasar, UnitTypes.vela}, }; }}; tetrativeReconstructor = new Reconstructor("tetrative-reconstructor"){{ - requirements(Category.units, with(Items.lead, 4000, Items.silicon, 1500, Items.thorium, 500, Items.plastanium, 450, Items.phasefabric, 600, Items.surgealloy, 500)); + requirements(Category.units, with(Items.lead, 4000, Items.silicon, 3000, Items.thorium, 1000, Items.plastanium, 600, Items.phasefabric, 600, Items.surgealloy, 800)); size = 9; consumes.power(25f); - consumes.items(with(Items.silicon, 350, Items.plastanium, 550, Items.surgealloy, 350, Items.phasefabric, 150)); + consumes.items(with(Items.silicon, 1000, Items.plastanium, 600, Items.surgealloy, 500, Items.phasefabric, 350)); consumes.liquid(Liquids.cryofluid, 3f); constructTime = 60f * 60f * 4; @@ -1805,6 +1833,11 @@ public class Blocks implements ContentList{ upgrades = new UnitType[][]{ {UnitTypes.antumbra, UnitTypes.eclipse}, + {UnitTypes.arkyid, UnitTypes.toxopid}, + {UnitTypes.scepter, UnitTypes.reign}, + {UnitTypes.sei, UnitTypes.omura}, + {UnitTypes.quad, UnitTypes.oct}, + {UnitTypes.vela, UnitTypes.corvus} }; }}; @@ -1820,6 +1853,8 @@ public class Blocks implements ContentList{ size = 2; range = 80f; + itemCapacity = 20; + ammoAmount = 5; consumes.item(Items.copper, 1); }}; @@ -1915,9 +1950,9 @@ public class Blocks implements ContentList{ logicProcessor = new LogicBlock("logic-processor"){{ requirements(Category.logic, with(Items.lead, 320, Items.silicon, 100, Items.graphite, 60, Items.thorium, 50)); - instructionsPerTick = 5; + instructionsPerTick = 8; - range = 8 * 20; + range = 8 * 22; size = 2; }}; @@ -1930,23 +1965,38 @@ public class Blocks implements ContentList{ instructionsPerTick = 25; - range = 8 * 40; + range = 8 * 42; size = 3; }}; + memoryCell = new MemoryBlock("memory-cell"){{ + requirements(Category.logic, with(Items.graphite, 30, Items.silicon, 30)); + + memoryCapacity = 64; + }}; + + memoryBank = new MemoryBlock("memory-bank"){{ + requirements(Category.logic, with(Items.graphite, 80, Items.silicon, 80, Items.phasefabric, 30)); + + memoryCapacity = 512; + size = 2; + }}; + logicDisplay = new LogicDisplay("logic-display"){{ - requirements(Category.logic, with(Items.copper, 200, Items.lead, 120, Items.silicon, 100, Items.metaglass, 50)); + requirements(Category.logic, with(Items.lead, 100, Items.silicon, 50, Items.metaglass, 50)); displaySize = 80; size = 3; }}; - memoryCell = new MemoryBlock("memory-cell"){{ - requirements(Category.logic, with(Items.graphite, 40, Items.silicon, 40)); + largeLogicDisplay = new LogicDisplay("large-logic-display"){{ + requirements(Category.logic, with(Items.lead, 200, Items.silicon, 150, Items.metaglass, 100, Items.phasefabric, 75)); - memoryCapacity = 64; + displaySize = 176; + + size = 6; }}; //endregion diff --git a/core/src/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java index cc6e1f10a0..bf3a575433 100644 --- a/core/src/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -42,7 +42,7 @@ public class Bullets implements ContentList{ @Override public void load(){ - artilleryDense = new ArtilleryBulletType(3f, 12, "shell"){{ + artilleryDense = new ArtilleryBulletType(3f, 20, "shell"){{ hitEffect = Fx.flakExplosion; knockback = 0.8f; lifetime = 80f; @@ -63,7 +63,7 @@ public class Bullets implements ContentList{ collidesAir = false; }}; - artilleryPlastic = new ArtilleryBulletType(3.4f, 12, "shell"){{ + artilleryPlastic = new ArtilleryBulletType(3.4f, 20, "shell"){{ hitEffect = Fx.plasticExplosion; knockback = 1f; lifetime = 80f; @@ -77,7 +77,7 @@ public class Bullets implements ContentList{ frontColor = Pal.plastaniumFront; }}; - artilleryHoming = new ArtilleryBulletType(3f, 12, "shell"){{ + artilleryHoming = new ArtilleryBulletType(3f, 20, "shell"){{ hitEffect = Fx.flakExplosion; knockback = 0.8f; lifetime = 80f; @@ -91,7 +91,7 @@ public class Bullets implements ContentList{ homingRange = 50f; }}; - artilleryIncendiary = new ArtilleryBulletType(3f, 12, "shell"){{ + artilleryIncendiary = new ArtilleryBulletType(3f, 20, "shell"){{ hitEffect = Fx.blastExplosion; knockback = 0.8f; lifetime = 80f; @@ -105,7 +105,7 @@ public class Bullets implements ContentList{ trailEffect = Fx.incendTrail; }}; - artilleryExplosive = new ArtilleryBulletType(2f, 12, "shell"){{ + artilleryExplosive = new ArtilleryBulletType(2f, 20, "shell"){{ hitEffect = Fx.blastExplosion; knockback = 0.8f; lifetime = 80f; @@ -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; @@ -269,13 +269,13 @@ public class Bullets implements ContentList{ status = StatusEffects.burning; }}; - missileSurge = new MissileBulletType(3.7f, 20){{ + missileSurge = new MissileBulletType(3.7f, 18){{ width = 8f; height = 8f; shrinkY = 0f; drag = -0.01f; - splashDamageRadius = 28f; - splashDamage = 40f; + splashDamageRadius = 25f; + splashDamage = 25f; hitEffect = Fx.blastExplosion; despawnEffect = Fx.blastExplosion; lightning = 2; @@ -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..c11c32fbcb 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); @@ -144,7 +145,7 @@ public class Fx{ int i = 0; for(Vec2 p : lines){ - Fill.square(p.x, p.y, (5f - (float)i++ / lines.size * 2f) * e.fout(), 45); + Fill.circle(p.x, p.y, Lines.getStroke() / 2f); } }), @@ -289,6 +290,50 @@ public class Fx{ Lines.spikes(e.x, e.y, 1f + e.fin() * 6f, e.fout() * 4f, 6); }), + greenBomb = new Effect(40f, 100f, e -> { + color(Pal.heal); + stroke(e.fout() * 2f); + Lines.circle(e.x, e.y, 4f + e.finpow() * 65f); + + color(Pal.heal); + for(int i = 0; i < 4; i++){ + Drawf.tri(e.x, e.y, 6f, 100f * e.fout(), i*90); + } + + color(); + for(int i = 0; i < 4; i++){ + Drawf.tri(e.x, e.y, 3f, 35f * e.fout(), i*90); + } + }), + + greenLaserCharge = new Effect(80f, 100f, e -> { + color(Pal.heal); + stroke(e.fin() * 2f); + Lines.circle(e.x, e.y, 4f + e.fout() * 100f); + + Fill.circle(e.x, e.y, e.fin() * 20); + + randLenVectors(e.id, 20, 40f * e.fout(), (x, y) -> { + Fill.circle(e.x + x, e.y + y, e.fin() * 5f); + }); + + color(); + + Fill.circle(e.x, e.y, e.fin() * 10); + }), + + greenLaserChargeSmall = new Effect(40f, 100f, e -> { + color(Pal.heal); + stroke(e.fin() * 2f); + Lines.circle(e.x, e.y, e.fout() * 50f); + }), + + healWaveDynamic = new Effect(22, e -> { + color(Pal.heal); + stroke(e.fout() * 2f); + Lines.circle(e.x, e.y, 4f + e.finpow() * e.rotation); + }), + healWave = new Effect(22, e -> { color(Pal.heal); stroke(e.fout() * 2f); @@ -399,6 +444,17 @@ public class Fx{ }), + hitMeltHeal = new Effect(12, e -> { + color(Pal.heal); + stroke(e.fout() * 2f); + + randLenVectors(e.id, 6, e.finpow() * 18f, e.rotation, 360f, (x, y) -> { + float ang = Mathf.angle(x, y); + lineAngle(e.x + x, e.y + y, ang, e.fout() * 4 + 1f); + }); + + }), + hitLaser = new Effect(8, e -> { color(Color.white, Pal.heal, e.fin()); stroke(0.5f + e.fout()); @@ -514,6 +570,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); @@ -662,6 +741,13 @@ public class Fx{ Fill.circle(e.x, e.y, e.fout() * 1f); }), + + muddy = new Effect(80f, e -> { + color(Color.valueOf("432722")); + alpha(Mathf.clamp(e.fin() * 2f)); + + Fill.circle(e.x, e.y, e.fout() * 1f); + }), sapped = new Effect(40f, e -> { color(Pal.sap); @@ -877,7 +963,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 +972,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 +981,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) -> { @@ -965,6 +1051,53 @@ public class Fx{ }).ground(400f), + railShoot = new Effect(24f, e -> { + e.scaled(10f, b -> { + color(Color.white, Color.lightGray, b.fin()); + stroke(b.fout() * 3f + 0.2f); + Lines.circle(b.x, b.y, b.fin() * 50f); + }); + + color(Pal.orangeSpark); + + for(int i : Mathf.signs){ + Drawf.tri(e.x, e.y, 13f * e.fout(), 85f, e.rotation + 90f * i); + } + }), + + railTrail = new Effect(16f, e -> { + color(Pal.orangeSpark); + + for(int i : Mathf.signs){ + Drawf.tri(e.x, e.y, 10f * e.fout(), 24f, e.rotation + 90 + 90f * i); + } + }), + + railHit = new Effect(18f, 200f, e -> { + if(true){ + color(Pal.orangeSpark); + + for(int i : Mathf.signs){ + Drawf.tri(e.x, e.y, 10f * e.fout(), 60f, e.rotation + 140f * i); + } + }else{ + e.scaled(7f, b -> { + color(Color.white, Color.lightGray, b.fin()); + stroke(b.fout() * 2f + 0.2f); + Lines.circle(b.x, b.y, b.fin() * 28f); + }); + + color(Pal.orangeSpark); + float rot = e.rotation + Mathf.randomSeedRange(e.id, 20f); + float w = 9f * e.fout(); + + Drawf.tri(e.x, e.y, w, 100f, rot); + Drawf.tri(e.x, e.y, w, 10f, rot + 180f); + } + + + }), + lancerLaserShoot = new Effect(21f, e -> { color(Pal.lancerLaser); @@ -976,7 +1109,7 @@ public class Fx{ lancerLaserShootSmoke = new Effect(26f, e -> { color(Color.white); - float length = e.data == null ? 70f : (Float)e.data; + float length = e.data == null || !(e.data instanceof Float) ? 70f : (Float)e.data; randLenVectors(e.id, 7, length, e.rotation, 0f, (x, y) -> { lineAngle(e.x + x, e.y + y, Mathf.angle(x, y), e.fout() * 9f); @@ -1046,6 +1179,15 @@ public class Fx{ }); }), + cloudsmoke = new Effect(70, e -> { + randLenVectors(e.id, 12, 15f + e.fin() * 45f, (x, y) -> { + float size = e.fslope() * 2f; + color(Color.gray); + alpha(e.fslope()); + Fill.circle(e.x + x, e.y + y, size); + }); + }), + nuclearcloud = new Effect(90, 200f, e -> { randLenVectors(e.id, 10, e.finpow() * 90f, (x, y) -> { float size = e.fout() * 14f; @@ -1142,6 +1284,14 @@ public class Fx{ Fill.square(e.x + x, e.y + y, 1f + e.fout() * 3f, 45); }); }), + + smokeCloud = new Effect(70, e -> { + randLenVectors(e.id, e.fin(), 30, 30f, (x, y, fin, fout) -> { + color(Color.gray); + alpha((0.5f - Math.abs(fin - 0.5f)) * 2f); + Fill.circle(e.x + x, e.y + y, 0.5f + fout * 4f); + }); + }), smeltsmoke = new Effect(15, e -> { randLenVectors(e.id, 6, 4f + e.fin() * 5f, (x, y) -> { @@ -1271,10 +1421,11 @@ public class Fx{ }), - //TODO fix false in constructor ripple = new Effect(30, e -> { + e.lifetime = 30f*e.rotation; + color(Tmp.c1.set(e.color).mul(1.5f)); - stroke(e.fout() + 0.4f); + stroke(e.fout() * 1.4f); Lines.circle(e.x, e.y, (2f + e.fin() * 4f) * e.rotation); }).ground(), diff --git a/core/src/mindustry/content/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..7dc957a344 100644 --- a/core/src/mindustry/content/StatusEffects.java +++ b/core/src/mindustry/content/StatusEffects.java @@ -9,7 +9,7 @@ import mindustry.type.StatusEffect; import static mindustry.Vars.*; public class StatusEffects implements ContentList{ - public static StatusEffect none, burning, freezing, wet, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed; + public static StatusEffect none, burning, freezing, unmoving, slow, wet, muddy, melting, sapped, tarred, overdrive, overclock, shielded, shocked, blasted, corroded, boss, sporeSlowed; @Override public void load(){ @@ -45,6 +45,14 @@ public class StatusEffects implements ContentList{ }); }}; + unmoving = new StatusEffect("unmoving"){{ + speedMultiplier = 0.001f; + }}; + + slow = new StatusEffect("slow"){{ + speedMultiplier = 0.4f; + }}; + wet = new StatusEffect("wet"){{ color = Color.royal; speedMultiplier = 0.94f; @@ -53,7 +61,7 @@ public class StatusEffects implements ContentList{ init(() -> { trans(shocked, ((unit, time, newTime, result) -> { - unit.damagePierce(20f); + unit.damagePierce(14f); if(unit.team() == state.rules.waveTeam){ Events.fire(Trigger.shock); } @@ -62,6 +70,13 @@ public class StatusEffects implements ContentList{ opposite(burning); }); }}; + + muddy = new StatusEffect("muddy"){{ + color = Color.valueOf("46382a"); + speedMultiplier = 0.94f; + effect = Fx.muddy; + effectChance = 0.09f; + }}; melting = new StatusEffect("melting"){{ speedMultiplier = 0.8f; @@ -121,13 +136,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 e7d21444a0..8a35f958fe 100644 --- a/core/src/mindustry/content/TechTree.java +++ b/core/src/mindustry/content/TechTree.java @@ -1,18 +1,15 @@ package mindustry.content; import arc.*; -import arc.math.*; import arc.struct.*; import arc.util.ArcAnnotate.*; -import mindustry.core.*; import mindustry.ctype.*; import mindustry.game.Objectives.*; import mindustry.type.*; -import mindustry.world.*; import static mindustry.content.Blocks.*; -import static mindustry.content.SectorPresets.*; import static mindustry.content.SectorPresets.craters; +import static mindustry.content.SectorPresets.*; import static mindustry.content.UnitTypes.*; import static mindustry.type.ItemStack.*; @@ -112,6 +109,9 @@ public class TechTree implements ContentList{ node(Items.coal, with(Items.lead, 3000), () -> { node(Items.graphite, with(Items.coal, 1000), () -> { + node(illuminator, () -> { + }); + node(graphitePress, () -> { node(Items.titanium, with(Items.graphite, 6000, Items.copper, 10000, Items.lead, 10000), () -> { node(pneumaticDrill, () -> { @@ -208,11 +208,15 @@ public class TechTree implements ContentList{ node(switchBlock, () -> { node(message, () -> { node(logicDisplay, () -> { + node(largeLogicDisplay, () -> { + }); }); node(memoryCell, () -> { + node(memoryBank, () -> { + }); }); }); @@ -261,10 +265,10 @@ public class TechTree implements ContentList{ }); }); - node(turbineGenerator, () -> { + node(steamGenerator, () -> { node(thermalGenerator, () -> { node(differentialGenerator, () -> { - node(thoriumReactor, () -> { + node(thoriumReactor, Seq.with(new Research(Liquids.cryofluid)), () -> { node(impactReactor, () -> { }); @@ -366,14 +370,22 @@ public class TechTree implements ContentList{ node(dagger, () -> { node(mace, () -> { node(fortress, () -> { + node(scepter, () -> { + node(reign, () -> { + }); + }); }); }); node(nova, () -> { node(pulsar, () -> { node(quasar, () -> { + node(vela, () -> { + node(corvus, () -> { + }); + }); }); }); }); @@ -381,7 +393,11 @@ public class TechTree implements ContentList{ node(crawler, () -> { node(atrax, () -> { node(spiroct, () -> { + node(arkyid, () -> { + node(toxopid, () -> { + }); + }); }); }); }); @@ -402,7 +418,11 @@ public class TechTree implements ContentList{ node(mono, () -> { node(poly, () -> { node(mega, () -> { + node(quad, () -> { + node(oct, () -> { + }); + }); }); }); }); @@ -412,7 +432,11 @@ public class TechTree implements ContentList{ node(risso, () -> { node(minke, () -> { node(bryde, () -> { + node(sei, () -> { + node(omura, () -> { + }); + }); }); }); }); @@ -429,8 +453,6 @@ public class TechTree implements ContentList{ }); }); - //TODO research sectors - node(groundZero, () -> { node(frozenForest, Seq.with( new SectorComplete(groundZero), @@ -492,7 +514,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), @@ -514,42 +536,27 @@ public class TechTree implements ContentList{ }); } - private static void setup(){ + public static void setup(){ TechNode.context = null; map = new ObjectMap<>(); all = new Seq<>(); } - private static TechNode node(UnlockableContent content, Runnable children){ - ItemStack[] requirements; - - if(content instanceof Block){ - Block block = (Block)content; - - requirements = new ItemStack[block.requirements.length]; - for(int i = 0; i < requirements.length; i++){ - int quantity = 40 + Mathf.round(Mathf.pow(block.requirements[i].amount, 1.25f) * 20, 10); - - requirements[i] = new ItemStack(block.requirements[i].item, UI.roundAmount(quantity)); - } - }else{ - requirements = ItemStack.empty; - } - - return node(content, requirements, children); + public static TechNode node(UnlockableContent content, Runnable children){ + return node(content, content.researchRequirements(), children); } - private static TechNode node(UnlockableContent content, ItemStack[] requirements, Runnable children){ + public static TechNode node(UnlockableContent content, ItemStack[] requirements, Runnable children){ return new TechNode(content, requirements, children); } - private static TechNode node(UnlockableContent content, Seq objectives, Runnable children){ - TechNode node = new TechNode(content, empty, children); + public static TechNode node(UnlockableContent content, Seq objectives, Runnable children){ + TechNode node = new TechNode(content, content.researchRequirements(), children); node.objectives = objectives; return node; } - private static TechNode node(UnlockableContent block){ + public static TechNode node(UnlockableContent block){ return node(block, () -> {}); } @@ -579,25 +586,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]; @@ -622,7 +624,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 3f6c36accb..1eed21063b 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -11,23 +11,28 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import static mindustry.Vars.*; + public class UnitTypes implements ContentList{ //region definitions - //ground - public static @EntityDef({Unitc.class, Mechc.class}) UnitType mace, dagger, crawler, fortress, vestige, cataclyst; + //mech + public static @EntityDef({Unitc.class, Mechc.class}) UnitType mace, dagger, crawler, fortress, scepter, reign; - //ground + builder - public static @EntityDef({Unitc.class, Mechc.class, Builderc.class}) UnitType nova; + //mech + builder + miner + commander + public static @EntityDef({Unitc.class, Mechc.class, Builderc.class, Minerc.class, Commanderc.class}) UnitType nova, pulsar, quasar; - //ground + builder + miner + commander - public static @EntityDef({Unitc.class, Mechc.class, Builderc.class, Minerc.class, Commanderc.class}) UnitType pulsar, quasar; + //mech + commander + public static @EntityDef({Unitc.class, Mechc.class, Commanderc.class}) UnitType vela; + + //legs + commander + public static @EntityDef({Unitc.class, Legsc.class, Commanderc.class}) UnitType corvus; //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; @@ -41,11 +46,17 @@ public class UnitTypes implements ContentList{ //air + building + mining + payload public static @EntityDef({Unitc.class, Builderc.class, Minerc.class, Payloadc.class}) UnitType mega; + //air + building + payload + public static @EntityDef({Unitc.class, Builderc.class, Payloadc.class}) UnitType quad; + + //air + building + payload + command + public static @EntityDef({Unitc.class, Builderc.class, Payloadc.class, Commanderc.class}) UnitType oct; + //air + building + mining public static @EntityDef({Unitc.class, Builderc.class, Minerc.class}) UnitType alpha, beta, gamma; - //water - public static @EntityDef({Unitc.class, WaterMovec.class, Commanderc.class}) UnitType risso, minke, bryde; + //water + commander + public static @EntityDef({Unitc.class, WaterMovec.class, Commanderc.class}) UnitType risso, minke, bryde, sei, omura; //special block unit type public static @EntityDef({Unitc.class, BlockUnitc.class}) UnitType block; @@ -58,12 +69,13 @@ public class UnitTypes implements ContentList{ dagger = new UnitType("dagger"){{ speed = 0.5f; - hitsize = 8f; + hitSize = 8f; health = 140; weapons.add(new Weapon("large-weapon"){{ reload = 14f; x = 4f; y = 2f; + top = false; ejectEffect = Fx.shellEjectSmall; bullet = Bullets.standardCopper; }}); @@ -71,25 +83,24 @@ public class UnitTypes implements ContentList{ mace = new UnitType("mace"){{ speed = 0.4f; - hitsize = 9f; - range = 10f; + hitSize = 9f; health = 500; armor = 4f; immunities.add(StatusEffects.burning); weapons.add(new Weapon("flamethrower"){{ + top = false; shootSound = Sounds.flame; shootY = 2f; 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; @@ -103,13 +114,15 @@ public class UnitTypes implements ContentList{ fortress = new UnitType("fortress"){{ speed = 0.38f; - hitsize = 13f; + hitSize = 13f; rotateSpeed = 3f; targetAir = false; health = 790; armor = 9f; + mechFrontSway = 0.55f; weapons.add(new Weapon("artillery"){{ + top = false; y = 1f; x = 9f; reload = 60f; @@ -132,6 +145,123 @@ 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; + singleTarget = true; + + weapons.add( + new Weapon("scepter-weapon"){{ + top = false; + 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"){{ + top = false; + 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 @@ -139,15 +269,18 @@ public class UnitTypes implements ContentList{ itemCapacity = 60; canBoost = true; boostMultiplier = 1.5f; - speed = 0.52f; - hitsize = 8f; + speed = 0.55f; + hitSize = 8f; health = 110f; buildSpeed = 0.8f; armor = 1f; + commandLimit = 8; abilities.add(new HealFieldAbility(10f, 60f * 4, 60f)); + ammoType = AmmoTypes.power; weapons.add(new Weapon("heal-weapon"){{ + top = false; shootY = 2f; reload = 24f; x = 4.5f; @@ -163,8 +296,8 @@ public class UnitTypes implements ContentList{ itemCapacity = 60; canBoost = true; boostMultiplier = 1.5f; - speed = 0.48f; - hitsize = 10f; + speed = 0.65f; + hitSize = 10f; health = 320f; buildSpeed = 0.9f; armor = 4f; @@ -174,8 +307,10 @@ public class UnitTypes implements ContentList{ commandLimit = 8; abilities.add(new ShieldFieldAbility(20f, 40f, 60f * 5, 60f)); + ammoType = AmmoTypes.power; weapons.add(new Weapon("heal-shotgun-weapon"){{ + top = false; x = 5f; shake = 2.2f; y = 0.5f; @@ -203,7 +338,7 @@ public class UnitTypes implements ContentList{ quasar = new UnitType("quasar"){{ mineTier = 1; - hitsize = 12f; + hitSize = 12f; boostMultiplier = 2f; itemCapacity = 80; health = 650f; @@ -212,16 +347,21 @@ public class UnitTypes implements ContentList{ armor = 9f; landShake = 2f; + commandLimit = 10; + mechFrontSway = 0.55f; + ammoType = AmmoTypes.power; + speed = 0.4f; - hitsize = 10f; + hitSize = 10f; mineTier = 2; 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"){{ + top = false; shake = 2f; shootY = 4f; x = 6.5f; @@ -230,7 +370,7 @@ public class UnitTypes implements ContentList{ shootSound = Sounds.laser; bullet = new LaserBulletType(){{ - damage = 30f; + damage = 40f; recoil = 1f; sideAngle = 45f; sideWidth = 1f; @@ -240,6 +380,139 @@ public class UnitTypes implements ContentList{ }}); }}; + vela = new UnitType("vela"){{ + hitSize = 23f; + + rotateSpeed = 1.6f; + canDrown = false; + mechFrontSway = 1f; + + mechStepParticles = true; + mechStepShake = 0.15f; + ammoType = AmmoTypes.powerHigh; + + speed = 0.35f; + boostMultiplier = 2.1f; + engineOffset = 12f; + engineSize = 6f; + lowAltitude = true; + + health = 6500f; + armor = 7f; + canBoost = true; + landShake = 4f; + + commandLimit = 8; + + weapons.add(new Weapon("vela-weapon"){{ + mirror = false; + top = false; + shake = 4f; + shootY = 13f; + x = y = 0f; + + firstShotDelay = Fx.greenLaserChargeSmall.lifetime - 1f; + + reload = 320f; + recoil = 0f; + shootSound = Sounds.laser; + continuous = true; + cooldownTime = 200f; + + bullet = new ContinuousLaserBulletType(20){{ + length = 150f; + hitEffect = Fx.hitMeltHeal; + drawSize = 420f; + lifetime = 160f; + shake = 1f; + despawnEffect = Fx.smokeCloud; + smokeEffect = Fx.none; + + shootEffect = Fx.greenLaserChargeSmall; + + incendChance = 0.05f; + incendSpread = 5f; + incendAmount = 1; + + colors = new Color[]{Pal.heal.cpy().a(.2f), Pal.heal.cpy().a(.5f), Pal.heal.cpy().mul(1.2f), Color.white}; + }}; + + shootStatus = StatusEffects.slow; + shootStatusDuration = bullet.lifetime + firstShotDelay; + }}); + }}; + + corvus = new UnitType("corvus"){{ + mineTier = 1; + hitSize = 29f; + itemCapacity = 80; + health = 18000f; + buildSpeed = 1.7f; + armor = 9f; + landShake = 1.5f; + rotateSpeed = 1.5f; + + commandLimit = 8; + + legCount = 4; + legLength = 14f; + legBaseOffset = 11f; + legMoveSpace = 1.5f; + legTrns = 0.58f; + hovering = true; + visualElevation = 0.2f; + allowLegStep = true; + ammoType = AmmoTypes.powerHigh; + groundLayer = Layer.legUnit; + + speed = 0.3f; + + mineTier = 2; + mineSpeed = 7f; + drawShields = false; + + weapons.add(new Weapon("corvus-weapon"){{ + top = false; + mirror = false; + shake = 14f; + shootY = 5f; + x = y = 0; + reload = 350f; + recoil = 0f; + shootSound = Sounds.laser; + + cooldownTime = 350f; + + shootStatusDuration = 60f * 2f; + shootStatus = StatusEffects.unmoving; + firstShotDelay = Fx.greenLaserCharge.lifetime; + + bullet = new LaserBulletType(){{ + length = 460f; + damage = 550f; + width = 75f; + + lifetime = 65f; + + lightningSpacing = 35f; + lightningLength = 5; + lightningDelay = 1.1f; + lightningLengthRand = 15; + lightningDamage = 50; + lightningAngleRand = 40f; + largeHit = true; + lightColor = lightningColor = Pal.heal; + + shootEffect = Fx.greenLaserCharge; + + sideAngle = 15f; + sideWidth = 0f; + sideLength = 0f; + colors = new Color[]{Pal.heal.cpy().a(0.4f), Pal.heal, Color.white}; + }}; + }}); + }}; + //endregion //region ground legs @@ -247,9 +520,9 @@ public class UnitTypes implements ContentList{ defaultController = SuicideAI::new; speed = 0.85f; - hitsize = 8f; - health = 170; - sway = 0.25f; + hitSize = 8f; + health = 180; + mechSideSway = 0.25f; range = 40f; weapons.add(new Weapon(){{ @@ -263,7 +536,7 @@ public class UnitTypes implements ContentList{ speed = 1f; splashDamageRadius = 55f; instantDisappear = true; - splashDamage = 45f; + splashDamage = 55f; killShooter = true; hittable = false; collidesAir = true; @@ -275,11 +548,12 @@ public class UnitTypes implements ContentList{ itemCapacity = 80; speed = 0.5f; drag = 0.4f; - hitsize = 10f; + hitSize = 10f; rotateSpeed = 3f; targetAir = false; health = 600; immunities = ObjectSet.with(StatusEffects.burning, StatusEffects.melting); + legCount = 4; legLength = 9f; legTrns = 0.6f; @@ -292,6 +566,7 @@ public class UnitTypes implements ContentList{ groundLayer = Layer.legUnit - 1f; weapons.add(new Weapon("eruption"){{ + top = false; shootY = 3f; reload = 10f; ejectEffect = Fx.none; @@ -311,10 +586,9 @@ public class UnitTypes implements ContentList{ }}; spiroct = new UnitType("spiroct"){{ - itemCapacity = 200; speed = 0.4f; drag = 0.4f; - hitsize = 12f; + hitSize = 12f; rotateSpeed = 3f; health = 760; immunities = ObjectSet.with(StatusEffects.burning, StatusEffects.melting); @@ -325,6 +599,7 @@ public class UnitTypes implements ContentList{ legBaseOffset = 2f; hovering = true; armor = 5f; + ammoType = AmmoTypes.power; buildSpeed = 0.75f; @@ -376,52 +651,220 @@ 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; + ammoType = AmmoTypes.power; 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 = 22000; + armor = 13f; + + 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; + ammoType = AmmoTypes.powerHigh; + + 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 = 90f; + splashDamage = 75f; + 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 = 40f; + backColor = Pal.sapBulletBack; + frontColor = lightningColor = Pal.sapBullet; + lightning = 2; + lightningLength = 5; + smokeEffect = Fx.shootBigSmoke2; + hitShake = 5f; + + status = StatusEffects.sapped; + statusDuration = 60f * 10; + }}; }}; }}); }}; @@ -438,10 +881,11 @@ public class UnitTypes implements ContentList{ faceTarget = false; engineOffset = 5.5f; range = 140f; + weapons.add(new Weapon(){{ y = 0f; x = 2f; - reload = 15f; + reload = 13f; ejectEffect = Fx.shellEjectSmall; bullet = Bullets.standardCopper; shootSound = Sounds.shoot; @@ -454,6 +898,7 @@ public class UnitTypes implements ContentList{ accel = 0.08f; drag = 0.016f; flying = true; + hitSize = 9f; targetAir = false; engineOffset = 7.8f; range = 140f; @@ -485,12 +930,12 @@ public class UnitTypes implements ContentList{ zenith = new UnitType("zenith"){{ health = 700; - speed = 1.9f; + speed = 1.7f; accel = 0.04f; drag = 0.016f; flying = true; range = 140f; - hitsize = 18f; + hitSize = 20f; lowAltitude = true; armor = 5f; @@ -528,9 +973,9 @@ public class UnitTypes implements ContentList{ }}; antumbra = new UnitType("antumbra"){{ - speed = 1.13f; - accel = 0.035f; - drag = 0.05f; + speed = 0.8f; + accel = 0.04f; + drag = 0.04f; rotateSpeed = 1.9f; flying = true; lowAltitude = true; @@ -538,7 +983,7 @@ public class UnitTypes implements ContentList{ armor = 9f; engineOffset = 21; engineSize = 5.3f; - hitsize = 58f; + hitSize = 56f; BulletType missiles = new MissileBulletType(2.7f, 10){{ width = 8f; @@ -582,7 +1027,7 @@ public class UnitTypes implements ContentList{ new Weapon("large-bullet-mount"){{ y = 2f; x = 10f; - shootY = 12f; + shootY = 10f; reload = 12; shake = 1f; rotateSpeed = 2f; @@ -601,19 +1046,31 @@ public class UnitTypes implements ContentList{ }}; eclipse = new UnitType("eclipse"){{ - speed = 1.09f; - accel = 0.02f; - drag = 0.05f; + speed = 0.52f; + accel = 0.04f; + drag = 0.04f; rotateSpeed = 1f; flying = true; lowAltitude = true; - health = 18000; + health = 20000; engineOffset = 38; engineSize = 7.3f; - hitsize = 58f; + 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; @@ -628,60 +1085,39 @@ public class UnitTypes implements ContentList{ rotate = true; bullet = new LaserBulletType(){{ - damage = 80f; + damage = 90f; sideAngle = 20f; sideWidth = 1.5f; sideLength = 80f; width = 25f; - length = 220f; + length = 200f; shootEffect = Fx.shockwave; 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 +1136,9 @@ public class UnitTypes implements ContentList{ engineOffset = 5.7f; itemCapacity = 30; range = 50f; + isCounted = false; + + ammoType = AmmoTypes.powerLow; mineTier = 1; mineSpeed = 2.5f; @@ -718,8 +1157,11 @@ public class UnitTypes implements ContentList{ health = 400; buildSpeed = 0.5f; engineOffset = 6.5f; - hitsize = 8f; + hitSize = 8f; lowAltitude = true; + isCounted = false; + + ammoType = AmmoTypes.power; mineTier = 2; mineSpeed = 3.5f; @@ -727,6 +1169,7 @@ public class UnitTypes implements ContentList{ abilities.add(new HealFieldAbility(5f, 60f * 5, 50f)); weapons.add(new Weapon("heal-weapon-mount"){{ + top = false; y = -2.5f; x = 3.5f; reload = 30f; @@ -755,8 +1198,12 @@ public class UnitTypes implements ContentList{ }}; mega = new UnitType("mega"){{ + defaultController = RepairAI::new; + mineTier = 2; health = 500; + armor = 2f; + armor = 5f; speed = 1.8f; accel = 0.06f; drag = 0.017f; @@ -764,9 +1211,12 @@ public class UnitTypes implements ContentList{ flying = true; engineOffset = 10.5f; rotateShooting = false; - hitsize = 15f; + hitSize = 15f; engineSize = 3f; - payloadCapacity = 4; + payloadCapacity = (2 * 2) * tilePayload; + buildSpeed = 2.5f; + + ammoType = AmmoTypes.power; weapons.add( new Weapon("heal-weapon-mount"){{ @@ -785,18 +1235,101 @@ public class UnitTypes implements ContentList{ }}); }}; + quad = new UnitType("quad"){{ + armor = 4f; + health = 6000; + speed = 1.2f; + rotateSpeed = 2f; + accel = 0.05f; + drag = 0.017f; + lowAltitude = false; + flying = true; + engineOffset = 12f; + engineSize = 6f; + rotateShooting = false; + hitSize = 32f; + payloadCapacity = (3 * 3) * tilePayload; + buildSpeed = 2.5f; + range = 140f; + targetAir = false; + + ammoType = AmmoTypes.powerHigh; + + weapons.add( + new Weapon(){{ + x = y = 0f; + mirror = false; + reload = 60f; + minShootVelocity = 0.01f; + + bullet = new BasicBulletType(){{ + sprite = "large-bomb"; + width = height = 120/4f; + + range = 30f; + ignoreRotation = true; + + backColor = Pal.heal; + frontColor = Color.white; + mixColorTo = Color.white; + + shootCone = 180f; + ejectEffect = Fx.none; + shootSound = Sounds.none; + despawnShake = 4f; + + collidesAir = false; + + lifetime = 70f; + + despawnEffect = Fx.greenBomb; + hitEffect = Fx.massiveExplosion; + keepVelocity = false; + spin = 2f; + + shrinkX = shrinkY = 0.7f; + + speed = 0.001f; + collides = false; + + splashDamage = 240f; + splashDamageRadius = 115f; + }}; + }}); + }}; + + oct = new UnitType("oct"){{ + armor = 16f; + health = 24000; + speed = 0.6f; + rotateSpeed = 1f; + accel = 0.04f; + drag = 0.018f; + flying = true; + engineOffset = 46f; + engineSize = 7.8f; + rotateShooting = false; + hitSize = 60f; + payloadCapacity = (5.3f * 5.3f) * tilePayload; + buildSpeed = 4f; + drawShields = false; + commandLimit = 6; + + abilities.add(new ForceFieldAbility(140f, 4f, 7000f, 60f * 8), new HealFieldAbility(130f, 60f * 2, 140f)); + }}; + //endregion //region naval attack risso = new UnitType("risso"){{ speed = 1.1f; drag = 0.13f; - hitsize = 9f; + hitSize = 9f; health = 280; accel = 0.4f; rotateSpeed = 3.3f; - immunities = ObjectSet.with(StatusEffects.wet); trailLength = 20; + rotateShooting = false; armor = 2f; @@ -842,11 +1375,11 @@ public class UnitTypes implements ContentList{ health = 600; speed = 0.9f; drag = 0.15f; - hitsize = 11f; + hitSize = 11f; armor = 4f; accel = 0.3f; rotateSpeed = 2.6f; - immunities = ObjectSet.with(StatusEffects.wet); + rotateShooting = false; trailLength = 20; trailX = 5.5f; @@ -885,16 +1418,16 @@ public class UnitTypes implements ContentList{ accel = 0.2f; rotateSpeed = 1.8f; drag = 0.17f; - hitsize = 14f; - armor = 6f; - immunities = ObjectSet.with(StatusEffects.wet); + hitSize = 16f; + armor = 7f; + rotateShooting = false; trailLength = 22; trailX = 7f; trailY = -9f; trailScl = 1.5f; - abilities.add(new HealFieldAbility(22f, 60f * 4, 70f), new ShieldFieldAbility(20f, 40f, 60f * 4, 60f)); + abilities.add(new ShieldFieldAbility(20f, 40f, 60f * 4, 60f)); weapons.add(new Weapon("large-artillery"){{ reload = 65f; @@ -906,7 +1439,7 @@ public class UnitTypes implements ContentList{ shootY = 7f; shake = 5f; recoil = 4f; - occlusion = 17f; + occlusion = 12f; shots = 1; inaccuracy = 3f; @@ -972,6 +1505,140 @@ public class UnitTypes implements ContentList{ }}); }}; + sei = new UnitType("sei"){{ + health = 10000; + armor = 12f; + + speed = 0.73f; + drag = 0.17f; + hitSize = 39f; + accel = 0.2f; + rotateSpeed = 1.3f; + rotateShooting = false; + + trailLength = 50; + trailX = 18f; + trailY = -21f; + trailScl = 3f; + + weapons.add(new Weapon("sei-launcher"){{ + + x = 0f; + y = 0f; + rotate = true; + rotateSpeed = 4f; + mirror = false; + + occlusion = 20f; + + shootY = 2f; + recoil = 4f; + reload = 45f; + shots = 6; + spacing = 10f; + velocityRnd = 0.4f; + inaccuracy = 7f; + ejectEffect = Fx.none; + shake = 3f; + shootSound = Sounds.shootBig; + xRand = 8f; + shotDelay = 1f; + + bullet = new MissileBulletType(4.2f, 25){{ + homingPower = 0.12f; + width = 8f; + height = 8f; + shrinkX = shrinkY = 0f; + drag = -0.003f; + homingRange = 80f; + keepVelocity = false; + splashDamageRadius = 25f; + splashDamage = 25f; + lifetime = 56f; + trailColor = Pal.bulletYellowBack; + backColor = Pal.bulletYellowBack; + frontColor = Pal.bulletYellow; + hitEffect = Fx.blastExplosion; + despawnEffect = Fx.blastExplosion; + weaveScale = 8f; + weaveMag = 2f; + }}; + }}); + + weapons.add(new Weapon("large-bullet-mount"){{ + reload = 80f; + cooldownTime = 90f; + x = 70f/4f; + y = -66f/4f; + rotateSpeed = 4f; + rotate = true; + shootY = 7f; + shake = 2f; + recoil = 3f; + occlusion = 12f; + ejectEffect = Fx.shellEjectBig; + + shots = 3; + shotDelay = 4f; + inaccuracy = 1f; + bullet = new BasicBulletType(7f, 50){{ + width = 13f; + height = 19f; + shootEffect = Fx.shootBig; + lifetime = 30f; + }}; + }}); + }}; + + omura = new UnitType("omura"){{ + health = 22000; + speed = 0.62f; + drag = 0.18f; + hitSize = 50f; + armor = 16f; + accel = 0.19f; + rotateSpeed = 0.9f; + rotateShooting = false; + + float spawnTime = 60f * 15f; + + abilities.add(new UnitSpawnAbility(flare, spawnTime, 19.25f, -31.75f), new UnitSpawnAbility(flare, spawnTime, -19.25f, -31.75f)); + + trailLength = 70; + trailX = 23f; + trailY = -32f; + trailScl = 3.5f; + + weapons.add(new Weapon("omura-cannon"){{ + reload = 110f; + cooldownTime = 90f; + mirror = false; + x = 0f; + y = -3.5f; + rotateSpeed = 1.4f; + rotate = true; + shootY = 23f; + shake = 6f; + recoil = 10.5f; + occlusion = 50f; + + shots = 1; + ejectEffect = Fx.none; + + bullet = new RailBulletType(){{ + shootEffect = Fx.railShoot; + speed = 67f; + lifetime = 8f; + pierceEffect = Fx.railHit; + updateEffect = Fx.railTrail; + hitEffect = Fx.massiveExplosion; + smokeEffect = Fx.shootBig2; + damage = 1250; + pierceDamageFactor = 0.5f; + }}; + }}); + }}; + //endregion //region core @@ -984,18 +1651,19 @@ public class UnitTypes implements ContentList{ mineTier = 1; buildSpeed = 0.5f; drag = 0.05f; - speed = 2.6f; + speed = 2.8f; rotateSpeed = 15f; accel = 0.1f; itemCapacity = 30; health = 120f; engineOffset = 6f; - hitsize = 8f; + hitSize = 8f; weapons.add(new Weapon("small-basic-weapon"){{ reload = 17f; x = 2.75f; y = 1f; + top = false; bullet = new BasicBulletType(2.5f, 9){{ width = 7f; @@ -1017,17 +1685,18 @@ public class UnitTypes implements ContentList{ mineTier = 1; buildSpeed = 0.75f; drag = 0.05f; - speed = 2.9f; + speed = 3f; rotateSpeed = 17f; accel = 0.1f; itemCapacity = 50; health = 150f; engineOffset = 6f; - hitsize = 9f; + hitSize = 9f; rotateShooting = false; lowAltitude = true; weapons.add(new Weapon("small-mount-weapon"){{ + top = false; reload = 20f; x = 3f; y = 0.5f; @@ -1056,15 +1725,16 @@ public class UnitTypes implements ContentList{ mineTier = 2; buildSpeed = 1f; drag = 0.05f; - speed = 3.4f; + speed = 3.5f; rotateSpeed = 19f; accel = 0.11f; itemCapacity = 70; health = 190f; engineOffset = 6f; - hitsize = 10f; + hitSize = 10f; weapons.add(new Weapon("small-mount-weapon"){{ + top = false; reload = 15f; x = 1f; y = 2f; @@ -1091,7 +1761,7 @@ public class UnitTypes implements ContentList{ block = new UnitType("block"){ { speed = 0f; - hitsize = 0f; + hitSize = 0f; health = 1; rotateSpeed = 360f; itemCapacity = 0; diff --git a/core/src/mindustry/content/Weathers.java b/core/src/mindustry/content/Weathers.java index 56f39995a8..a2ffbb098f 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,13 +169,14 @@ public class Weathers implements ContentList{ sandstorm = new Weather("sandstorm"){ TextureRegion region; - float yspeed = 0.3f, xspeed = 6f, size = 140f, padding = size, invDensity = 1500f; - Vec2 force = new Vec2(0.45f, 0.01f); + float size = 140f, padding = size, invDensity = 1500f, baseSpeed = 6.1f; + float force = 0.4f * 0; Color color = Color.valueOf("f7cba4"); Texture noise; { attrs.set(Attribute.light, -0.1f); + opacityMultiplier = 0.8f; } @Override @@ -194,22 +194,26 @@ public class Weathers implements ContentList{ @Override public void update(WeatherState state){ + float speed = force * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; for(Unit unit : Groups.unit){ - unit.impulse(force.x * state.intensity(), force.y * state.intensity()); + unit.impulse(windx, windy); } } @Override public void drawOver(WeatherState state){ Draw.tint(color); + float speed = baseSpeed * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; float scale = 1f / 2000f; float scroll = Time.time() * scale; - Tmp.tr1.setTexture(noise); + Tmp.tr1.texture = noise; Core.camera.bounds(Tmp.r1); Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); - Tmp.tr1.scroll(-xspeed * scroll, -yspeed * scroll); + Tmp.tr1.scroll(-windx * scroll, windy * scroll); Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); rand.setSeed(0); @@ -224,8 +228,8 @@ public class Weathers implements ContentList{ float scl = rand.random(0.5f, 1f); float scl2 = rand.random(0.5f, 1f); float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); + float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); + float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); float alpha = rand.random(0.2f); x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); @@ -247,16 +251,16 @@ public class Weathers implements ContentList{ sporestorm = new Weather("sporestorm"){ TextureRegion region; - float yspeed = 1f, xspeed = 4f, size = 5f, padding = size, invDensity = 2000f; + float size = 5f, padding = size, invDensity = 2000f, baseSpeed = 4.3f, force = 0.28f * 0; Color color = Color.valueOf("7457ce"); - Vec2 force = new Vec2(0.25f, 0.01f); Texture noise; { - attrs.set(Attribute.spores, 0.5f); - attrs.set(Attribute.light, -0.1f); + attrs.set(Attribute.spores, 1f); + attrs.set(Attribute.light, -0.15f); status = StatusEffects.sporeSlowed; statusGround = false; + opacityMultiplier = 0.85f; } @Override @@ -269,9 +273,11 @@ public class Weathers implements ContentList{ @Override public void update(WeatherState state){ + float speed = force * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; for(Unit unit : Groups.unit){ - unit.impulse(force.x * state.intensity(), force.y * state.intensity()); + unit.impulse(windx, windy); } } @@ -285,12 +291,15 @@ public class Weathers implements ContentList{ Draw.alpha(state.opacity * 0.8f); Draw.tint(color); + float speed = baseSpeed * state.intensity; + float windx = state.windVector.x * speed, windy = state.windVector.y * speed; + float scale = 1f / 2000f; float scroll = Time.time() * scale; - Tmp.tr1.setTexture(noise); + Tmp.tr1.texture = noise; Core.camera.bounds(Tmp.r1); Tmp.tr1.set(Tmp.r1.x*scale, Tmp.r1.y*scale, (Tmp.r1.x + Tmp.r1.width)*scale, (Tmp.r1.y + Tmp.r1.height)*scale); - Tmp.tr1.scroll(-xspeed * scroll, -yspeed * scroll); + Tmp.tr1.scroll(-windx * scroll, windy * scroll); Draw.rect(Tmp.tr1, Core.camera.position.x, Core.camera.position.y, Core.camera.width, -Core.camera.height); rand.setSeed(0); @@ -306,8 +315,8 @@ public class Weathers implements ContentList{ float scl = rand.random(0.5f, 1f); float scl2 = rand.random(0.5f, 1f); float sscl = rand.random(0.5f, 1f); - float x = (rand.random(0f, world.unitWidth()) + Time.time() * xspeed * scl2); - float y = (rand.random(0f, world.unitHeight()) - Time.time() * yspeed * scl); + float x = (rand.random(0f, world.unitWidth()) + Time.time() * windx * scl2); + float y = (rand.random(0f, world.unitHeight()) + Time.time() * windy * scl); float alpha = rand.random(0.1f, 0.8f); x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); diff --git a/core/src/mindustry/core/ContentLoader.java b/core/src/mindustry/core/ContentLoader.java index aa5fe5ba44..56e46d8be2 100644 --- a/core/src/mindustry/core/ContentLoader.java +++ b/core/src/mindustry/core/ContentLoader.java @@ -33,6 +33,7 @@ public class ContentLoader{ new StatusEffects(), new Liquids(), new Bullets(), + new AmmoTypes(), new UnitTypes(), new Blocks(), new Loadouts(), @@ -167,10 +168,6 @@ public class ContentLoader{ } public void handleContent(Content content){ - if(content instanceof Item && content.id > 255){ - throw new IllegalArgumentException("You may not have more than 255 different items total. Remove some mods."); - } - this.lastAdded = content; contentMap[content.getContentType().ordinal()].add(content); } diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index 46e79e64cd..4bb22b7839 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); @@ -191,9 +191,13 @@ public class Control implements ApplicationListener, Loadable{ } + void resetCamera(){ + + } + @Override public void loadAsync(){ - Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth(); + Draw.scl = 1f / Core.atlas.find("scale_marker").width; Core.input.setCatch(KeyCode.back, true); @@ -280,6 +284,7 @@ public class Control implements ApplicationListener, Loadable{ try{ net.reset(); slot.load(); + slot.setAutosave(true); state.rules.sector = sector; //if there is no base, simulate a new game and place the right loadout at the spawn position @@ -321,6 +326,7 @@ public class Control implements ApplicationListener, Loadable{ state.rules.sector = sector; //assign origin when launching state.secinfo.origin = origin; + state.secinfo.destination = origin; logic.play(); control.saves.saveSector(sector); Events.fire(Trigger.newGame); @@ -329,6 +335,7 @@ public class Control implements ApplicationListener, Loadable{ } public void playTutorial(){ + ui.showInfo("@indev.notready"); //TODO implement //ui.showInfo("death"); /* @@ -428,19 +435,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("@indev.popup"); })); } - //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/GameState.java b/core/src/mindustry/core/GameState.java index b3f5e49213..84b408b135 100644 --- a/core/src/mindustry/core/GameState.java +++ b/core/src/mindustry/core/GameState.java @@ -17,7 +17,7 @@ public class GameState{ /** Wave countdown in ticks. */ public float wavetime; /** Whether the game is in game over state. */ - public boolean gameOver = false, launched = false, serverPaused = false; + public boolean gameOver = false, serverPaused = false, wasTimeout; /** Map that is currently being played on. */ public @NonNull Map map = emptyMap; /** The current game rules. */ @@ -52,7 +52,7 @@ public class GameState{ /** @return whether the player is in a campaign and they are out of sector time */ public boolean isOutOfTime(){ - return isCampaign() && isGame() && getSector().getTimeSpent() >= turnDuration; + return isCampaign() && isGame() && getSector().getTimeSpent() >= turnDuration && !net.active(); } public boolean hasSector(){ diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 125e3c3ee9..2d9bf18c49 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -4,7 +4,6 @@ import arc.*; import arc.math.*; import arc.util.*; import mindustry.annotations.Annotations.*; -import mindustry.content.*; import mindustry.core.GameState.*; import mindustry.game.EventType.*; import mindustry.game.*; @@ -15,7 +14,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 +40,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()){ @@ -178,7 +177,7 @@ public class Logic implements ApplicationListener{ public void runWave(){ spawner.spawnEnemies(); state.wave++; - state.wavetime = state.hasSector() && state.getSector().isLaunchWave(state.wave) ? state.rules.waveSpacing * state.rules.launchWaveMultiplier : state.rules.waveSpacing; + state.wavetime = state.rules.waveSpacing; Events.fire(new WaveEvent()); } @@ -187,7 +186,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,63 +244,12 @@ public class Logic implements ApplicationListener{ if(entry.cooldown < 0 && !entry.weather.isActive()){ float duration = Mathf.random(entry.minDuration, entry.maxDuration); entry.cooldown = duration + Mathf.random(entry.minFrequency, entry.maxFrequency); - Call.createWeather(entry.weather, entry.intensity, duration); + Tmp.v1.setToRandomDirection(); + Call.createWeather(entry.weather, entry.intensity, duration, Tmp.v1.x, Tmp.v1.y); } } } - @Remote(called = Loc.both) - public static void launchZone(){ - if(!state.isCampaign()) return; - - if(!headless){ - ui.hudfrag.showLaunch(); - } - - //TODO better core launch effect - for(Building tile : state.teams.playerCores()){ - Fx.launch.at(tile); - } - - Sector sector = state.rules.sector; - - //TODO containers must be launched too - Time.runTask(30f, () -> { - Sector origin = sector.save.meta.secinfo.origin; - if(origin != null){ - ItemSeq stacks = origin.getExtraItems(); - - //add up all items into list - for(Building entity : state.teams.playerCores()){ - entity.items.each(stacks::add); - } - - //save received items - origin.setExtraItems(stacks); - } - - //remove all the cores - state.teams.playerCores().each(b -> b.tile.remove()); - - state.launched = true; - state.gameOver = true; - - //save over the data w/o the cores - sector.save.save(); - - //run a turn, since launching takes up a turn - universe.runTurn(); - - //TODO apply extra damage to sector - //sector.setTurnsPassed(sector.getTurnsPassed() + 3); - - //TODO load the sector that was launched from - Events.fire(new LaunchEvent()); - //manually fire game over event now - Events.fire(new GameOverEvent(state.rules.defaultTeam)); - }); - } - @Remote(called = Loc.both) public static void updateGameOver(Team winner){ state.gameOver = true; @@ -325,6 +273,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); @@ -332,7 +284,14 @@ public class Logic implements ApplicationListener{ //force pausing when the player is out of sector time if(state.isOutOfTime()){ - state.set(State.paused); + if(!state.wasTimeout){ + universe.displayTimeEnd(); + state.wasTimeout = true; + } + //if no turn was run. + if(state.isOutOfTime()){ + state.set(State.paused); + } } if(!state.isPaused()){ diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index cdb42c9864..c4e519a4a5 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -366,6 +366,9 @@ public class NetClient implements ApplicationListener{ @Remote public static void playerDisconnect(int playerid){ + if(netClient != null){ + netClient.addRemovedEntity(playerid); + } Groups.player.removeByID(playerid); } @@ -437,7 +440,7 @@ public class NetClient implements ApplicationListener{ } @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) - public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, boolean gameOver, short coreDataLen, byte[] coreData){ + public static void stateSnapshot(float waveTime, int wave, int enemies, boolean paused, boolean gameOver, int timeData, short coreDataLen, byte[] coreData){ try{ if(wave > state.wave){ state.wave = wave; @@ -450,6 +453,8 @@ public class NetClient implements ApplicationListener{ state.enemies = enemies; state.serverPaused = paused; + universe.updateNetSeconds(timeData); + netClient.byteStream.setBytes(net.decompressSnapshot(coreData, coreDataLen)); DataInputStream input = netClient.dataStream; @@ -544,6 +549,10 @@ public class NetClient implements ApplicationListener{ quiet = true; } + public void clearRemovedEntity(int id){ + removed.remove(id); + } + public void addRemovedEntity(int id){ removed.add(id); } @@ -582,8 +591,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(), @@ -594,7 +606,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 9e83f8dc03..9b298f9924 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -131,7 +131,7 @@ public class NetServer implements ApplicationListener{ return; } - if(Time.millis() < info.lastKicked){ + if(Time.millis() < admins.getKickTime(uuid, con.address)){ con.kick(KickReason.recentKick); return; } @@ -174,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()))){ @@ -371,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"); @@ -385,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){ @@ -482,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){ @@ -527,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, @@ -545,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; @@ -563,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; @@ -576,38 +593,38 @@ public class NetServer implements ApplicationListener{ if(player.isBuilder()){ player.builder().clearBuilding(); player.builder().updateBuilding(building); + + if(requests != null){ + for(BuildPlan req : requests){ + if(req == null) continue; + Tile tile = world.tile(req.x, req.y); + if(tile == null || (!req.breaking && req.block == null)) continue; + //auto-skip done requests + if(req.breaking && tile.block() == Blocks.air){ + continue; + }else if(!req.breaking && tile.block() == req.block && (!req.block.rotate || (tile.build != null && tile.build.rotation == req.rotation))){ + continue; + }else if(con.rejectedRequests.contains(r -> r.breaking == req.breaking && r.x == req.x && r.y == req.y)){ //check if request was recently rejected, and skip it if so + continue; + }else if(!netServer.admins.allowAction(player, req.breaking ? ActionType.breakBlock : ActionType.placeBlock, tile, action -> { //make sure request is allowed by the server + action.block = req.block; + action.rotation = req.rotation; + action.config = req.config; + })){ + //force the player to remove this request if that's not the case + Call.removeQueueBlock(player.con, req.x, req.y, req.breaking); + con.rejectedRequests.add(req); + continue; + } + player.builder().plans().addLast(req); + } + } } if(player.isMiner()){ player.miner().mineTile(mining); } - if(requests != null){ - for(BuildPlan req : requests){ - if(req == null) continue; - Tile tile = world.tile(req.x, req.y); - if(tile == null || (!req.breaking && req.block == null)) continue; - //auto-skip done requests - if(req.breaking && tile.block() == Blocks.air){ - continue; - }else if(!req.breaking && tile.block() == req.block && (!req.block.rotate || (tile.build != null && tile.build.rotation == req.rotation))){ - continue; - }else if(con.rejectedRequests.contains(r -> r.breaking == req.breaking && r.x == req.x && r.y == req.y)){ //check if request was recently rejected, and skip it if so - continue; - }else if(!netServer.admins.allowAction(player, req.breaking ? ActionType.breakBlock : ActionType.placeBlock, tile, action -> { //make sure request is allowed by the server - action.block = req.block; - action.rotation = req.rotation; - action.config = req.config; - })){ - //force the player to remove this request if that's not the case - Call.removeQueueBlock(player.con, req.x, req.y, req.breaking); - con.rejectedRequests.add(req); - continue; - } - player.builder().plans().addLast(req); - } - } - con.rejectedRequests.clear(); if(!player.dead()){ @@ -618,41 +635,37 @@ public class NetServer implements ApplicationListener{ 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 @@ -682,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; } @@ -762,6 +775,10 @@ public class NetServer implements ApplicationListener{ } if(state.isGame() && net.server()){ + if(state.rules.pvp){ + state.serverPaused = isWaitingForPlayers(); + } + sync(); } } @@ -792,7 +809,7 @@ public class NetServer implements ApplicationListener{ short sent = 0; for(Building entity : Groups.build){ - if(!entity.block().sync) continue; + if(!entity.block.sync) continue; sent ++; dataStream.writeInt(entity.pos()); @@ -821,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)); } @@ -829,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, state.gameOver, (short)stateBytes.length, net.compressSnapshot(stateBytes)); + Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, state.gameOver, universe.seconds(), (short)stateBytes.length, net.compressSnapshot(stateBytes)); viewport.setSize(player.con.viewWidth, player.con.viewHeight).setCenter(player.con.viewX, player.con.viewY); diff --git a/core/src/mindustry/core/Platform.java b/core/src/mindustry/core/Platform.java index ff7d44ec88..7eae8136c0 100644 --- a/core/src/mindustry/core/Platform.java +++ b/core/src/mindustry/core/Platform.java @@ -14,10 +14,18 @@ import mindustry.type.*; import mindustry.ui.dialogs.*; import rhino.*; +import java.net.*; + import static mindustry.Vars.*; public interface Platform{ + /** Dynamically loads a jar file. */ + default Class loadJar(Fi jar, String mainClass) throws Exception{ + URLClassLoader classLoader = new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); + return classLoader.loadClass(mainClass); + } + /** Steam: Update lobby visibility.*/ default void updateLobby(){} @@ -121,7 +129,7 @@ public interface Platform{ } /** - * Show a file chooser for multiple file types. Only supported on desktop. + * Show a file chooser for multiple file types. * @param cons Selection listener * @param extensions File extensions to filter */ diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index e04aef622d..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; @@ -271,9 +275,9 @@ public class Renderer implements ApplicationListener{ float fract = landTime / Fx.coreLand.lifetime; Building entity = player.closestCore(); - TextureRegion reg = entity.block().icon(Cicon.full); + TextureRegion reg = entity.block.icon(Cicon.full); float scl = Scl.scl(4f) / camerascale; - float s = reg.getWidth() * Draw.scl * scl * 4f * fract; + float s = reg.width * Draw.scl * scl * 4f * fract; Draw.color(Pal.lightTrail); Draw.rect("circle-shadow", entity.getX(), entity.getY(), s, s); @@ -285,7 +289,7 @@ public class Renderer implements ApplicationListener{ Draw.color(); Draw.mixcol(Color.white, fract); - Draw.rect(reg, entity.getX(), entity.getY(), reg.getWidth() * Draw.scl * scl, reg.getHeight() * Draw.scl * scl, fract * 135f); + Draw.rect(reg, entity.getX(), entity.getY(), reg.width * Draw.scl * scl, reg.height * Draw.scl * scl, fract * 135f); Draw.reset(); } diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index 783cb89cf8..536e89a9b2 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -491,7 +491,7 @@ public class UI implements ApplicationListener, Loadable{ Table t = new Table(); t.touchable = Touchable.disabled; t.background(Styles.black3).margin(8f) - .add(text).style(Styles.outlineLabel); + .add(text).style(Styles.outlineLabel).labelAlign(Align.center); t.update(() -> t.setPosition(Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f, Align.center)); t.actions(Actions.fadeOut(3, Interp.pow4In), Actions.remove()); Core.scene.add(t); diff --git a/core/src/mindustry/core/Version.java b/core/src/mindustry/core/Version.java index 08a105d8fb..bef40c5e87 100644 --- a/core/src/mindustry/core/Version.java +++ b/core/src/mindustry/core/Version.java @@ -45,4 +45,12 @@ public class Version{ build = Strings.canParseInt(map.get("build")) ? Integer.parseInt(map.get("build")) : -1; } } + + /** get menu version without colors */ + public static String combined(){ + if(build == -1){ + return "custom build"; + } + return (type.equals("official") ? modifier : type) + " build " + build + (revision == 0 ? "" : "." + revision); + } } diff --git a/core/src/mindustry/core/World.java b/core/src/mindustry/core/World.java index 9dea5f0e35..867ba38f1a 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -5,11 +5,13 @@ import arc.func.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; +import arc.struct.ObjectIntMap.*; import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.noise.*; import mindustry.content.*; import mindustry.core.GameState.*; +import mindustry.ctype.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.game.Teams.*; @@ -19,7 +21,6 @@ import mindustry.maps.*; import mindustry.maps.filters.*; import mindustry.maps.filters.GenerateFilter.*; import mindustry.type.*; -import mindustry.type.Sector.*; import mindustry.type.Weather.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; @@ -33,11 +34,17 @@ public class World{ public @NonNull Tiles tiles = new Tiles(0, 0); private boolean generating, invalidMap; + private ObjectMap customMapLoaders = new ObjectMap<>(); public World(){ } + /** Adds a custom handler function for loading a custom map - usually a generated one. */ + public void addMapLoader(Map map, Runnable loader){ + customMapLoaders.put(map, loader); + } + public boolean isInvalidMap(){ return invalidMap; } @@ -105,7 +112,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 +194,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); @@ -257,9 +262,71 @@ public class World{ state.rules.weather.clear(); - if(sector.is(SectorAttribute.rainy)) state.rules.weather.add(new WeatherEntry(Weathers.rain)); - if(sector.is(SectorAttribute.snowy)) state.rules.weather.add(new WeatherEntry(Weathers.snow)); - if(sector.is(SectorAttribute.desert)) state.rules.weather.add(new WeatherEntry(Weathers.sandstorm)); + //apply weather based on terrain + ObjectIntMap floorc = new ObjectIntMap<>(); + ObjectSet content = new ObjectSet<>(); + + float waterFloors = 0, totalFloors = 0; + + for(Tile tile : world.tiles){ + if(world.getDarkness(tile.x, tile.y) >= 3){ + continue; + } + + Liquid liquid = tile.floor().liquidDrop; + if(tile.floor().itemDrop != null) content.add(tile.floor().itemDrop); + if(tile.overlay().itemDrop != null) content.add(tile.overlay().itemDrop); + if(liquid != null) content.add(liquid); + + if(!tile.block().isStatic()){ + totalFloors ++; + if(liquid == Liquids.water){ + waterFloors += tile.floor().isDeep() ? 1f : 0.7f; + } + floorc.increment(tile.floor()); + if(tile.overlay() != Blocks.air){ + floorc.increment(tile.overlay()); + } + } + } + + //sort counts in descending order + Seq> entries = floorc.entries().toArray(); + entries.sort(e -> -e.value); + //remove all blocks occuring < 30 times - unimportant + entries.removeAll(e -> e.value < 30); + + Block[] floors = new Block[entries.size]; + int[] floorCounts = new int[entries.size]; + for(int i = 0; i < entries.size; i++){ + floorCounts[i] = entries.get(i).value; + floors[i] = entries.get(i).key; + } + + //TODO bad code + boolean hasSnow = floors[0].name.contains("ice") || floors[0].name.contains("snow"); + boolean hasRain = !hasSnow && floors[0].name.contains("water"); + boolean hasDesert = !hasSnow && !hasRain && floors[0].name.contains("sand"); + boolean hasSpores = floors[0].name.contains("spore") || floors[0].name.contains("moss") || floors[0].name.contains("tainted"); + + if(hasSnow){ + state.rules.weather.add(new WeatherEntry(Weathers.snow)); + } + + if(hasRain){ + state.rules.weather.add(new WeatherEntry(Weathers.rain)); + } + + if(hasDesert){ + state.rules.weather.add(new WeatherEntry(Weathers.sandstorm)); + } + + if(hasSpores){ + state.rules.weather.add(new WeatherEntry(Weathers.sporestorm)); + } + + state.secinfo.resources = content.asArray(); + state.secinfo.resources.sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id))); } @@ -272,6 +339,12 @@ public class World{ } public void loadMap(Map map, Rules checkRules){ + //load using custom loader if possible + if(customMapLoaders.containsKey(map)){ + customMapLoaders.get(map).run(); + return; + } + try{ SaveIO.load(map.file, new FilterContext(map)); }catch(Throwable e){ @@ -317,7 +390,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))); } } @@ -446,7 +519,7 @@ public class World{ dark = Math.max((edgeBlend - edgeDst) * (4f / edgeBlend), dark); } - if(state.hasSector()){ + if(state.hasSector() && state.getSector().preset == null){ int circleBlend = 14; //quantized angle float offset = state.getSector().rect.rotation + 90; diff --git a/core/src/mindustry/ctype/ContentType.java b/core/src/mindustry/ctype/ContentType.java index bc147d8c81..e62377628c 100644 --- a/core/src/mindustry/ctype/ContentType.java +++ b/core/src/mindustry/ctype/ContentType.java @@ -15,7 +15,8 @@ public enum ContentType{ loadout_UNUSED, typeid_UNUSED, error, - planet; + planet, + ammo; public static final ContentType[] all = values(); } diff --git a/core/src/mindustry/ctype/UnlockableContent.java b/core/src/mindustry/ctype/UnlockableContent.java index 65e168c54a..9c4b147214 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -8,6 +8,7 @@ import arc.util.ArcAnnotate.*; import mindustry.annotations.Annotations.*; import mindustry.game.EventType.*; import mindustry.graphics.*; +import mindustry.type.*; import mindustry.ui.*; import static mindustry.Vars.*; @@ -30,7 +31,7 @@ public abstract class UnlockableContent extends MappableContent{ this.localizedName = Core.bundle.get(getContentType() + "." + this.name + ".name", this.name); this.description = Core.bundle.getOrNull(getContentType() + "." + this.name + ".description"); - this.unlocked = Core.settings != null && Core.settings.getBool(name + "-unlocked", false); + this.unlocked = Core.settings != null && Core.settings.getBool(this.name + "-unlocked", false); } public String displayDescription(){ @@ -43,6 +44,11 @@ public abstract class UnlockableContent extends MappableContent{ } + /** @return items needed to research this content */ + public ItemStack[] researchRequirements(){ + return ItemStack.empty; + } + public String emoji(){ return Fonts.getUnicodeStr(name); } diff --git a/core/src/mindustry/editor/DrawOperation.java b/core/src/mindustry/editor/DrawOperation.java index 77162fe2a5..e63c2f3a6b 100755 --- a/core/src/mindustry/editor/DrawOperation.java +++ b/core/src/mindustry/editor/DrawOperation.java @@ -64,8 +64,12 @@ public class DrawOperation{ if(type == OpType.floor.ordinal()){ tile.setFloor((Floor)content.block(to)); }else if(type == OpType.block.ordinal()){ + tile.getLinkedTiles(t -> editor.renderer.updatePoint(t.x, t.y)); + Block block = content.block(to); tile.setBlock(block, tile.team(), tile.build == null ? 0 : tile.build.rotation); + + tile.getLinkedTiles(t -> editor.renderer.updatePoint(t.x, t.y)); }else if(type == OpType.rotation.ordinal()){ if(tile.build != null) tile.build.rotation = to; }else if(type == OpType.team.ordinal()){ @@ -74,7 +78,7 @@ public class DrawOperation{ tile.setOverlayID(to); } }); - editor.renderer().updatePoint(tile.x, tile.y); + editor.renderer.updatePoint(tile.x, tile.y); } @Struct diff --git a/core/src/mindustry/editor/EditorTile.java b/core/src/mindustry/editor/EditorTile.java index 3ad8cf49d8..9b0b199e76 100644 --- a/core/src/mindustry/editor/EditorTile.java +++ b/core/src/mindustry/editor/EditorTile.java @@ -20,7 +20,7 @@ public class EditorTile extends Tile{ @Override public void setFloor(@NonNull Floor type){ - if(state.isGame()){ + if(skip()){ super.setFloor(type); return; } @@ -39,29 +39,27 @@ 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()){ + if(skip()){ super.setBlock(type, team, rotation); return; } + if(this.block == type && (build == null || build.rotation == rotation)){ + update(); + return; + } + op(OpType.block, block.id); if(rotation != 0) op(OpType.rotation, (byte)rotation); - if(team() != Team.derelict) op(OpType.team, (byte)team().id); + if(team != Team.derelict) op(OpType.team, (byte)team.id); super.setBlock(type, team, rotation); } @Override public void setTeam(Team team){ - if(state.isGame()){ + if(skip()){ super.setTeam(team); return; } @@ -73,7 +71,7 @@ public class EditorTile extends Tile{ @Override public void setOverlay(Block overlay){ - if(state.isGame()){ + if(skip()){ super.setOverlay(overlay); return; } @@ -85,20 +83,24 @@ public class EditorTile extends Tile{ } @Override - protected void preChanged(){ - super.preChanged(); + protected void fireChanged(){ + if(skip()){ + super.fireChanged(); + }else{ + update(); + } } @Override public void recache(){ - if(state.isGame()){ + if(skip()){ super.recache(); } } @Override protected void changeEntity(Team team, Prov entityprov, int rotation){ - if(state.isGame()){ + if(skip()){ super.changeEntity(team, entityprov, rotation); return; } @@ -110,15 +112,23 @@ public class EditorTile extends Tile{ Block block = block(); - if(block.hasEntity()){ + if(block.hasBuilding()){ build = entityprov.get().init(this, team, false, rotation); - build.cons(new ConsumeModule(build)); + build.cons = new ConsumeModule(build); if(block.hasItems) build.items = new ItemModule(); if(block.hasLiquids) build.liquids(new LiquidModule()); if(block.hasPower) build.power(new PowerModule()); } } + private void update(){ + ui.editor.editor.renderer.updatePoint(x, y); + } + + private boolean skip(){ + return state.isGame() || ui.editor.editor.isLoading(); + } + private void op(OpType type, short value){ ui.editor.editor.addTileOp(TileOp.get(x, y, (byte)type.ordinal(), value)); } diff --git a/core/src/mindustry/editor/EditorTool.java b/core/src/mindustry/editor/EditorTool.java index 47053049e2..2dff5e9f46 100644 --- a/core/src/mindustry/editor/EditorTool.java +++ b/core/src/mindustry/editor/EditorTool.java @@ -1,6 +1,7 @@ package mindustry.editor; import arc.func.*; +import arc.input.*; import arc.math.*; import arc.math.geom.*; import arc.struct.*; @@ -10,16 +11,16 @@ import mindustry.game.*; import mindustry.world.*; public enum EditorTool{ - zoom, - pick{ + zoom(KeyCode.v), + pick(KeyCode.i){ public void touched(MapEditor editor, int x, int y){ if(!Structs.inBounds(x, y, editor.width(), editor.height())) return; Tile tile = editor.tile(x, y); - editor.drawBlock = tile.block() == Blocks.air ? tile.overlay() == Blocks.air ? tile.floor() : tile.overlay() : tile.block(); + editor.drawBlock = tile.block() == Blocks.air || !tile.block().inEditor ? tile.overlay() == Blocks.air ? tile.floor() : tile.overlay() : tile.block(); } }, - line("replace", "orthogonal"){ + line(KeyCode.l, "replace", "orthogonal"){ @Override public void touchedLine(MapEditor editor, int x1, int y1, int x2, int y2){ @@ -43,7 +44,7 @@ public enum EditorTool{ }); } }, - pencil("replace", "square", "drawteams"){ + pencil(KeyCode.b, "replace", "square", "drawteams"){ { edit = true; draggable = true; @@ -67,7 +68,7 @@ public enum EditorTool{ } }, - eraser("eraseores"){ + eraser(KeyCode.e, "eraseores"){ { edit = true; draggable = true; @@ -86,7 +87,7 @@ public enum EditorTool{ }); } }, - fill("replaceall", "fillteams"){ + fill(KeyCode.g, "replaceall", "fillteams"){ { edit = true; } @@ -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..49d174779b 100644 --- a/core/src/mindustry/editor/MapEditor.java +++ b/core/src/mindustry/editor/MapEditor.java @@ -18,10 +18,10 @@ import static mindustry.Vars.*; public class MapEditor{ public static final int[] brushSizes = {1, 2, 3, 4, 5, 9, 15, 20}; - private final Context context = new Context(); - private StringMap tags = new StringMap(); - private MapRenderer renderer = new MapRenderer(this); + public StringMap tags = new StringMap(); + public MapRenderer renderer = new MapRenderer(this); + private final Context context = new Context(); private OperationStack stack = new OperationStack(); private DrawOperation currentOp; private boolean loading; @@ -31,8 +31,8 @@ public class MapEditor{ public Block drawBlock = Blocks.stone; public Team drawTeam = Team.sharded; - public StringMap getTags(){ - return tags; + public boolean isLoading(){ + return loading; } public void beginEdit(int width, int height){ @@ -52,7 +52,7 @@ public class MapEditor{ if(map.file.parent().parent().name().equals("1127400") && steam){ tags.put("steamid", map.file.parent().name()); } - MapIO.loadMap(map, context); + load(() -> MapIO.loadMap(map, context)); renderer.resize(width(), height()); loading = false; } @@ -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; @@ -210,10 +210,6 @@ public class MapEditor{ } } - public MapRenderer renderer(){ - return renderer; - } - public void resize(int width, int height){ clearOp(); @@ -227,8 +223,14 @@ public class MapEditor{ int px = offsetX + x, py = offsetY + y; if(previous.in(px, py)){ tiles.set(x, y, previous.getn(px, py)); - tiles.getn(x, y).x = (short)x; - tiles.getn(x, y).y = (short)y; + Tile tile = tiles.getn(x, y); + tile.x = (short)x; + tile.y = (short)y; + + if(tile.build != null && tile.isCenter()){ + tile.build.x = x * tilesize + tile.block().offset; + tile.build.y = y * tilesize + tile.block().offset; + } }else{ tiles.set(x, y, new EditorTile(x, y, Blocks.stone.id, (short)0, (short)0)); } diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 1805df28d0..25733da92e 100644 --- a/core/src/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -116,9 +116,9 @@ public class MapEditorDialog extends Dialog implements Disposable{ t.button("@editor.export", Icon.upload, () -> createDialog("@editor.export", "@editor.exportfile", "@editor.exportfile.description", Icon.file, - (Runnable)() -> platform.export(editor.getTags().get("name", "unknown"), mapExtension, file -> MapIO.writeMap(file, editor.createMap(file))), + (Runnable)() -> platform.export(editor.tags.get("name", "unknown"), mapExtension, file -> MapIO.writeMap(file, editor.createMap(file))), "@editor.exportimage", "@editor.exportimage.description", Icon.fileImage, - (Runnable)() -> platform.export(editor.getTags().get("name", "unknown"), "png", file -> { + (Runnable)() -> platform.export(editor.tags.get("name", "unknown"), "png", file -> { Pixmap out = MapIO.writeImage(editor.tiles()); file.writePNG(out); out.dispose(); @@ -129,16 +129,16 @@ public class MapEditorDialog extends Dialog implements Disposable{ if(steam){ menu.cont.button("@editor.publish.workshop", Icon.link, () -> { - Map builtin = maps.all().find(m -> m.name().equals(editor.getTags().get("name", "").trim())); + Map builtin = maps.all().find(m -> m.name().equals(editor.tags.get("name", "").trim())); - if(editor.getTags().containsKey("steamid") && builtin != null && !builtin.custom){ - platform.viewListingID(editor.getTags().get("steamid")); + if(editor.tags.containsKey("steamid") && builtin != null && !builtin.custom){ + platform.viewListingID(editor.tags.get("steamid")); return; } Map map = save(); - if(editor.getTags().containsKey("steamid") && map != null){ + if(editor.tags.containsKey("steamid") && map != null){ platform.viewListing(map); return; } @@ -156,7 +156,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ } platform.publish(map); - }).padTop(-3).size(swidth * 2f + 10, 60f).update(b -> b.setText(editor.getTags().containsKey("steamid") ? editor.getTags().get("author").equals(player.name) ? "@workshop.listing" : "@view.workshop" : "@editor.publish.workshop")); + }).padTop(-3).size(swidth * 2f + 10, 60f).update(b -> b.setText(editor.tags.containsKey("steamid") ? editor.tags.get("author").equals(player.name) ? "@workshop.listing" : "@view.workshop" : "@editor.publish.workshop")); menu.cont.row(); } @@ -235,7 +235,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ state.rules = (lastSavedRules == null ? new Rules() : lastSavedRules); lastSavedRules = null; saved = false; - editor.renderer().updateAll(); + editor.renderer.updateAll(); } private void playtest(){ @@ -254,14 +254,10 @@ public class MapEditorDialog extends Dialog implements Disposable{ "height", editor.height() )); world.endMapLoad(); - //add entities so they update. is this really needed? - for(Tile tile : world.tiles){ - if(tile.build != null){ - tile.build.add(); - } - } player.set(world.width() * tilesize/2f, world.height() * tilesize/2f); player.clearUnit(); + Groups.unit.clear(); + Groups.build.clear(); logic.play(); }); } @@ -269,10 +265,10 @@ public class MapEditorDialog extends Dialog implements Disposable{ public @Nullable Map save(){ boolean isEditor = state.rules.editor; state.rules.editor = false; - String name = editor.getTags().get("name", "").trim(); - editor.getTags().put("rules", JsonIO.write(state.rules)); - editor.getTags().remove("width"); - editor.getTags().remove("height"); + String name = editor.tags.get("name", "").trim(); + editor.tags.put("rules", JsonIO.write(state.rules)); + editor.tags.remove("width"); + editor.tags.remove("height"); player.clearUnit(); @@ -286,7 +282,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ if(map != null && !map.custom){ handleSaveBuiltin(map); }else{ - returned = maps.saveMap(editor.getTags()); + returned = maps.saveMap(editor.tags); ui.showInfoFade("@editor.saved"); } } @@ -357,7 +353,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ @Override public void dispose(){ - editor.renderer().dispose(); + editor.renderer.dispose(); } public void beginEditMap(Fi file){ @@ -576,22 +572,20 @@ public class MapEditorDialog extends Dialog implements Disposable{ if(Core.input.ctrl()){ //alt mode select - for(int i = 0; i < view.getTool().altModes.length + 1; i++){ - if(Core.input.keyTap(KeyCode.valueOf("num" + (i + 1)))){ - view.getTool().mode = i - 1; + for(int i = 0; i < view.getTool().altModes.length; i++){ + if(i + 1 < KeyCode.numbers.length && Core.input.keyTap(KeyCode.numbers[i + 1])){ + view.getTool().mode = i; } } }else{ - //tool select - for(int i = 0; i < EditorTool.values().length; i++){ - if(Core.input.keyTap(KeyCode.valueOf("num" + (i + 1)))){ - view.setTool(EditorTool.values()[i]); + for(EditorTool tool : EditorTool.all){ + if(Core.input.keyTap(tool.key)){ + view.setTool(tool); break; } } } - if(Core.input.keyTap(KeyCode.escape)){ if(!menu.isShown()){ menu.show(); @@ -619,14 +613,14 @@ public class MapEditorDialog extends Dialog implements Disposable{ for(int x = 0; x < editor.width(); x++){ for(int y = 0; y < editor.height(); y++){ Tile tile = editor.tile(x, y); - if(tile.block().breakable && tile.block() instanceof Rock){ + if(tile.block().breakable && tile.block() instanceof Boulder){ tile.setBlock(Blocks.air); - editor.renderer().updatePoint(x, y); + editor.renderer.updatePoint(x, y); } if(tile.overlay() != Blocks.air && tile.overlay() != Blocks.spawn){ tile.setOverlay(Blocks.air); - editor.renderer().updatePoint(x, y); + editor.renderer.updatePoint(x, y); } } } diff --git a/core/src/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java index c2869a664c..a4a4c0c181 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -144,7 +144,7 @@ public class MapGenerateDialog extends BaseDialog{ } //reset undo stack as generation... messes things up - editor.renderer().updateAll(); + editor.renderer.updateAll(); editor.clearOp(); } @@ -275,6 +275,8 @@ public class MapGenerateDialog extends BaseDialog{ } }).grow().left().pad(6).top(); }).width(280f).pad(3).top().left().fillY(); + + if(++i % cols == 0){ filterTable.row(); } @@ -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); }); } @@ -414,7 +417,7 @@ public class MapGenerateDialog extends BaseDialog{ public void set(Block floor, Block wall, Block ore, Team team){ this.floor = floor.id; this.block = wall.id; - this.ore = ore.id; + this.ore = floor.asFloor().isLiquid ? 0 : ore.id; this.team = (byte)team.id; } diff --git a/core/src/mindustry/editor/MapInfoDialog.java b/core/src/mindustry/editor/MapInfoDialog.java index 9e217c335f..c46e06f36d 100644 --- a/core/src/mindustry/editor/MapInfoDialog.java +++ b/core/src/mindustry/editor/MapInfoDialog.java @@ -29,7 +29,7 @@ public class MapInfoDialog extends BaseDialog{ private void setup(){ cont.clear(); - ObjectMap tags = editor.getTags(); + ObjectMap tags = editor.tags; cont.pane(t -> { t.add("@editor.mapname").padRight(8).left(); @@ -73,8 +73,8 @@ public class MapInfoDialog extends BaseDialog{ t.row(); t.add("@editor.generation").padRight(8).left(); t.button("@edit", () -> { - generate.show(Vars.maps.readFilters(editor.getTags().get("genfilters", "")), - filters -> editor.getTags().put("genfilters", JsonIO.write(filters))); + generate.show(Vars.maps.readFilters(editor.tags.get("genfilters", "")), + filters -> editor.tags.put("genfilters", JsonIO.write(filters))); hide(); }).left().width(200f); diff --git a/core/src/mindustry/editor/MapRenderer.java b/core/src/mindustry/editor/MapRenderer.java index 04bca65167..919c534128 100644 --- a/core/src/mindustry/editor/MapRenderer.java +++ b/core/src/mindustry/editor/MapRenderer.java @@ -24,7 +24,7 @@ public class MapRenderer implements Disposable{ public MapRenderer(MapEditor editor){ this.editor = editor; - this.texture = Core.atlas.find("clear-editor").getTexture(); + this.texture = Core.atlas.find("clear-editor").texture; } public void resize(int width, int height){ @@ -110,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()); }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..21e659ae1b 100644 --- a/core/src/mindustry/editor/MapView.java +++ b/core/src/mindustry/editor/MapView.java @@ -248,14 +248,20 @@ public class MapView extends Element implements GestureListener{ Draw.color(Pal.remove); Lines.stroke(2f); Lines.rect(centerx - sclwidth / 2 - 1, centery - sclheight / 2 - 1, sclwidth + 2, sclheight + 2); - editor.renderer().draw(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); + editor.renderer.draw(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); Draw.reset(); if(grid){ Draw.color(Color.gray); image.setBounds(centerx - sclwidth / 2, centery - sclheight / 2, sclwidth, sclheight); image.draw(); - Draw.color(); + + Lines.stroke(3f); + Draw.color(Pal.accent); + Lines.line(centerx - sclwidth/2f, centery, centerx + sclwidth/2f, centery); + Lines.line(centerx, centery - sclheight/2f, centerx, centery + sclheight/2f); + + Draw.reset(); } int index = 0; diff --git a/core/src/mindustry/editor/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 56acb90a22..152982a986 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,28 @@ public class Damage{ } } + public static float findLaserLength(Bullet b, float length){ + Tmp.v1.trns(b.rotation(), length); + + furthest = null; + + boolean found = world.raycast(b.tileX(), b.tileY(), world.toTile(b.x + Tmp.v1.x), world.toTile(b.y + Tmp.v1.y), + (x, y) -> (furthest = world.tile(x, y)) != null && furthest.team() != b.team && furthest.block().absorbLasers); + + return found && furthest != null ? Math.max(6f, b.dst(furthest.worldx(), furthest.worldy())) : length; + } + + /** Collides a bullet with blocks in a laser, taking into account absorption blocks. Resulting length is stored in the bullet's fdata. */ + public static float collideLaser(Bullet b, float length, boolean large){ + float resultLength = findLaserLength(b, length); + + collideLine(b, b.team, b.type.hitEffect, b.x, b.y, b.rotation(), resultLength, large); + + b.fdata = resultLength; + + return resultLength; + } + 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); } @@ -83,6 +108,8 @@ public class Damage{ * Only enemies of the specified team are damaged. */ public static void collideLine(Bullet hitter, Team team, Effect effect, float x, float y, float angle, float length, boolean large){ + length = findLaserLength(hitter, length); + collidedBlocks.clear(); tr.trns(angle, length); Intc2 collider = (cx, cy) -> { @@ -130,13 +157,8 @@ public class Damage{ if(!e.checkTarget(hitter.type.collidesAir, hitter.type.collidesGround)) return; e.hitbox(hitrect); - Rect other = hitrect; - other.y -= expand; - other.x -= expand; - other.width += expand * 2; - other.height += expand * 2; - Vec2 vec = Geometry.raycastRect(x, y, x2, y2, other); + Vec2 vec = Geometry.raycastRect(x, y, x2, y2, hitrect.grow(expand * 2)); if(vec != null){ effect.at(vec.x, vec.y); diff --git a/core/src/mindustry/entities/Effect.java b/core/src/mindustry/entities/Effect.java index 7950c5375c..fd82f109e9 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,50f, renderer); } public Effect ground(){ @@ -86,11 +86,14 @@ public class Effect{ create(this, x, y, rotation, Color.white, data); } - public void render(int id, Color color, float life, float rotation, float x, float y, Object data){ + public float render(int id, Color color, float life, float lifetime, float rotation, float x, float y, Object data){ container.set(id, color, life, lifetime, rotation, x, y, data); Draw.z(ground ? Layer.debris : Layer.effect); + Draw.reset(); renderer.get(container); Draw.reset(); + + return container.lifetime; } public static @Nullable Effect get(int id){ @@ -124,13 +127,13 @@ public class Effect{ if(view.overlaps(pos)){ EffectState entity = EffectState.create(); - entity.effect(effect); - entity.rotation(rotation); - entity.data(data); - entity.lifetime(effect.lifetime); + entity.effect = effect; + entity.rotation = rotation; + entity.data = (data); + entity.lifetime = (effect.lifetime); entity.set(x, y); - entity.color().set(color); - if(data instanceof Posc) entity.parent((Posc)data); + entity.color.set(color); + if(data instanceof Posc) entity.parent = ((Posc)data); entity.add(); } } 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/Lightning.java b/core/src/mindustry/entities/Lightning.java index dbc7f616c9..b693239061 100644 --- a/core/src/mindustry/entities/Lightning.java +++ b/core/src/mindustry/entities/Lightning.java @@ -24,17 +24,17 @@ public class Lightning{ /** Create a lighting branch at a location. Use Team.derelict to damage everyone. */ public static void create(Team team, Color color, float damage, float x, float y, float targetAngle, int length){ - createLightingInternal(null, lastSeed++, team, color, damage, x, y, targetAngle, length); + createLightningInternal(null, lastSeed++, team, color, damage, x, y, targetAngle, length); } /** Create a lighting branch at a location. Uses bullet parameters. */ public static void create(Bullet bullet, Color color, float damage, float x, float y, float targetAngle, int length){ - createLightingInternal(bullet, lastSeed++, bullet.team, color, damage, x, y, targetAngle, length); + createLightningInternal(bullet, lastSeed++, bullet.team, color, damage, x, y, targetAngle, length); } //TODO remote method //@Remote(called = Loc.server, unreliable = true) - private static void createLightingInternal(Bullet hitter, int seed, Team team, Color color, float damage, float x, float y, float rotation, int length){ + private static void createLightningInternal(Bullet hitter, int seed, Team team, Color color, float damage, float x, float y, float rotation, int length){ random.setSeed(seed); hit.clear(); diff --git a/core/src/mindustry/entities/Units.java b/core/src/mindustry/entities/Units.java index 35143817c7..82827c6530 100644 --- a/core/src/mindustry/entities/Units.java +++ b/core/src/mindustry/entities/Units.java @@ -1,5 +1,6 @@ package mindustry.entities; +import arc.*; import arc.func.*; import arc.math.geom.*; import mindustry.annotations.Annotations.*; @@ -19,8 +20,41 @@ public class Units{ private static boolean boolResult; @Remote(called = Loc.server) - public static void unitDeath(Unit unit){ - unit.killed(); + public static void unitCapDeath(Unit unit){ + if(unit != null){ + unit.dead = true; + Fx.unitCapKill.at(unit); + Core.app.post(() -> Call.unitDestroy(unit.id)); + } + } + + @Remote(called = Loc.server) + public static void unitDeath(int uid){ + Unit unit = Groups.unit.getByID(uid); + + //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(); + } + } + + //destroys immediately + @Remote(called = Loc.server) + public static void unitDestroy(int uid){ + Unit unit = Groups.unit.getByID(uid); + + //if there's no unit don't add it later and get it stuck as a ghost + if(netClient != null){ + netClient.addRemovedEntity(uid); + } + + if(unit != null){ + unit.destroy(); + } } @Remote(called = Loc.server) @@ -90,7 +124,7 @@ public class Units{ nearby(x, y, width, height, unit -> { if(boolResult) return; - if(unit.isGrounded() == ground){ + if((unit.isGrounded() && !unit.type().hovering) == ground){ unit.hitbox(hitrect); if(hitrect.overlaps(x, y, width, height)){ @@ -242,9 +276,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/Ability.java b/core/src/mindustry/entities/abilities/Ability.java index d8aed57239..466bfc1980 100644 --- a/core/src/mindustry/entities/abilities/Ability.java +++ b/core/src/mindustry/entities/abilities/Ability.java @@ -2,7 +2,16 @@ package mindustry.entities.abilities; import mindustry.gen.*; -public interface Ability{ - default void update(Unit unit){} - default void draw(Unit unit){} +public abstract class Ability implements Cloneable{ + public void update(Unit unit){} + public void draw(Unit unit){} + + public Ability copy(){ + try{ + return (Ability)clone(); + }catch(CloneNotSupportedException e){ + //I am disgusted + throw new RuntimeException("java sucks", e); + } + } } diff --git a/core/src/mindustry/entities/abilities/ForceFieldAbility.java b/core/src/mindustry/entities/abilities/ForceFieldAbility.java index 33aa408602..7d36f97e04 100644 --- a/core/src/mindustry/entities/abilities/ForceFieldAbility.java +++ b/core/src/mindustry/entities/abilities/ForceFieldAbility.java @@ -11,7 +11,7 @@ import mindustry.content.*; import mindustry.gen.*; import mindustry.graphics.*; -public class ForceFieldAbility implements Ability{ +public class ForceFieldAbility extends Ability{ /** Shield radius. */ public float radius = 60f; /** Shield regen speed in damage/tick. */ @@ -21,22 +21,26 @@ public class ForceFieldAbility implements Ability{ /** Cooldown after the shield is broken, in ticks. */ public float cooldown = 60f * 5; - private float realRad; - private Unit paramUnit; - private final Cons shieldConsumer = trait -> { + /** State. */ + protected float radiusScale, alpha; + + private static float realRad; + private static Unit paramUnit; + private static ForceFieldAbility paramField; + private static final Cons shieldConsumer = trait -> { if(trait.team() != paramUnit.team && Intersector.isInsideHexagon(paramUnit.x, paramUnit.y, realRad * 2f, trait.x(), trait.y()) && paramUnit.shield > 0){ trait.absorb(); Fx.absorb.at(trait); //break shield if(paramUnit.shield <= trait.damage()){ - paramUnit.shield -= cooldown * regen; + paramUnit.shield -= paramField.cooldown * paramField.regen; - Fx.shieldBreak.at(paramUnit.x, paramUnit.y, radius, paramUnit.team.color); + Fx.shieldBreak.at(paramUnit.x, paramUnit.y, paramField.radius, paramUnit.team.color); } paramUnit.shield -= trait.damage(); - paramUnit.shieldAlpha = 1f; + paramField.alpha = 1f; } }; @@ -55,14 +59,17 @@ public class ForceFieldAbility implements Ability{ unit.shield += Time.delta * regen; } + alpha = Math.max(alpha - Time.delta/10f, 0f); + if(unit.shield > 0){ - unit.timer2 = Mathf.lerpDelta(unit.timer2, 1f, 0.06f); + radiusScale = Mathf.lerpDelta(radiusScale, 1f, 0.06f); paramUnit = unit; + paramField = this; checkRadius(unit); Groups.bullet.intersect(unit.x - realRad, unit.y - realRad, realRad * 2f, realRad * 2f, shieldConsumer); }else{ - unit.timer2 = 0f; + radiusScale = 0f; } } @@ -73,7 +80,7 @@ public class ForceFieldAbility implements Ability{ if(unit.shield > 0){ Draw.z(Layer.shields); - Draw.color(unit.team.color, Color.white, Mathf.clamp(unit.shieldAlpha)); + Draw.color(unit.team.color, Color.white, Mathf.clamp(alpha)); if(Core.settings.getBool("animatedshields")){ Fill.poly(unit.x, unit.y, 6, realRad); @@ -89,6 +96,6 @@ public class ForceFieldAbility implements Ability{ private void checkRadius(Unit unit){ //timer2 is used to store radius scale as an effect - realRad = unit.timer2 * radius; + realRad = radiusScale * radius; } } diff --git a/core/src/mindustry/entities/abilities/HealFieldAbility.java b/core/src/mindustry/entities/abilities/HealFieldAbility.java index 3e12e96963..90f800ec84 100644 --- a/core/src/mindustry/entities/abilities/HealFieldAbility.java +++ b/core/src/mindustry/entities/abilities/HealFieldAbility.java @@ -5,12 +5,13 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; -public class HealFieldAbility implements Ability{ +public class HealFieldAbility extends Ability{ public float amount = 1, reload = 100, range = 60; public Effect healEffect = Fx.heal; - public Effect activeEffect = Fx.healWave; + public Effect activeEffect = Fx.healWaveDynamic; - private boolean wasHealed = false; + protected float timer; + protected boolean wasHealed = false; HealFieldAbility(){} @@ -22,9 +23,9 @@ public class HealFieldAbility implements Ability{ @Override public void update(Unit unit){ - unit.timer1 += Time.delta; + timer += Time.delta; - if(unit.timer1 >= reload){ + if(timer >= reload){ wasHealed = false; Units.nearby(unit.team, unit.x, unit.y, range, other -> { @@ -36,10 +37,10 @@ public class HealFieldAbility implements Ability{ }); if(wasHealed){ - activeEffect.at(unit); + activeEffect.at(unit, range); } - unit.timer1 = 0f; + timer = 0f; } } } diff --git a/core/src/mindustry/entities/abilities/ShieldFieldAbility.java b/core/src/mindustry/entities/abilities/ShieldFieldAbility.java index f7726e8e92..739751f6c1 100644 --- a/core/src/mindustry/entities/abilities/ShieldFieldAbility.java +++ b/core/src/mindustry/entities/abilities/ShieldFieldAbility.java @@ -5,12 +5,13 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; -public class ShieldFieldAbility implements Ability{ +public class ShieldFieldAbility extends Ability{ public float amount = 1, max = 100f, reload = 100, range = 60; public Effect applyEffect = Fx.shieldApply; public Effect activeEffect = Fx.shieldWave; - private boolean applied = false; + protected float timer; + protected boolean applied = false; ShieldFieldAbility(){} @@ -23,9 +24,9 @@ public class ShieldFieldAbility implements Ability{ @Override public void update(Unit unit){ - unit.timer1 += Time.delta; + timer += Time.delta; - if(unit.timer1 >= reload){ + if(timer >= reload){ applied = false; Units.nearby(unit.team, unit.x, unit.y, range, other -> { @@ -41,7 +42,7 @@ public class ShieldFieldAbility implements Ability{ activeEffect.at(unit); } - unit.timer1 = 0f; + timer = 0f; } } } diff --git a/core/src/mindustry/entities/abilities/StatusFieldAbility.java b/core/src/mindustry/entities/abilities/StatusFieldAbility.java index 641e068a0f..a1c9a53418 100644 --- a/core/src/mindustry/entities/abilities/StatusFieldAbility.java +++ b/core/src/mindustry/entities/abilities/StatusFieldAbility.java @@ -7,12 +7,14 @@ import mindustry.entities.*; import mindustry.gen.*; import mindustry.type.*; -public class StatusFieldAbility implements Ability{ +public class StatusFieldAbility extends Ability{ public @NonNull StatusEffect effect; public float duration = 60, reload = 100, range = 20; public Effect applyEffect = Fx.heal; public Effect activeEffect = Fx.overdriveWave; + protected float timer; + StatusFieldAbility(){} public StatusFieldAbility(@NonNull StatusEffect effect, float duration, float reload, float range){ @@ -24,9 +26,9 @@ public class StatusFieldAbility implements Ability{ @Override public void update(Unit unit){ - unit.timer2 += Time.delta; + timer += Time.delta; - if(unit.timer2 >= reload){ + if(timer >= reload){ Units.nearby(unit.team, unit.x, unit.y, range, other -> { other.apply(effect, duration); @@ -34,7 +36,7 @@ public class StatusFieldAbility implements Ability{ activeEffect.at(unit); - unit.timer2 = 0f; + timer = 0f; } } } diff --git a/core/src/mindustry/entities/abilities/UnitSpawnAbility.java b/core/src/mindustry/entities/abilities/UnitSpawnAbility.java new file mode 100644 index 0000000000..1af235140b --- /dev/null +++ b/core/src/mindustry/entities/abilities/UnitSpawnAbility.java @@ -0,0 +1,60 @@ +package mindustry.entities.abilities; + +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.ArcAnnotate.*; +import arc.util.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; + +public class UnitSpawnAbility extends Ability{ + public @NonNull UnitType type; + public float spawnTime = 60f, spawnX, spawnY; + public Effect spawnEffect = Fx.spawn; + + protected float timer; + + public UnitSpawnAbility(@NonNull UnitType type, float spawnTime, float spawnX, float spawnY){ + this.type = type; + this.spawnTime = spawnTime; + this.spawnX = spawnX; + this.spawnY = spawnY; + } + + public UnitSpawnAbility(){ + } + + @Override + public void update(Unit unit){ + timer += Time.delta; + + if(timer >= spawnTime && Units.canCreate(unit.team, type)){ + + float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX); + spawnEffect.at(x, y); + Unit u = type.create(unit.team); + u.set(x, y); + u.rotation = unit.rotation; + if(!Vars.net.client()){ + u.add(); + } + + timer = 0f; + } + } + + @Override + public void draw(Unit unit){ + if(Units.canCreate(unit.team, type)){ + Draw.draw(Draw.z(), () -> { + float x = unit.x + Angles.trnsx(unit.rotation, spawnY, spawnX), y = unit.y + Angles.trnsy(unit.rotation, spawnY, spawnX); + Drawf.construct(x, y, type.icon(Cicon.full), unit.rotation - 90, timer / spawnTime, 1f, timer); + }); + } + } +} diff --git a/core/src/mindustry/entities/bullet/BasicBulletType.java b/core/src/mindustry/entities/bullet/BasicBulletType.java index e2a829e966..ac33c28868 100644 --- a/core/src/mindustry/entities/bullet/BasicBulletType.java +++ b/core/src/mindustry/entities/bullet/BasicBulletType.java @@ -1,16 +1,17 @@ package mindustry.entities.bullet; -import arc.Core; -import arc.graphics.Color; -import arc.graphics.g2d.Draw; -import arc.graphics.g2d.TextureRegion; +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; import arc.math.*; +import arc.util.*; import mindustry.gen.*; -import mindustry.graphics.Pal; +import mindustry.graphics.*; /** An extended BulletType for most ammo-based bullets shot from turrets and units. */ public class BasicBulletType extends BulletType{ public Color backColor = Pal.bulletYellowBack, frontColor = Pal.bulletYellow; + public Color mixColorFrom = new Color(1f, 1f, 1f, 0f), mixColorTo = new Color(1f, 1f, 1f, 0f); public float width = 5f, height = 7f; public float shrinkX = 0f, shrinkY = 0.5f; public float spin = 0; @@ -45,10 +46,15 @@ public class BasicBulletType extends BulletType{ float width = this.width * ((1f - shrinkX) + shrinkX * b.fout()); float offset = -90 + (spin != 0 ? Mathf.randomSeed(b.id, 360f) + b.time * spin : 0f); + Color mix = Tmp.c1.set(mixColorFrom).lerp(mixColorTo, b.fin()); + + Draw.mixcol(mix, mix.a); + Draw.color(backColor); Draw.rect(backRegion, b.x, b.y, width, height, b.rotation() + offset); Draw.color(frontColor); Draw.rect(frontRegion, b.x, b.y, width, height, b.rotation() + offset); - Draw.color(); + + Draw.reset(); } } diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index c5d7a086ec..b2d2f479ff 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -24,7 +24,7 @@ public abstract class BulletType extends Content{ public float hitSize = 4; public float drawSize = 40f; public float drag = 0f; - public boolean pierce; + public boolean pierce, pierceBuilding; public Effect hitEffect, despawnEffect; /** Effect created when shooting. */ @@ -69,12 +69,17 @@ public abstract class BulletType extends Content{ public boolean scaleVelocity; /** Whether this bullet can be hit by point defense. */ public boolean hittable = true; + /** Whether this bullet can be reflected. */ + public boolean reflectable = true; + /** Bullet range override. */ + public float range = -1f; //additional effects public float fragCone = 360f; + public float fragAngle = 0f; 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,14 +97,17 @@ 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; + public int lightningLength = 5, lightningLengthRand = 0; /** Use a negative value to use default bullet damage. */ public float lightningDamage = -1; + public float lightningCone = 360f; + public float lightningAngle = 0f; public float weaveScale = 1f; public float weaveMag = -1f; - public float hitShake = 0f; + public float hitShake = 0f, despawnShake = 0f; public int puddles; public float puddleRange; @@ -123,17 +131,21 @@ public abstract class BulletType extends Content{ /** Returns maximum distance the bullet this bullet type has can travel. */ public float range(){ - return speed * lifetime * (1f - drag); + return Math.max(speed * lifetime * (1f - drag), range); } public boolean collides(Bullet bullet, Building tile){ return true; } - public void hitTile(Bullet b, Building tile){ + public void hitTile(Bullet b, Building tile, float initialHealth){ hit(b); } + public void hitEntity(Bullet b, Hitboxc other, float initialHealth){ + + } + public void hit(Bullet b){ hit(b, b.x, b.y); } @@ -147,8 +159,8 @@ public abstract class BulletType extends Content{ if(fragBullet != null){ for(int i = 0; i < fragBullets; i++){ float len = Mathf.random(1f, 7f); - float a = b.rotation() + Mathf.range(fragCone/2); - fragBullet.create(b, x + Angles.trnsx(a, len), y + Angles.trnsy(a, len), a, Mathf.random(fragVelocityMin, fragVelocityMax)); + float a = b.rotation() + Mathf.range(fragCone/2) + fragAngle; + fragBullet.create(b, x + Angles.trnsx(a, len), y + Angles.trnsy(a, len), a, Mathf.random(fragVelocityMin, fragVelocityMax), Mathf.random(fragLifeMin, fragLifeMax)); } } @@ -172,7 +184,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, b.rotation() + Mathf.range(lightningCone/2) + lightningAngle, lightningLength + Mathf.random(lightningLengthRand)); } } @@ -180,6 +192,8 @@ public abstract class BulletType extends Content{ despawnEffect.at(b.x, b.y, b.rotation(), hitColor); hitSound.at(b); + Effect.shake(despawnShake, despawnShake, b); + if(fragBullet != null || splashDamageRadius > 0 || lightning > 0){ hit(b); } @@ -246,6 +260,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); } @@ -264,9 +282,8 @@ public abstract class BulletType extends Content{ bullet.damage = damage < 0 ? this.damage : damage; bullet.add(); - if(keepVelocity && owner instanceof Hitboxc) bullet.vel.add(((Hitboxc)owner).deltaX() / Time.delta, ((Hitboxc)owner).deltaY() / Time.delta); + if(keepVelocity && owner instanceof Velc) bullet.vel.add(((Velc)owner).vel().x, ((Velc)owner).vel().y); return bullet; - } public void createNet(Team team, float x, float y, float angle, float damage, float velocityScl, float lifetimeScl){ diff --git a/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java b/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java index 1962b97615..0f1894271f 100644 --- a/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java +++ b/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java @@ -12,10 +12,13 @@ import mindustry.graphics.*; public class ContinuousLaserBulletType extends BulletType{ public float length = 220f; public float shake = 1f; + public float fadeTime = 16f; public Color[] colors = {Color.valueOf("ec745855"), Color.valueOf("ec7458aa"), Color.valueOf("ff9c5a"), Color.white}; public float[] tscales = {1f, 0.7f, 0.5f, 0.2f}; public float[] strokes = {2f, 1.5f, 1f, 0.3f}; public float[] lenscales = {1f, 1.12f, 1.15f, 1.17f}; + public float width = 9f, oscScl = 0.8f, oscMag = 1.5f; + public boolean largeHit = true; public ContinuousLaserBulletType(float damage){ super(0.001f, damage); @@ -25,6 +28,7 @@ public class ContinuousLaserBulletType extends BulletType{ hitSize = 4; drawSize = 420f; lifetime = 16f; + keepVelocity = false; pierce = true; hittable = false; hitColor = colors[2]; @@ -32,6 +36,7 @@ public class ContinuousLaserBulletType extends BulletType{ incendAmount = 1; incendSpread = 5; incendChance = 0.4f; + lightColor = Color.orange; } protected ContinuousLaserBulletType(){ @@ -43,13 +48,20 @@ public class ContinuousLaserBulletType extends BulletType{ return length; } + @Override + public void init(){ + super.init(); + + drawSize = Math.max(drawSize, length*2f); + } + @Override public void update(Bullet b){ //TODO possible laser absorption from blocks //damage every 5 ticks if(b.timer(1, 5f)){ - Damage.collideLine(b, b.team, hitEffect, b.x, b.y, b.rotation(), length, true); + Damage.collideLine(b, b.team, hitEffect, b.x, b.y, b.rotation(), length, largeHit); } if(shake > 0){ @@ -59,21 +71,23 @@ public class ContinuousLaserBulletType extends BulletType{ @Override public void draw(Bullet b){ - float baseLen = length * b.fout(); + float realLength = Damage.findLaserLength(b, length); + float fout = Mathf.clamp(b.time > b.lifetime - fadeTime ? 1f - (b.time - (lifetime - fadeTime)) / fadeTime : 1f); + float baseLen = realLength * fout; Lines.lineAngle(b.x, b.y, b.rotation(), baseLen); for(int s = 0; s < colors.length; s++){ Draw.color(Tmp.c1.set(colors[s]).mul(1f + Mathf.absin(Time.time(), 1f, 0.1f))); for(int i = 0; i < tscales.length; i++){ Tmp.v1.trns(b.rotation() + 180f, (lenscales[i] - 1f) * 35f); - Lines.stroke((9f + Mathf.absin(Time.time(), 0.8f, 1.5f)) * b.fout() * strokes[s] * tscales[i]); + Lines.stroke((width + Mathf.absin(Time.time(), oscScl, oscMag)) * fout * strokes[s] * tscales[i]); Lines.lineAngle(b.x + Tmp.v1.x, b.y + Tmp.v1.y, b.rotation(), baseLen * lenscales[i], false); } } Tmp.v1.trns(b.rotation(), baseLen * 1.1f); - Drawf.light(b.team, b.x, b.y, b.x + Tmp.v1.x, b.y + Tmp.v1.y, 40, Color.orange, 0.7f); + Drawf.light(b.team, b.x, b.y, b.x + Tmp.v1.x, b.y + Tmp.v1.y, 40, lightColor, 0.7f); Draw.reset(); } diff --git a/core/src/mindustry/entities/bullet/HealBulletType.java b/core/src/mindustry/entities/bullet/HealBulletType.java index 4d363dc611..b811790000 100644 --- a/core/src/mindustry/entities/bullet/HealBulletType.java +++ b/core/src/mindustry/entities/bullet/HealBulletType.java @@ -21,6 +21,7 @@ public class HealBulletType extends BulletType{ despawnEffect = Fx.hitLaser; collidesTeam = true; hittable = false; + reflectable = false; } public HealBulletType(){ @@ -43,11 +44,11 @@ public class HealBulletType extends BulletType{ } @Override - public void hitTile(Bullet b, Building tile){ + public void hitTile(Bullet b, Building tile, float initialHealth){ 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..ad5965f3b8 100644 --- a/core/src/mindustry/entities/bullet/LaserBulletType.java +++ b/core/src/mindustry/entities/bullet/LaserBulletType.java @@ -8,20 +8,17 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.graphics.*; -import mindustry.world.*; - -import static mindustry.Vars.world; public class LaserBulletType extends BulletType{ - protected static Tile furthest; - - protected Color[] colors = {Pal.lancerLaser.cpy().mul(1f, 1f, 1f, 0.4f), Pal.lancerLaser, Color.white}; - protected Effect laserEffect = Fx.lancerLaserShootSmoke; - protected float length = 160f; - protected float width = 15f; - protected float lengthFalloff = 0.5f; - protected float sideLength = 29f, sideWidth = 0.7f; - protected float sideAngle = 90f; + public Color[] colors = {Pal.lancerLaser.cpy().mul(1f, 1f, 1f, 0.4f), Pal.lancerLaser, Color.white}; + public Effect laserEffect = Fx.lancerLaserShootSmoke; + public float length = 160f; + public float width = 15f; + public float lengthFalloff = 0.5f; + public float sideLength = 29f, sideWidth = 0.7f; + public float sideAngle = 90f; + public float lightningSpacing = -1, lightningDelay = 0.1f, lightningAngleRand; + public boolean largeHit = false; public LaserBulletType(float damage){ super(0.01f, damage); @@ -42,6 +39,13 @@ public class LaserBulletType extends BulletType{ this(1f); } + @Override + public void init(){ + super.init(); + + drawSize = Math.max(drawSize, length*2f); + } + @Override public float range(){ return length; @@ -49,24 +53,35 @@ public class LaserBulletType extends BulletType{ @Override public void init(Bullet b){ - Tmp.v1.trns(b.rotation(), length); + float resultLength = Damage.collideLaser(b, length, largeHit), rot = b.rotation(); - furthest = null; + laserEffect.at(b.x, b.y, rot, resultLength * 0.75f); - 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); + if(lightningSpacing > 0){ + int idx = 0; + for(float i = 0; i <= resultLength; i += lightningSpacing){ + float cx = b.x + Angles.trnsx(rot, i), + cy = b.y + Angles.trnsy(rot, i); - float resultLength = furthest != null ? Math.max(6f, b.dst(furthest.worldx(), furthest.worldy())) : length; + int f = idx++; - Damage.collideLine(b, b.team, hitEffect, b.x, b.y, b.rotation(), resultLength); - if(furthest != null) b.data(resultLength); - - laserEffect.at(b.x, b.y, b.rotation(), resultLength * 0.75f); + for(int s : Mathf.signs){ + Time.run(f * lightningDelay, () -> { + if(b.isAdded() && b.type == this){ + Lightning.create(b, lightningColor, + lightningDamage < 0 ? damage : lightningDamage, + cx, cy, rot + 90*s + Mathf.range(lightningAngleRand), + lightningLength + Mathf.random(lightningLengthRand)); + } + }); + } + } + } } @Override 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 +89,6 @@ public class LaserBulletType extends BulletType{ float compound = 1f; Lines.lineAngle(b.x, b.y, b.rotation(), baseLen); - Lines.precise(true); for(Color color : colors){ Draw.color(color); Lines.stroke((cwidth *= lengthFalloff) * b.fout()); @@ -89,7 +103,6 @@ public class LaserBulletType extends BulletType{ compound *= lengthFalloff; } - Lines.precise(false); Draw.reset(); Tmp.v1.trns(b.rotation(), baseLen * 1.1f); diff --git a/core/src/mindustry/entities/bullet/LiquidBulletType.java b/core/src/mindustry/entities/bullet/LiquidBulletType.java index 45ae536668..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/RailBulletType.java b/core/src/mindustry/entities/bullet/RailBulletType.java new file mode 100644 index 0000000000..8265f35e8b --- /dev/null +++ b/core/src/mindustry/entities/bullet/RailBulletType.java @@ -0,0 +1,60 @@ +package mindustry.entities.bullet; + +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.gen.*; + +//TODO this class is bad for multiple reasons, remove/replace it. +//- effects unreliable +//- not really hitscan but works like it +//- buggy trails +//- looks bad +//- generally unreliable +public class RailBulletType extends BulletType{ + public Effect pierceEffect = Fx.hitBulletSmall, updateEffect = Fx.none; + /** Multiplier of damage decreased per health pierced. */ + public float pierceDamageFactor = 1f; + + public RailBulletType(){ + pierceBuilding = true; + pierce = true; + reflectable = false; + hitEffect = Fx.none; + despawnEffect = Fx.none; + } + + void handle(Bullet b, Posc pos, float initialHealth){ + float sub = initialHealth*pierceDamageFactor; + + if(sub >= b.damage){ + //cause a despawn + b.remove(); + } + + //subtract health from each consecutive pierce + b.damage -= Math.min(b.damage, sub); + + if(b.damage > 0){ + pierceEffect.at(pos.getX(), pos.getY(), b.rotation()); + } + + hitEffect.at(pos.getX(), pos.getY()); + } + + @Override + public void update(Bullet b){ + if(b.timer(1, 0.9f)){ + updateEffect.at(b.x, b.y, b.rotation()); + } + } + + @Override + public void hitEntity(Bullet b, Hitboxc entity, float initialHealth){ + handle(b, entity, initialHealth); + } + + @Override + public void hitTile(Bullet b, Building tile, float initialHealth){ + handle(b, tile, initialHealth); + } +} diff --git a/core/src/mindustry/entities/bullet/SapBulletType.java b/core/src/mindustry/entities/bullet/SapBulletType.java index 6dab6ce13c..549485c3e2 100644 --- a/core/src/mindustry/entities/bullet/SapBulletType.java +++ b/core/src/mindustry/entities/bullet/SapBulletType.java @@ -39,10 +39,15 @@ public class SapBulletType extends BulletType{ Draw.reset(); - Drawf.light(b.team, b.x, b.y, b.x + Tmp.v1.x, b.y + Tmp.v1.y, 15f * b.fout(), lightColor, 0.6f); + Drawf.light(b.team, b.x, b.y, Tmp.v1.x, Tmp.v1.y, 15f * b.fout(), lightColor, 0.6f); } } + @Override + public void drawLight(Bullet b){ + + } + @Override public float range(){ return length; diff --git a/core/src/mindustry/entities/bullet/ShrapnelBulletType.java b/core/src/mindustry/entities/bullet/ShrapnelBulletType.java index 8f26efeaae..01a7ad2d7e 100644 --- a/core/src/mindustry/entities/bullet/ShrapnelBulletType.java +++ b/core/src/mindustry/entities/bullet/ShrapnelBulletType.java @@ -13,9 +13,10 @@ public class ShrapnelBulletType extends BulletType{ public float length = 100f; public float width = 20f; public Color fromColor = Color.white, toColor = Pal.lancerLaser; + public boolean hitLarge = false; public int serrations = 7; - public float serrationLenScl = 10f, serrationWidth = 4f, serrationSpacing = 8f, serrationSpaceOffset = 80f; + public float serrationLenScl = 10f, serrationWidth = 4f, serrationSpacing = 8f, serrationSpaceOffset = 80f, serrationFadeOffset = 0.5f; public ShrapnelBulletType(){ speed = 0.01f; @@ -24,23 +25,39 @@ 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, hitLarge); + } + + @Override + public void init(){ + super.init(); + + drawSize = Math.max(drawSize, length*2f); + } + + @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 39bfb85b97..d0ec5b9a32 100644 --- a/core/src/mindustry/entities/comp/BlockUnitComp.java +++ b/core/src/mindustry/entities/comp/BlockUnitComp.java @@ -18,9 +18,9 @@ abstract class BlockUnitComp implements Unitc{ this.tile = tile; //sets up block stats - maxHealth(tile.block().health); + maxHealth(tile.block.health); health(tile.health()); - hitSize(tile.block().size * tilesize * 0.7f); + hitSize(tile.block.size * tilesize * 0.7f); set(tile); } diff --git a/core/src/mindustry/entities/comp/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index 241179e7ae..36f9661931 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.*; @@ -71,10 +71,10 @@ abstract class BuilderComp implements Unitc{ Tile tile = world.tile(current.x, current.y); if(within(tile, finalPlaceDst)){ - rotation = Mathf.slerpDelta(rotation, angleTo(tile), 0.4f); + lookAt(angleTo(tile)); } - if(!(tile.block() instanceof 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); + entity.deconstruct(self(), 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(self(), 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 c1040c979c..32b23f2b6b 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(self()); + } } this.rotation = rotation; this.tile = tile; @@ -88,7 +94,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, created(); - return base(); + return self(); } /** Sets up all the necessary variables, but does not add this entity anywhere. */ @@ -105,17 +111,17 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, maxHealth(block.health); timer(new Interval(block.timers)); - cons = new ConsumeModule(base()); + cons = new ConsumeModule(self()); if(block.hasItems) items = new ItemModule(); if(block.hasLiquids) liquids = new LiquidModule(); if(block.hasPower){ power = new PowerModule(); - power.graph.add(base()); + power.graph.add(self()); } initialized = true; - return base(); + return self(); } @Override @@ -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){ @@ -180,17 +195,17 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public void configure(Object value){ //save last used config block.lastConfig = value; - Call.tileConfig(player, base(), value); + Call.tileConfig(player, self(), value); } /** Configure from a server. */ public void configureAny(Object value){ - Call.tileConfig(null, base(), value); + Call.tileConfig(null, self(), value); } /** Deselect this tile from configuration. */ public void deselect(){ - if(!headless && control.input.frag.config.getSelectedTile() == base()){ + if(!headless && control.input.frag.config.getSelectedTile() == self()){ control.input.frag.config.hideConfig(); } } @@ -357,7 +372,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Returns the amount of items this block can accept. */ public int acceptStack(Item item, int amount, Teamc source){ - if(acceptItem(base(), item) && block.hasItems && (source == null || source.team() == team)){ + if(acceptItem(self(), item) && block.hasItems && (source == null || source.team() == team)){ return Math.min(getMaximumAccepted(item) - items.get(item), amount); }else{ return 0; @@ -410,8 +425,8 @@ 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)){ - next.build.handlePayload(base(), todump); + if(next != null && next.build != null && next.build.team == team && next.build.acceptPayload(self(), todump)){ + next.build.handlePayload(self(), todump); return true; } @@ -431,8 +446,8 @@ 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)){ - other.handlePayload(base(), todump); + if(other.team == team && other.acceptPayload(self(), todump)){ + other.handlePayload(self(), todump); incrementDump(proximity.size); return true; } @@ -465,7 +480,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); - other = other.getLiquidDestination(base(), liquid); + other = other.getLiquidDestination(self(), liquid); if(other != null && other.team == team && other.block.hasLiquids && canDumpLiquid(other, liquid) && other.liquids != null){ float ofract = other.liquids.get(liquid) / other.block.liquidCapacity; @@ -484,8 +499,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public void transferLiquid(Building next, float amount, Liquid liquid){ float flow = Math.min(next.block.liquidCapacity - next.liquids.get(liquid) - 0.001f, amount); - if(next.acceptLiquid(base(), liquid, flow)){ - next.handleLiquid(base(), liquid, flow); + if(next.acceptLiquid(self(), liquid, flow)){ + next.handleLiquid(self(), liquid, flow); liquids.remove(liquid, flow); } } @@ -508,7 +523,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, public float moveLiquid(Building next, Liquid liquid){ if(next == null) return 0; - next = next.getLiquidDestination(base(), liquid); + next = next.getLiquidDestination(self(), liquid); if(next.team == team && next.block.hasLiquids && liquids.get(liquid) > 0f){ float ofract = next.liquids.get(liquid) / next.block.liquidCapacity; @@ -516,8 +531,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, 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); + if(flow > 0f && ofract <= fract && next.acceptLiquid(self(), liquid, flow)){ + next.handleLiquid(self(), liquid, flow); liquids.remove(liquid, flow); return flow; }else if(next.liquids.currentAmount() / next.block.liquidCapacity > 0.1f && fract > 0.1f){ @@ -543,7 +558,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } public Building getLiquidDestination(Building from, Liquid liquid){ - return base(); + return self(); } public @Nullable Payload getPayload(){ @@ -565,13 +580,13 @@ 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)){ - other.handleItem(base(), item); + if(other.team == team && other.acceptItem(self(), item) && canDump(other, item)){ + other.handleItem(self(), item); return; } } - handleItem(base(), item); + handleItem(self(), item); } /** @@ -583,8 +598,8 @@ 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)){ - other.handleItem(base(), item); + if(other.team == team && other.acceptItem(self(), item) && canDump(other, item)){ + other.handleItem(self(), item); return true; } } @@ -616,16 +631,16 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, for(int ii = 0; ii < content.items().size; ii++){ Item item = content.item(ii); - if(other.team == team && items.has(item) && other.acceptItem(base(), item) && canDump(other, item)){ - other.handleItem(base(), item); + if(other.team == team && items.has(item) && other.acceptItem(self(), item) && canDump(other, item)){ + other.handleItem(self(), item); items.remove(item, 1); incrementDump(proximity.size); return true; } } }else{ - if(other.team == team && other.acceptItem(base(), todump) && canDump(other, todump)){ - other.handleItem(base(), todump); + if(other.team == team && other.acceptItem(self(), todump) && canDump(other, todump)){ + other.handleItem(self(), todump); items.remove(todump, 1); incrementDump(proximity.size); return true; @@ -650,8 +665,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, /** Try offloading an item to a nearby container in its facing direction. Returns true if success. */ public boolean moveForward(Item item){ Building other = front(); - if(other != null && other.team == team && other.acceptItem(base(), item)){ - other.handleItem(base(), item); + if(other != null && other.team == team && other.acceptItem(self(), item)){ + other.handleItem(self(), item); return true; } return false; @@ -681,13 +696,14 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, return; } - power.graph.remove(base()); + power.graph.remove(self()); for(int i = 0; i < power.links.size; i++){ Tile other = world.tile(power.links.get(i)); if(other != null && other.build != null && other.build.power != null){ other.build.power.links.removeValue(pos()); } } + power.links.clear(); } public Seq getPowerConnections(Seq out){ @@ -803,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. */ @@ -819,10 +833,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, tempTiles.clear(); Geometry.circle(tileX(), tileY(), range, (x, y) -> { Building other = world.build(x, y); - if(other != null && other.block instanceof PowerNode && ((PowerNode)other.block).linkValid(other, base()) && !PowerNode.insulated(other, base()) - && !other.proximity().contains(this.base()) && + if(other != null && other.block instanceof PowerNode && ((PowerNode)other.block).linkValid(other, self()) && !PowerNode.insulated(other, self()) + && !other.proximity().contains(this.self()) && !(block.outputsPower && proximity.contains(p -> p.power != null && p.power.graph == other.power.graph))){ - tempTiles.add(other.tile()); + tempTiles.add(other.tile); } }); tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); @@ -847,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(); @@ -884,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); @@ -900,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); } @@ -957,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(); @@ -995,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(); } } @@ -1010,13 +1037,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, table.left(); for(Consume cons : block.consumes.all()){ if(cons.isOptional() && cons.isBoost()) continue; - cons.build(base(), table); + cons.build(self(), table); } } public void displayBars(Table table){ for(Func bar : block.bars.list()){ - table.add(bar.get(base())).growX(); + table.add(bar.get(self())).growX(); table.row(); } } @@ -1042,7 +1069,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, * @return whether or not this block should be deselected. */ public boolean onConfigureTileTapped(Building other){ - return base() != other; + return self() != other; } /** Returns whether this config menu should show when the specified player taps it. */ @@ -1101,7 +1128,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } for(Building other : tmpTiles){ - other.proximity.remove(base(), true); + other.proximity.remove(self(), true); other.onProximityUpdate(); } } @@ -1117,8 +1144,8 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, if(other == null || !(other.tile.interactable(team))) continue; //add this tile to proximity of nearby tiles - if(!other.proximity.contains(base(), true)){ - other.proximity.add(base()); + if(!other.proximity.contains(self(), true)){ + other.proximity.add(self()); } tmpTiles.add(other); @@ -1157,13 +1184,13 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, @Replace @Override public boolean isValid(){ - return tile.build == base() && !dead(); + return tile.build == self() && !dead(); } @Replace @Override public void kill(){ - Call.tileDestroyed(base()); + Call.tileDestroyed(self()); } @Replace @@ -1177,10 +1204,10 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, damage /= state.rules.blockHealthMultiplier; } - Call.tileDamage(base(), health - handleDamage(damage)); + Call.tileDamage(self(), health - handleDamage(damage)); if(health <= 0){ - Call.tileDestroyed(base()); + Call.tileDestroyed(self()); } } @@ -1190,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(); @@ -1198,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); @@ -1257,7 +1292,7 @@ abstract class BuildingComp implements Posc, Teamc, Healthc, Buildingc, Timerc, } if(block.idleSound != Sounds.none && shouldIdleSound()){ - loops.play(block.idleSound, base(), block.idleSoundVolume); + loops.play(block.idleSound, self(), block.idleSoundVolume); } if(enabled || !block.noUpdateDisabled){ diff --git a/core/src/mindustry/entities/comp/BulletComp.java b/core/src/mindustry/entities/comp/BulletComp.java index c94216c923..5ef68ac2e1 100644 --- a/core/src/mindustry/entities/comp/BulletComp.java +++ b/core/src/mindustry/entities/comp/BulletComp.java @@ -25,27 +25,36 @@ 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)); + } + } } } @Override public void drawBullets(){ - type.draw(base()); + type.draw(self()); } @Override public void add(){ - type.init(base()); + type.init(self()); } @Override public void remove(){ - type.despawned(base()); + type.despawned(self()); collided.clear(); } @@ -83,10 +92,12 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw @MethodPriority(100) @Override public void collision(Hitboxc other, float x, float y){ - type.hit(base(), x, y); + type.hit(self(), x, y); + float health = 0f; if(other instanceof Healthc){ Healthc h = (Healthc)other; + health = h.health(); h.damage(damage); } @@ -102,30 +113,40 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw }else{ collided.add(other.id()); } + + type.hitEntity(self(), other, health); } @Override public void update(){ - type.update(base()); + type.update(self()); if(type.collidesTiles && type.collides && type.collidesGround){ world.raycastEach(world.toTile(lastX()), world.toTile(lastY()), tileX(), tileY(), (x, y) -> { Building tile = world.build(x, y); - if(tile == null) return false; + if(tile == null || !isAdded()) return false; - if(tile.collide(base()) && type.collides(base(), tile) && !tile.dead() && (type.collidesTeam || tile.team != team)){ + if(tile.collide(self()) && type.collides(self(), tile) && !tile.dead() && (type.collidesTeam || tile.team != team) && !(type.pierceBuilding && collided.contains(tile.id))){ boolean remove = false; + float health = tile.health; + if(tile.team != team){ - remove = tile.collision(base()); + remove = tile.collision(self()); } if(remove || type.collidesTeam){ - type.hitTile(base(), tile); - remove(); + if(!type.pierceBuilding){ + remove(); + }else{ + collided.add(tile.id); + } } - return true; + + type.hitTile(self(), tile, health); + + return !type.pierceBuilding; } return false; @@ -137,8 +158,8 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw public void draw(){ Draw.z(Layer.bullet); - type.draw(base()); - type.drawLight(base()); + type.draw(self()); + type.drawLight(self()); } /** Sets the bullet's rotation in degrees. */ diff --git a/core/src/mindustry/entities/comp/CommanderComp.java b/core/src/mindustry/entities/comp/CommanderComp.java index 39fdda447f..99bca89cf9 100644 --- a/core/src/mindustry/entities/comp/CommanderComp.java +++ b/core/src/mindustry/entities/comp/CommanderComp.java @@ -27,7 +27,7 @@ abstract class CommanderComp implements Unitc{ @Override public void update(){ if(formation != null){ - formation.anchor.set(x, y, rotation); + formation.anchor.set(x, y, /*rotation*/ 0); //TODO rotation set to 0 because rotating is pointless formation.updateSlots(); } } @@ -59,7 +59,7 @@ abstract class CommanderComp implements Unitc{ units.clear(); Units.nearby(team(), x, y, 200f, u -> { - if(u.isAI() && include.get(u) && u != base()){ + if(u.isAI() && include.get(u) && u != self()){ units.add(u); } }); @@ -73,13 +73,13 @@ abstract class CommanderComp implements Unitc{ void command(Formation formation, Seq units){ clearCommand(); - float spacing = hitSize() * 1.7f; + float spacing = hitSize() * 0.65f; minFormationSpeed = type().speed; controlling.addAll(units); for(Unit unit : units){ FormationAI ai; - unit.controller(ai = new FormationAI(base(), formation)); + unit.controller(ai = new FormationAI(self(), formation)); spacing = Math.max(spacing, ai.formationSize()); minFormationSpeed = Math.min(minFormationSpeed, unit.type().speed); } @@ -104,7 +104,7 @@ abstract class CommanderComp implements Unitc{ void clearCommand(){ //reset controlled units for(Unit unit : controlling){ - if(unit.controller().isBeingControlled(base())){ + if(unit.controller().isBeingControlled(self())){ unit.controller(unit.type().createController()); } } diff --git a/core/src/mindustry/entities/comp/DecalComp.java b/core/src/mindustry/entities/comp/DecalComp.java index 6db6b58f53..33ce6d406c 100644 --- a/core/src/mindustry/entities/comp/DecalComp.java +++ b/core/src/mindustry/entities/comp/DecalComp.java @@ -27,7 +27,7 @@ abstract class DecalComp implements Drawc, Timedc, Rotc, Posc{ @Replace public float clipSize(){ - return region.getWidth()*2; + return region.width *2; } } diff --git a/core/src/mindustry/entities/comp/EffectStateComp.java b/core/src/mindustry/entities/comp/EffectStateComp.java index 3ad57d5d19..776a696049 100644 --- a/core/src/mindustry/entities/comp/EffectStateComp.java +++ b/core/src/mindustry/entities/comp/EffectStateComp.java @@ -8,13 +8,16 @@ import mindustry.gen.*; @EntityDef(value = {EffectStatec.class, Childc.class}, pooled = true, serialize = false) @Component(base = true) abstract class EffectStateComp implements Posc, Drawc, Timedc, Rotc, Childc{ + @Import float time, lifetime, rotation, x, y; + @Import int id; + Color color = new Color(Color.white); Effect effect; Object data; @Override public void draw(){ - effect.render(id(), color, time(), rotation(), x(), y(), data); + lifetime = effect.render(id, color, time, lifetime, rotation, x, y, data); } @Replace diff --git a/core/src/mindustry/entities/comp/ElevationMoveComp.java b/core/src/mindustry/entities/comp/ElevationMoveComp.java index 07eae31a6c..f87bc1de0f 100644 --- a/core/src/mindustry/entities/comp/ElevationMoveComp.java +++ b/core/src/mindustry/entities/comp/ElevationMoveComp.java @@ -1,23 +1,18 @@ package mindustry.entities.comp; import mindustry.annotations.Annotations.*; +import mindustry.entities.*; +import mindustry.entities.EntityCollisions.*; import mindustry.gen.*; -import static mindustry.Vars.*; - @Component abstract class ElevationMoveComp implements Velc, Posc, Flyingc, Hitboxc{ @Import float x, y; @Replace @Override - public void move(float cx, float cy){ - if(isFlying()){ - x += cx; - y += cy; - }else{ - collisions.move(this, cx, cy); - } + public SolidPred solidity(){ + return isFlying() ? null : EntityCollisions::solid; } } diff --git a/core/src/mindustry/entities/comp/EntityComp.java b/core/src/mindustry/entities/comp/EntityComp.java index 3e49ea01ce..2b20e908b2 100644 --- a/core/src/mindustry/entities/comp/EntityComp.java +++ b/core/src/mindustry/entities/comp/EntityComp.java @@ -40,7 +40,7 @@ abstract class EntityComp{ return false; } - T base(){ + T self(){ return (T)this; } diff --git a/core/src/mindustry/entities/comp/FireComp.java b/core/src/mindustry/entities/comp/FireComp.java index 075a96416b..ea67ca9e19 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(){ @@ -97,6 +97,11 @@ abstract class FireComp implements Timedc, Posc, Firec{ @Override public void afterRead(){ - Fires.register(base()); + Fires.register(self()); + } + + @Override + public void afterSync(){ + Fires.register(self()); } } diff --git a/core/src/mindustry/entities/comp/FlyingComp.java b/core/src/mindustry/entities/comp/FlyingComp.java index 415337622b..83c16d3525 100644 --- a/core/src/mindustry/entities/comp/FlyingComp.java +++ b/core/src/mindustry/entities/comp/FlyingComp.java @@ -1,10 +1,12 @@ package mindustry.entities.comp; +import arc.*; import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.world.blocks.environment.*; @@ -74,7 +76,7 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ } if(!hovering && isGrounded() && floor.isLiquid){ - if((splashTimer += Mathf.dst(deltaX(), deltaY())) >= 7f){ + if((splashTimer += Mathf.dst(deltaX(), deltaY())) >= (7f + hitSize()/8f)){ floor.walkEffect.at(x, y, hitSize() / 8f, floor.mapColor); splashTimer = 0f; } @@ -90,7 +92,7 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ //TODO is the netClient check necessary? if(drownTime >= 0.999f && !net.client()){ kill(); - //TODO drown event! + Events.fire(new UnitDrownEvent(self())); } }else{ drownTime = Mathf.lerpDelta(drownTime, 0f, 0.03f); diff --git a/core/src/mindustry/entities/comp/HitboxComp.java b/core/src/mindustry/entities/comp/HitboxComp.java index f92948af41..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..e6022ed91e 100644 --- a/core/src/mindustry/entities/comp/LegsComp.java +++ b/core/src/mindustry/entities/comp/LegsComp.java @@ -4,16 +4,16 @@ import arc.math.*; import arc.math.geom.*; import arc.util.*; import mindustry.*; +import mindustry.ai.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; +import mindustry.entities.EntityCollisions.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.blocks.environment.*; -import static mindustry.Vars.*; - @Component abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ @Import float x, y; @@ -26,34 +26,52 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc{ @Replace @Override - public void move(float cx, float cy){ - collisions.moveCheck(this, cx, cy, !type.allowLegStep ? EntityCollisions::solid : EntityCollisions::legsSolid); + public SolidPred solidity(){ + return !type.allowLegStep ? EntityCollisions::solid : EntityCollisions::legsSolid; + } + + @Override + @Replace + public int pathType(){ + return Pathfinder.costLegs; + } + + @Override + public void add(){ + resetLegs(); + } + + public void resetLegs(){ + float rot = baseRotation; + int count = type.legCount; + float legLength = type.legLength; + + this.legs = new Leg[count]; + + float spacing = 360f / count; + + for(int i = 0; i < legs.length; i++){ + Leg l = new Leg(); + + l.joint.trns(i * spacing + rot, legLength/2f + type.legBaseOffset).add(x, y); + l.base.trns(i * spacing + rot, legLength + type.legBaseOffset).add(x, y); + + legs[i] = l; + } } @Override public void update(){ if(Mathf.dst(deltaX(), deltaY()) > 0.001f){ - baseRotation = Mathf.slerpDelta(baseRotation, Mathf.angle(deltaX(), deltaY()), 0.1f); + baseRotation = Angles.moveToward(baseRotation, Mathf.angle(deltaX(), deltaY()), type.rotateSpeed); } float rot = baseRotation; - int count = type.legCount; float legLength = type.legLength; //set up initial leg positions if(legs.length != type.legCount){ - this.legs = new Leg[count]; - - float spacing = 360f / count; - - for(int i = 0; i < legs.length; i++){ - Leg l = new Leg(); - - l.joint.trns(i * spacing + rot, legLength/2f + type.legBaseOffset).add(x, y); - l.base.trns(i * spacing + rot, legLength + type.legBaseOffset).add(x, y); - - legs[i] = l; - } + resetLegs(); } float moveSpeed = type.legSpeed; diff --git a/core/src/mindustry/entities/comp/MechComp.java b/core/src/mindustry/entities/comp/MechComp.java index d258e75406..94bb380c96 100644 --- a/core/src/mindustry/entities/comp/MechComp.java +++ b/core/src/mindustry/entities/comp/MechComp.java @@ -1,19 +1,86 @@ package mindustry.entities.comp; +import arc.graphics.*; import arc.math.*; +import arc.math.geom.*; import arc.util.*; import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.entities.*; import mindustry.gen.*; +import mindustry.type.*; +import mindustry.world.*; + +import static mindustry.Vars.*; @Component abstract class MechComp implements Posc, Flyingc, Hitboxc, Unitc, Mechc, ElevationMovec{ + @Import float x, y, hitSize; + @Import UnitType type; + @SyncField(false) @SyncLocal float baseRotation; - transient float walkTime; + transient float walkTime, walkExtension; + transient private boolean walked; @Override public void update(){ - float len = deltaLen(); - baseRotation = Angles.moveToward(baseRotation, deltaAngle(), type().baseRotateSpeed * Mathf.clamp(len / type().speed / Time.delta) * Time.delta); - walkTime += len; + //trigger animation only when walking manually + if(walked || net.client()){ + float len = deltaLen(); + baseRotation = Angles.moveToward(baseRotation, deltaAngle(), type().baseRotateSpeed * Mathf.clamp(len / type().speed / Time.delta) * Time.delta); + walkTime += len; + walked = false; + } + + //update mech effects + float extend = walkExtend(false); + float base = walkExtend(true); + float extendScl = base % 1f; + + float lastExtend = walkExtension; + + if(extendScl < lastExtend && base % 2f > 1f){ + int side = -Mathf.sign(extend); + float width = hitSize / 2f * side, length = type.mechStride * 1.35f; + + float cx = x + Angles.trnsx(baseRotation, length, width), + cy = y + Angles.trnsy(baseRotation, length, width); + + if(type.mechStepShake > 0){ + Effect.shake(type.mechStepShake, type.mechStepShake, cx, cy); + } + + if(type.mechStepParticles){ + Tile tile = world.tileWorld(cx, cy); + if(tile != null){ + Color color = tile.floor().mapColor; + Fx.unitLand.at(cx, cy, hitSize/8f, color); + } + } + } + + walkExtension = extendScl; + } + + public float walkExtend(boolean scaled){ + + //now ranges from -maxExtension to maxExtension*3 + float raw = walkTime % (type.mechStride * 4); + + if(scaled) return raw / type.mechStride; + + if(raw > type.mechStride*3) raw = raw - type.mechStride * 4; + else if(raw > type.mechStride*2) raw = type.mechStride * 2 - raw; + else if(raw > type.mechStride) raw = type.mechStride * 2 - raw; + + return raw; + } + + @Override + public void moveAt(Vec2 vector, float acceleration){ + if(!vector.isZero()){ + //mark walking state when moving in a controlled manner + walked = true; + } } } diff --git a/core/src/mindustry/entities/comp/MinerComp.java b/core/src/mindustry/entities/comp/MinerComp.java index 1ec4794ca2..7049617b73 100644 --- a/core/src/mindustry/entities/comp/MinerComp.java +++ b/core/src/mindustry/entities/comp/MinerComp.java @@ -33,7 +33,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ } boolean mining(){ - return mineTile != null; + return mineTile != null && !(((Object)this) instanceof Builderc && ((Builderc)(Object)this).activelyBuilding()); } @Override @@ -51,13 +51,12 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc, Unitc{ } if(mineTile == null || core == null || mineTile.block() != Blocks.air || dst(mineTile.worldx(), mineTile.worldy()) > miningRange - || (((Object)this) instanceof Builderc && ((Builderc)(Object)this).activelyBuilding()) || mineTile.drop() == null || !canMine(mineTile.drop())){ mineTile = null; mineTimer = 0f; - }else{ + }else if(mining()){ Item item = mineTile.drop(); - rotation(Mathf.slerpDelta(rotation(), angleTo(mineTile.worldx(), mineTile.worldy()), 0.4f)); + lookAt(angleTo(mineTile.worldx(), mineTile.worldy())); mineTimer += Time.delta *type.mineSpeed; if(Mathf.chance(0.06 * Time.delta)){ diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index b715d4d7c4..75bc07c21e 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 + 0.001f; + } + + boolean canPickup(Building build){ + return payloadUsed() + build.block.size * build.block.size * Vars.tilesize * Vars.tilesize <= type.payloadCapacity + 0.001f; + } + + boolean canPickupPayload(Payload pay){ + return payloadUsed() + pay.size()*pay.size() <= type.payloadCapacity + 0.001f; + } + boolean hasPayload(){ return payloads.size > 0; } @@ -30,10 +48,13 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc{ unit.remove(); payloads.add(new UnitPayload(unit)); Fx.unitPickup.at(unit); + if(Vars.net.client()){ + Vars.netClient.clearRemovedEntity(unit.id); + } } void pickup(Building tile){ - tile.tile().remove(); + tile.tile.remove(); payloads.add(new BlockPayload(tile)); Fx.unitPickup.at(tile); } @@ -53,6 +74,11 @@ abstract class PayloadComp implements Posc, Rotc, Hitboxc{ boolean tryDropPayload(Payload payload){ Tile on = tileOn(); + //clear removed state of unit so it can be synced + if(Vars.net.client() && payload instanceof UnitPayload){ + Vars.netClient.clearRemovedEntity(((UnitPayload)payload).unit.id); + } + //drop off payload on an acceptor if possible if(on != null && on.build != null && on.build.acceptPayload(on.build, payload)){ Fx.unitDrop.at(on.build); @@ -70,13 +96,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)){ + if(!u.canPass(tileX(), tileY())){ return false; } + Fx.unitDrop.at(this); + //clients do not drop payloads if(Vars.net.client()) return true; @@ -93,9 +120,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, false)){ 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..ca52705964 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; @@ -88,11 +92,17 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra @Replace public float clipSize(){ - return unit.isNull() ? 20 : unit.type().hitsize * 2f; + return unit.isNull() ? 20 : unit.type().hitSize * 2f; } @Override 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); @@ -124,7 +134,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra deathTimer += Time.delta; if(deathTimer >= deathDelay){ //request spawn - this happens serverside only - core.requestSpawn(base()); + core.requestSpawn(self()); deathTimer = 0; } } @@ -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,9 +184,14 @@ 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)); + Events.fire(new UnitChangeEvent(self(), unit)); } boolean dead(){ diff --git a/core/src/mindustry/entities/comp/PosComp.java b/core/src/mindustry/entities/comp/PosComp.java index 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/PuddleComp.java b/core/src/mindustry/entities/comp/PuddleComp.java index 35ab03416c..669ee7e1f2 100644 --- a/core/src/mindustry/entities/comp/PuddleComp.java +++ b/core/src/mindustry/entities/comp/PuddleComp.java @@ -128,6 +128,6 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{ @Override public void afterRead(){ - Puddles.register(base()); + Puddles.register(self()); } } diff --git a/core/src/mindustry/entities/comp/StatusComp.java b/core/src/mindustry/entities/comp/StatusComp.java index bf61535026..3a31b13b95 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){ @@ -46,7 +42,7 @@ abstract class StatusComp implements Posc, Flyingc{ return; }else if(entry.effect.reactsWith(effect)){ //find opposite StatusEntry.tmp.effect = entry.effect; - entry.effect.getTransition(base(), effect, entry.time, duration, StatusEntry.tmp); + entry.effect.getTransition(self(), effect, entry.time, duration, StatusEntry.tmp); entry.time = StatusEntry.tmp.time; if(StatusEntry.tmp.effect != entry.effect){ @@ -102,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); } @@ -129,14 +125,14 @@ abstract class StatusComp implements Posc, Flyingc{ armorMultiplier *= entry.effect.armorMultiplier; damageMultiplier *= entry.effect.damageMultiplier; reloadMultiplier *= entry.effect.reloadMultiplier; - entry.effect.update(base(), entry.time); + entry.effect.update(self(), entry.time); } } } public void draw(){ for(StatusEntry e : statuses){ - e.effect.draw(base()); + e.effect.draw(self()); } } diff --git a/core/src/mindustry/entities/comp/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..d2618e7e83 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -5,12 +5,15 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; +import mindustry.ai.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.ctype.*; import mindustry.entities.*; +import mindustry.entities.abilities.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; import mindustry.game.*; @@ -27,16 +30,17 @@ import static mindustry.Vars.*; @Component(base = true) abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Displayable, Senseable{ - @Import boolean hovering; - @Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health; - @Import boolean dead; + @Import boolean hovering, dead; + @Import float x, y, rotation, elevation, maxHealth, drag, armor, hitSize, health, ammo; @Import Team team; + @Import int id; private UnitController controller; private UnitType type; - boolean spawnedByCore, deactivated; + boolean spawnedByCore; - transient float timer1, timer2; + transient Seq abilities = new Seq<>(0); + private transient float resupplyTime = Mathf.random(10f); public void moveAt(Vec2 vector){ moveAt(vector, type.accel); @@ -66,7 +70,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Replace public float clipSize(){ - return type.region.getWidth() * 2f; + return Math.max(type.region.width * 2f, type.clipSize); } @Override @@ -74,6 +78,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 +88,32 @@ 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; + } + + @Override + @Replace + public boolean canShoot(){ + //cannot shoot while boosting + return !(type.canBoost && isFlying()); + } + @Override public int itemCapacity(){ return type.itemCapacity; @@ -102,7 +127,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void controller(UnitController next){ this.controller = next; - if(controller.unit() != base()) controller.unit(base()); + if(controller.unit() != self()) controller.unit(self()); } @Override @@ -132,8 +157,13 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I return type; } + /** @return pathfinder path type for calculating costs */ + public int pathType(){ + return Pathfinder.costGround; + } + public void lookAt(float angle){ - rotation = Angles.moveToward(rotation, angle, type.rotateSpeed * Time.delta); + rotation = Angles.moveToward(rotation, angle, type.rotateSpeed * Time.delta * speedMultiplier()); } public void lookAt(Position pos){ @@ -156,23 +186,26 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I return Units.getCap(team); } - private void setStats(UnitType type){ + public void setStats(UnitType type){ this.type = type; this.maxHealth = type.health; this.drag = type.drag; this.armor = type.armor; - this.hitSize = type.hitsize; + this.hitSize = type.hitSize; this.hovering = type.hovering; if(controller == null) controller(type.createController()); if(mounts().length != type.weapons.size) setupWeapons(type); + if(abilities.size != type.abilities.size){ + abilities = type.abilities.map(Ability::copy); + } } @Override public void afterSync(){ //set up type info after reading setStats(this.type); - controller.unit(base()); + controller.unit(self()); } @Override @@ -184,20 +217,18 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void add(){ - teamIndex.updateCount(team, type, 1); //check if over unit cap - if(count() > cap() && !spawnedByCore){ - deactivated = true; - }else{ - teamIndex.updateActiveCount(team, type, 1); + if(count() > cap() && !spawnedByCore && !dead){ + Call.unitCapDeath(self()); + teamIndex.updateCount(team, type, -1); } } @Override public void remove(){ teamIndex.updateCount(team, type, -1); - controller.removed(base()); + controller.removed(self()); } @Override @@ -206,24 +237,35 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I Effect.shake(type.landShake, type.landShake, this); } - type.landed(base()); + type.landed(self()); } @Override public void update(){ - //activate the unit when possible - if(!net.client() && deactivated && teamIndex.countActive(team, type) < Units.getCap(team)){ - teamIndex.updateActiveCount(team, type, 1); - deactivated = false; + + type.update(self()); + + if(state.rules.unitAmmo && ammo < type.ammoCapacity - 0.0001f){ + resupplyTime += Time.delta; + + //resupply only at a fixed interval to prevent lag + if(resupplyTime > 10f){ + type.ammoType.resupply(self()); + resupplyTime = 0f; + } } - if(!deactivated) type.update(base()); + if(abilities.size > 0){ + for(Ability a : abilities){ + a.update(self()); + } + } drag = type.drag * (isGrounded() ? (floorOn().dragMultiplier) : 1f); //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 +274,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; @@ -267,25 +309,27 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I if(tile != null && isGrounded() && !type.hovering){ //unit block update if(tile.build != null){ - tile.build.unitOn(base()); + tile.build.unitOn(self()); } //apply damage if(floor.damageTaken > 0f){ damageContinuous(floor.damageTaken); } + } - if(!net.client() && tile.solid()){ - if(type.canBoost){ - elevation = 1f; - }else{ - kill(); - } + //kill entities on tiles that are solid to them + if(tile != null && !canPassOn()){ + //boost if possible + if(type.canBoost){ + elevation = 1f; + }else if(!net.client()){ + kill(); } } //AI only updates on the server - if(!net.client() && !dead && !deactivated){ + if(!net.client() && !dead){ controller.updateUnit(); } @@ -294,14 +338,9 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I resetController(); } - //do not control anything when deactivated - if(deactivated){ - controlWeapons(false, false); - } - //remove units spawned by the core if(spawnedByCore && !isPlayer()){ - Call.unitDespawn(base()); + Call.unitDespawn(self()); } } @@ -312,9 +351,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; @@ -323,7 +362,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I Effect.shake(shake, shake, this); type.deathSound.at(this); - Events.fire(new UnitDestroyEvent(base())); + Events.fire(new UnitDestroyEvent(self())); if(explosiveness > 7f && isLocal()){ Events.fire(Trigger.suicideBomb); @@ -331,13 +370,13 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I //if this unit crash landed (was flying), damage stuff in a radius if(type.flying){ - Damage.damage(team,x, y, hitSize * 1.1f, hitSize * type.crashDamageMultiplier, true, false, true); + Damage.damage(team,x, y, Mathf.pow(hitSize, 0.94f) * 1.25f, Mathf.pow(hitSize, 0.75f) * type.crashDamageMultiplier * 5f, true, false, true); } if(!headless){ for(int i = 0; i < type.wreckRegions.length; i++){ if(type.wreckRegions[i].found()){ - float range = type.hitsize/4f; + float range = type.hitSize /4f; Tmp.v1.rnd(range); Effect.decal(type.wreckRegions[i], x + Tmp.v1.x, y + Tmp.v1.y, rotation - 90); } @@ -349,7 +388,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void display(Table table){ - type.display(base(), table); + type.display(self(), table); } @Override @@ -359,7 +398,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I @Override public void draw(){ - type.draw(base()); + type.draw(self()); } @Override @@ -378,7 +417,7 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I dead = true; //don't waste time when the unit is already on the ground, just destroy it - if(isGrounded()){ + if(!type.flying){ destroy(); } } @@ -389,6 +428,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/VelComp.java b/core/src/mindustry/entities/comp/VelComp.java index 469d217665..deec6756d1 100644 --- a/core/src/mindustry/entities/comp/VelComp.java +++ b/core/src/mindustry/entities/comp/VelComp.java @@ -3,9 +3,13 @@ package mindustry.entities.comp; import arc.math.*; import arc.math.geom.*; import arc.util.*; +import arc.util.ArcAnnotate.*; import mindustry.annotations.Annotations.*; +import mindustry.entities.EntityCollisions.*; import mindustry.gen.*; +import static mindustry.Vars.*; + @Component abstract class VelComp implements Posc{ @Import float x, y; @@ -22,12 +26,35 @@ abstract class VelComp implements Posc{ vel.scl(Mathf.clamp(1f - drag * Time.delta)); } + /** @return function to use for check solid state. if null, no checking is done. */ + @Nullable + SolidPred solidity(){ + return null; + } + + /** @return whether this entity can move through a location*/ + boolean canPass(int tileX, int tileY){ + SolidPred s = solidity(); + return s == null || !s.solid(tileX, tileY); + } + + /** @return whether this entity can exist on its current location*/ + boolean canPassOn(){ + return canPass(tileX(), tileY()); + } + boolean moving(){ return !vel.isZero(0.01f); } void move(float cx, float cy){ - x += cx; - y += cy; + SolidPred check = solidity(); + + if(check != null){ + collisions.move(self(), cx, cy, check); + }else{ + x += cx; + y += cy; + } } } diff --git a/core/src/mindustry/entities/comp/WaterMoveComp.java b/core/src/mindustry/entities/comp/WaterMoveComp.java index 92d3fffbf1..f87679efdb 100644 --- a/core/src/mindustry/entities/comp/WaterMoveComp.java +++ b/core/src/mindustry/entities/comp/WaterMoveComp.java @@ -4,17 +4,17 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.util.*; +import mindustry.ai.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; +import mindustry.entities.EntityCollisions.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; -import static mindustry.Vars.*; - //just a proof of concept @Component abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ @@ -38,16 +38,8 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ @Override @Replace - public void lookAt(float angle){ - if(onLiquid()){ - rotation = Angles.moveToward(rotation, angle, type.rotateSpeed * Time.delta); - } - } - - @Override - @Replace - public boolean canShoot(){ - return onLiquid(); + public int pathType(){ + return Pathfinder.costWater; } @Override @@ -74,19 +66,8 @@ abstract class WaterMoveComp implements Posc, Velc, Hitboxc, Flyingc, Unitc{ @Replace @Override - public void move(float cx, float cy){ - if(isGrounded()){ - collisions.moveCheck(this, cx, cy, EntityCollisions::waterSolid); - }else{ - x += cx; - y += cy; - } - } - - @Replace - @Override - public boolean canDrown(){ - return false; + public SolidPred solidity(){ + return isFlying() ? null : EntityCollisions::waterSolid; } @Replace diff --git a/core/src/mindustry/entities/comp/WeaponsComp.java b/core/src/mindustry/entities/comp/WeaponsComp.java index 5665bee7db..d826ba555f 100644 --- a/core/src/mindustry/entities/comp/WeaponsComp.java +++ b/core/src/mindustry/entities/comp/WeaponsComp.java @@ -13,12 +13,11 @@ import mindustry.type.*; import static mindustry.Vars.*; @Component -abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ +abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc, Statusc{ @Import float x, y, rotation, reloadMultiplier; @Import Vec2 vel; + @Import UnitType type; - /** minimum cursor distance from unit, fixes 'cross-eyed' shooting */ - static final float minAimDst = 18f; /** temporary weapon sequence number */ static int sequenceNum = 0; @@ -29,6 +28,10 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ boolean isShooting; float ammo; + float ammof(){ + return ammo / type.ammoCapacity; + } + void setWeaponRotation(float rotation){ for(WeaponMount mount : mounts){ mount.rotation = rotation; @@ -62,7 +65,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ /** Aim at something. This will make all mounts point at it. */ void aim(float x, float y){ Tmp.v1.set(x, y).sub(this.x, this.y); - if(Tmp.v1.len() < minAimDst) Tmp.v1.setLength(minAimDst); + if(Tmp.v1.len() < type.aimDst) Tmp.v1.setLength(type.aimDst); x = Tmp.v1.x + this.x; y = Tmp.v1.y + this.y; @@ -80,6 +83,16 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ return true; } + @Override + public void remove(){ + for(WeaponMount mount : mounts){ + if(mount.bullet != null){ + mount.bullet.time = mount.bullet.lifetime - 10f; + mount.bullet = null; + } + } + } + /** Update shooting and rotation for this unit. */ @Override public void update(){ @@ -89,6 +102,27 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ Weapon weapon = mount.weapon; mount.reload = Math.max(mount.reload - Time.delta * reloadMultiplier, 0); + float weaponRotation = this.rotation - 90 + (weapon.rotate ? mount.rotation : 0); + float mountX = this.x + Angles.trnsx(this.rotation - 90, weapon.x, weapon.y), + mountY = this.y + Angles.trnsy(this.rotation - 90, weapon.x, weapon.y); + float shootX = mountX + Angles.trnsx(weaponRotation, weapon.shootX, weapon.shootY), + shootY = mountY + Angles.trnsy(weaponRotation, weapon.shootX, weapon.shootY); + float shootAngle = weapon.rotate ? weaponRotation + 90 : Angles.angle(shootX, shootY, mount.aimX, mount.aimY) + (this.rotation - angleTo(mount.aimX, mount.aimY)); + + //update continuous state + if(weapon.continuous && mount.bullet != null){ + if(!mount.bullet.isAdded() || mount.bullet.time >= mount.bullet.lifetime){ + mount.bullet = null; + }else{ + mount.bullet.rotation(weaponRotation + 90); + mount.bullet.set(shootX, shootY); + vel.add(Tmp.v1.trns(rotation + 180f, mount.bullet.type.recoil)); + } + }else{ + //heat decreases when not firing + mount.heat = Math.max(mount.heat - Time.delta * reloadMultiplier / mount.weapon.cooldownTime, 0); + } + //flip weapon shoot side for alternating weapons at half reload if(weapon.otherSide != -1 && weapon.alternate && mount.side == weapon.flipSprite && mount.reload + Time.delta > weapon.reload/2f && mount.reload <= weapon.reload/2f){ @@ -98,10 +132,10 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ //rotate if applicable if(weapon.rotate && (mount.rotate || mount.shoot) && can){ - float axisX = this.x + Angles.trnsx(rotation - 90, weapon.x, weapon.y), - axisY = this.y + Angles.trnsy(rotation - 90, weapon.x, weapon.y); + float axisX = this.x + Angles.trnsx(this.rotation - 90, weapon.x, weapon.y), + axisY = this.y + Angles.trnsy(this.rotation - 90, weapon.x, weapon.y); - mount.targetRotation = Angles.angle(axisX, axisY, mount.aimX, mount.aimY) - rotation; + mount.targetRotation = Angles.angle(axisX, axisY, mount.aimX, mount.aimY) - this.rotation; mount.rotation = Angles.moveToward(mount.rotation, mount.targetRotation, weapon.rotateSpeed * Time.delta); }else if(!weapon.rotate){ mount.rotation = 0; @@ -118,19 +152,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ mount.reload <= 0.0001f && //reload has to be 0 Angles.within(weapon.rotate ? mount.rotation : this.rotation, mount.targetRotation, mount.weapon.shootCone) //has to be within the cone ){ - - float rotation = this.rotation - 90; - float weaponRotation = rotation + (weapon.rotate ? mount.rotation : 0); - - //m a t h - - float mountX = this.x + Angles.trnsx(rotation, weapon.x, weapon.y), - mountY = this.y + Angles.trnsy(rotation, weapon.x, weapon.y); - float shootX = mountX + Angles.trnsx(weaponRotation, weapon.shootX, weapon.shootY), - shootY = mountY + Angles.trnsy(weaponRotation, weapon.shootX, weapon.shootY); - float shootAngle = weapon.rotate ? weaponRotation + 90 : Angles.angle(shootX, shootY, mount.aimX, mount.aimY) + (this.rotation - angleTo(mount.aimX, mount.aimY)); - - shoot(weapon, shootX, shootY, mount.aimX, mount.aimY, shootAngle, Mathf.sign(weapon.x)); + shoot(mount, shootX, shootY, mount.aimX, mount.aimY, shootAngle, Mathf.sign(weapon.x)); mount.reload = weapon.reload; @@ -140,7 +162,8 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ } } - private void shoot(Weapon weapon, float x, float y, float aimX, float aimY, float rotation, int side){ + private void shoot(WeaponMount mount, float x, float y, float aimX, float aimY, float rotation, int side){ + Weapon weapon = mount.weapon; float baseX = this.x, baseY = this.y; @@ -150,27 +173,46 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc, Velc{ float lifeScl = ammo.scaleVelocity ? Mathf.clamp(Mathf.dst(x, y, aimX, aimY) / ammo.range()) : 1f; sequenceNum = 0; - if(weapon.shotDelay > 0.01f){ + if(weapon.shotDelay + weapon.firstShotDelay > 0.01f){ Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> { - Time.run(sequenceNum * weapon.shotDelay, () -> bullet(weapon, x + this.x - baseX, y + this.y - baseY, f + Mathf.range(weapon.inaccuracy), lifeScl)); + Time.run(sequenceNum * weapon.shotDelay + weapon.firstShotDelay, () -> { + if(!isAdded()) return; + mount.bullet = bullet(weapon, x + this.x - baseX, y + this.y - baseY, f + Mathf.range(weapon.inaccuracy), lifeScl); + }); sequenceNum++; }); }else{ - Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> bullet(weapon, x, y, f + Mathf.range(weapon.inaccuracy), lifeScl)); + Angles.shotgun(weapon.shots, weapon.spacing, rotation, f -> mount.bullet = bullet(weapon, x, y, f + Mathf.range(weapon.inaccuracy), lifeScl)); } - if(this instanceof Velc){ - ((Velc)this).vel().add(Tmp.v1.trns(rotation + 180f, ammo.recoil)); - } boolean parentize = ammo.keepVelocity; - Effect.shake(weapon.shake, weapon.shake, x, y); + if(weapon.firstShotDelay > 0){ + Time.run(weapon.firstShotDelay, () -> { + if(!isAdded()) return; + + vel.add(Tmp.v1.trns(rotation + 180f, ammo.recoil)); + Effect.shake(weapon.shake, weapon.shake, x, y); + mount.heat = 1f; + }); + }else{ + vel.add(Tmp.v1.trns(rotation + 180f, ammo.recoil)); + Effect.shake(weapon.shake, weapon.shake, x, y); + mount.heat = 1f; + } + weapon.ejectEffect.at(x, y, rotation * side); ammo.shootEffect.at(x, y, rotation, parentize ? this : null); ammo.smokeEffect.at(x, y, rotation, parentize ? this : null); + apply(weapon.shootStatus, weapon.shootStatusDuration); } - private void bullet(Weapon weapon, float x, float y, float angle, float lifescl){ - weapon.bullet.create(this, team(), x, y, angle, (1f - weapon.velocityRnd) + Mathf.random(weapon.velocityRnd), lifescl); + private Bullet bullet(Weapon weapon, float x, float y, float angle, float lifescl){ + float xr = Mathf.range(weapon.xRand); + + return weapon.bullet.create(this, team(), + x + Angles.trnsx(angle, 0, xr), + y + Angles.trnsy(angle, 0, xr), + angle, (1f - weapon.velocityRnd) + Mathf.random(weapon.velocityRnd), lifescl); } } diff --git a/core/src/mindustry/entities/units/AIController.java b/core/src/mindustry/entities/units/AIController.java index aa95959e60..03d9daf8b4 100644 --- a/core/src/mindustry/entities/units/AIController.java +++ b/core/src/mindustry/entities/units/AIController.java @@ -16,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); @@ -27,10 +29,12 @@ public class AIController implements UnitController{ { timer.reset(0, Mathf.random(40f)); + timer.reset(1, Mathf.random(60f)); } @Override public void updateUnit(){ + updateVisuals(); updateTargeting(); updateMovement(); } @@ -39,13 +43,23 @@ public class AIController implements UnitController{ 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(); } } @@ -138,7 +152,7 @@ public class AIController implements UnitController{ vec.rotate((circleLength - vec.len()) / circleLength * 180f); } - vec.setLength(speed * Time.delta); + vec.setLength(speed); unit.moveAt(vec); } @@ -150,7 +164,7 @@ public class AIController implements UnitController{ float length = circleLength <= 0.001f ? 1f : Mathf.clamp((unit.dst(target) - circleLength) / 100f, -1f, 1f); - vec.setLength(unit.type().speed * Time.delta * length); + vec.setLength(unit.type().speed * length); if(length < -0.5f){ vec.rotate(180f); }else if(length < 0){ diff --git a/core/src/mindustry/entities/units/BuildPlan.java b/core/src/mindustry/entities/units/BuildPlan.java index 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/WeaponMount.java b/core/src/mindustry/entities/units/WeaponMount.java index 89becb6dcf..f5aa45c4ea 100644 --- a/core/src/mindustry/entities/units/WeaponMount.java +++ b/core/src/mindustry/entities/units/WeaponMount.java @@ -1,5 +1,7 @@ package mindustry.entities.units; +import arc.util.ArcAnnotate.*; +import mindustry.gen.*; import mindustry.type.*; public class WeaponMount{ @@ -11,6 +13,8 @@ public class WeaponMount{ public float rotation; /** destination rotation; do not modify! */ public float targetRotation; + /** current heat, 0 to 1*/ + public float heat; /** aiming position in world coordinates */ public float aimX, aimY; /** whether to shoot right now */ @@ -19,6 +23,8 @@ public class WeaponMount{ public boolean rotate = false; /** extra state for alternating weapons */ public boolean side; + /** current bullet for continuous weapons */ + public @Nullable Bullet bullet; public WeaponMount(Weapon weapon){ this.weapon = weapon; diff --git a/core/src/mindustry/game/DefaultWaves.java b/core/src/mindustry/game/DefaultWaves.java index 6abdc46eb5..a889f9d4ba 100644 --- a/core/src/mindustry/game/DefaultWaves.java +++ b/core/src/mindustry/game/DefaultWaves.java @@ -1,47 +1,51 @@ package mindustry.game; -import arc.struct.Seq; +import arc.math.*; +import arc.struct.*; +import arc.util.*; import mindustry.content.*; -import mindustry.type.ItemStack; +import mindustry.type.*; + +import static mindustry.content.UnitTypes.*; public class DefaultWaves{ private Seq spawns; public Seq get(){ - if(spawns == null && UnitTypes.dagger != null){ + if(spawns == null && dagger != null){ spawns = Seq.with( - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(dagger){{ end = 10; unitScaling = 2f; }}, - new SpawnGroup(UnitTypes.crawler){{ + new SpawnGroup(crawler){{ begin = 4; end = 13; unitAmount = 2; unitScaling = 1.5f; }}, - new SpawnGroup(UnitTypes.flare){{ + new SpawnGroup(flare){{ begin = 12; end = 16; unitScaling = 1f; }}, - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(dagger){{ begin = 11; unitScaling = 1.7f; spacing = 2; max = 4; }}, - new SpawnGroup(UnitTypes.pulsar){{ + new SpawnGroup(pulsar){{ begin = 13; spacing = 3; unitScaling = 0.5f; }}, - new SpawnGroup(UnitTypes.mace){{ + new SpawnGroup(mace){{ begin = 7; spacing = 3; unitScaling = 2; @@ -49,28 +53,28 @@ public class DefaultWaves{ end = 30; }}, - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(dagger){{ begin = 8; unitScaling = 1; unitAmount = 4; spacing = 2; }}, - new SpawnGroup(UnitTypes.mace){{ + new SpawnGroup(mace){{ begin = 28; spacing = 3; unitScaling = 1; end = 40; }}, - new SpawnGroup(UnitTypes.mace){{ + new SpawnGroup(mace){{ begin = 45; spacing = 3; unitScaling = 2; effect = StatusEffects.overdrive; }}, - new SpawnGroup(UnitTypes.mace){{ + new SpawnGroup(mace){{ begin = 120; spacing = 2; unitScaling = 3; @@ -78,13 +82,13 @@ public class DefaultWaves{ effect = StatusEffects.overdrive; }}, - new SpawnGroup(UnitTypes.flare){{ + new SpawnGroup(flare){{ begin = 16; unitScaling = 1; spacing = 2; }}, - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(dagger){{ begin = 82; spacing = 3; unitAmount = 4; @@ -92,7 +96,7 @@ public class DefaultWaves{ effect = StatusEffects.overdrive; }}, - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(dagger){{ begin = 41; spacing = 5; unitAmount = 1; @@ -100,7 +104,7 @@ public class DefaultWaves{ effect = StatusEffects.shielded; }}, - new SpawnGroup(UnitTypes.fortress){{ + new SpawnGroup(fortress){{ begin = 40; spacing = 5; unitAmount = 2; @@ -108,7 +112,7 @@ public class DefaultWaves{ max = 20; }}, - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(dagger){{ begin = 35; spacing = 3; unitAmount = 4; @@ -117,7 +121,7 @@ public class DefaultWaves{ end = 60; }}, - new SpawnGroup(UnitTypes.dagger){{ + new SpawnGroup(dagger){{ begin = 42; spacing = 3; unitAmount = 4; @@ -126,14 +130,14 @@ public class DefaultWaves{ end = 130; }}, - new SpawnGroup(UnitTypes.horizon){{ + new SpawnGroup(horizon){{ begin = 40; unitAmount = 2; spacing = 2; unitScaling = 2; }}, - new SpawnGroup(UnitTypes.flare){{ + new SpawnGroup(flare){{ begin = 50; unitAmount = 4; unitScaling = 3; @@ -141,7 +145,7 @@ public class DefaultWaves{ effect = StatusEffects.overdrive; }}, - new SpawnGroup(UnitTypes.zenith){{ + new SpawnGroup(zenith){{ begin = 50; unitAmount = 2; unitScaling = 3; @@ -149,42 +153,42 @@ public class DefaultWaves{ max = 16; }}, - new SpawnGroup(UnitTypes.horizon){{ + new SpawnGroup(horizon){{ begin = 53; unitAmount = 2; unitScaling = 3; spacing = 4; }}, - new SpawnGroup(UnitTypes.atrax){{ + new SpawnGroup(atrax){{ begin = 31; unitAmount = 4; unitScaling = 1; spacing = 3; }}, - new SpawnGroup(UnitTypes.vestige){{ + new SpawnGroup(scepter){{ begin = 41; unitAmount = 1; unitScaling = 1; spacing = 30; }}, - new SpawnGroup(UnitTypes.cataclyst){{ + new SpawnGroup(reign){{ begin = 81; unitAmount = 1; unitScaling = 1; spacing = 40; }}, - new SpawnGroup(UnitTypes.antumbra){{ + new SpawnGroup(antumbra){{ begin = 131; unitAmount = 1; unitScaling = 1; spacing = 40; }}, - new SpawnGroup(UnitTypes.horizon){{ + new SpawnGroup(horizon){{ begin = 90; unitAmount = 2; unitScaling = 3; @@ -194,4 +198,76 @@ public class DefaultWaves{ } return spawns == null ? new Seq<>() : spawns; } + + //TODO move elsewhere + public static Seq generate(){ + UnitType[][] species = { + {dagger, mace, fortress, scepter, reign}, + {nova, pulsar, quasar, vela, corvus}, + {crawler, atrax, spiroct, arkyid, toxopid}, + //{risso, minke, bryde, sei, omura}, //questionable choices + //{mono, poly, mega, quad, oct}, //do not attack + {flare, horizon, zenith, antumbra, eclipse} + }; + + //required progression: + //- extra periodic patterns + + Seq out = new Seq<>(); + + //max reasonable wave, after which everything gets boring + int cap = 400; + + //main sequence + float shieldStart = 30, shieldsPerWave = 12; + UnitType[] curSpecies = Structs.random(species); + int curTier = 0; + + for(int i = 0; i < cap;){ + int f = i; + int next = Mathf.random(15, 25); + + float shieldAmount = Math.max((i - shieldStart) * shieldsPerWave, 0); + + //main progression + out.add(new SpawnGroup(curSpecies[Math.min(curTier, curSpecies.length - 1)]){{ + unitAmount = f == 0 ? 1 : 10; + begin = f; + end = f + next >= cap ? never : f + next; + max = 16; + unitScaling = Mathf.random(1f, 2f); + shields = shieldAmount; + shieldScaling = shieldsPerWave; + }}); + + //extra progression that tails out, blends in + out.add(new SpawnGroup(curSpecies[Math.min(curTier, curSpecies.length - 1)]){{ + unitAmount = 6; + begin = f + next; + end = f + next + Mathf.random(8, 12); + max = 10; + unitScaling = Mathf.random(2f); + spacing = Mathf.random(2, 3); + shields = shieldAmount; + shieldScaling = shieldsPerWave; + }}); + + i += next; + if(curTier < 3 || Mathf.chance(0.2)){ + curTier ++; + } + + //do not spawn bosses + curTier = Math.min(curTier, 3); + + //small chance to switch species + if(Mathf.chance(0.2)){ + curSpecies = Structs.random(species); + } + } + + + + return out; + } } diff --git a/core/src/mindustry/game/EventType.java b/core/src/mindustry/game/EventType.java index 3dcfe0aca2..1739bb1fd1 100644 --- a/core/src/mindustry/game/EventType.java +++ b/core/src/mindustry/game/EventType.java @@ -40,7 +40,6 @@ public class EventType{ public static class WinEvent{} public static class LoseEvent{} - public static class LaunchEvent{} public static class ResizeEvent{} public static class MapMakeEvent{} public static class MapPublishEvent{} @@ -82,7 +81,6 @@ public class EventType{ } } - public static class CommandIssueEvent{ public final Building tile; public final UnitCommand command; @@ -171,11 +169,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; } } @@ -226,12 +223,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; } } @@ -271,6 +270,14 @@ public class EventType{ } } + public static class UnitDrownEvent{ + public final Unit unit; + + public UnitDrownEvent(Unit unit){ + this.unit = unit; + } + } + public static class UnitCreateEvent{ public final Unit unit; diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index d3502845fc..ac302a9754 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -38,6 +38,12 @@ public class Rules{ public boolean canGameOver = true; /** Whether reactors can explode and damage other blocks. */ public boolean reactorExplosions = true; + /** Whether schematics are allowed */ + public boolean schematicsAllowed = true; + /** Whether friendly explosions can occur and set fire/damage other blocks. */ + public boolean damageExplosions = true; + /** Whether fire is enabled. */ + public boolean fire = true; /** Whether units use and require ammo. */ public boolean unitAmmo = false; /** How fast unit pads build units. */ @@ -62,8 +68,6 @@ public class Rules{ public float dropZoneRadius = 300f; /** Time between waves in ticks. */ public float waveSpacing = 60 * 60 * 2; - /** How many times longer a launch wave takes. */ - public float launchWaveMultiplier = 2f; /** Wave after which the player 'wins'. Used in sectors. Use a value <= 0 to disable. */ public int winWave = 0; /** Base unit cap. Can still be increased by blocks. */ @@ -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/Saves.java b/core/src/mindustry/game/Saves.java index 501eaf2c3c..0f7908aa63 100644 --- a/core/src/mindustry/game/Saves.java +++ b/core/src/mindustry/game/Saves.java @@ -61,6 +61,9 @@ public class Saves{ //automatically assign sector save slots for(SaveSlot slot : saves){ if(slot.getSector() != null){ + if(slot.getSector().save != null){ + Log.warn("Sector @ has two corresponding saves: @ and @", slot.getSector(), slot.getSector().save.file, slot.file); + } slot.getSector().save = slot; } } @@ -75,7 +78,6 @@ public class Saves{ } public void update(){ - SaveSlot current = this.current; if(current != null && state.isGame() && !(state.isPaused() && Core.scene.hasDialog())){ @@ -90,14 +92,13 @@ public class Saves{ if(time > Core.settings.getInt("saveinterval") * 60){ saving = true; - Time.runTask(2f, () -> { - try{ - current.save(); - }catch(Throwable e){ - e.printStackTrace(); - } - saving = false; - }); + try{ + current.save(); + }catch(Throwable e){ + e.printStackTrace(); + } + + Time.runTask(3f, () -> saving = false); time = 0; } @@ -128,6 +129,7 @@ public class Saves{ sector.save.setName(sector.save.file.nameWithoutExtension()); saves.add(sector.save); } + sector.save.setAutosave(true); sector.save.save(); lastSectorSave = sector.save; Core.settings.put("last-sector-save", sector.save.getName()); diff --git a/core/src/mindustry/game/Schematic.java b/core/src/mindustry/game/Schematic.java index 01088826bb..5ad51382f2 100644 --- a/core/src/mindustry/game/Schematic.java +++ b/core/src/mindustry/game/Schematic.java @@ -2,9 +2,7 @@ package mindustry.game; import arc.files.*; import arc.struct.*; -import arc.struct.IntIntMap.*; import arc.util.ArcAnnotate.*; -import mindustry.*; import mindustry.content.*; import mindustry.mod.Mods.*; import mindustry.type.*; @@ -12,7 +10,6 @@ import mindustry.world.*; import mindustry.world.blocks.power.*; import mindustry.world.blocks.storage.*; import mindustry.world.consumers.*; -import mindustry.world.meta.*; import static mindustry.Vars.*; @@ -39,22 +36,16 @@ public class Schematic implements Publishable, Comparable{ return tiles.sumf(s -> s.block.consumes.has(ConsumeType.power) ? s.block.consumes.getPower().usage : 0f); } - public Seq requirements(){ - IntIntMap amounts = new IntIntMap(); + public ItemSeq requirements(){ + ItemSeq requirements = new ItemSeq(); tiles.each(t -> { - if(t.block.buildVisibility == BuildVisibility.hidden) return; - for(ItemStack stack : t.block.requirements){ - amounts.increment(stack.item.id, stack.amount); + requirements.add(stack.item, stack.amount); } }); - Seq stacks = new Seq<>(); - for(Entry ent : amounts.entries()){ - stacks.add(new ItemStack(Vars.content.item(ent.key), ent.value)); - } - stacks.sort(); - return stacks; + + return requirements; } public boolean hasCore(){ 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/SectorInfo.java b/core/src/mindustry/game/SectorInfo.java index 7b585890c3..29e75b3e57 100644 --- a/core/src/mindustry/game/SectorInfo.java +++ b/core/src/mindustry/game/SectorInfo.java @@ -2,9 +2,10 @@ package mindustry.game; import arc.math.*; import arc.struct.*; -import arc.util.*; import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.content.*; +import mindustry.ctype.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.storage.CoreBlock.*; @@ -32,6 +33,10 @@ public class SectorInfo{ public boolean hasCore = true; /** Sector that was launched from. */ public @Nullable Sector origin; + /** Launch destination. */ + public @Nullable Sector destination; + /** Resources known to occur at this sector. */ + public Seq resources = new Seq<>(); /** Time spent at this sector. Do not use unless you know what you're doing. */ public transient float internalTimeSpent; @@ -40,6 +45,12 @@ public class SectorInfo{ /** Core item storage to prevent spoofing. */ private transient int[] lastCoreItems; + /** @return the real location items go when launched on this sector */ + public Sector getRealDestination(){ + //on multiplayer the destination is, by default, the first captured sector (basically random) + return !net.client() || destination != null ? destination : state.rules.sector.planet.sectors.find(Sector::hasBase); + } + /** Updates export statistics. */ public void handleItemExport(ItemStack stack){ handleItemExport(stack.item, stack.amount); @@ -84,12 +95,10 @@ public class SectorInfo{ /** Update averages of various stats, updates some special sector logic. * Called every frame. */ public void update(){ - internalTimeSpent += Time.delta; + //updating in multiplayer as a client doesn't make sense + if(net.client()) return; - //time spent exceeds turn duration! - if(internalTimeSpent >= turnDuration && internalTimeSpent - Time.delta < turnDuration){ - universe.displayTimeEnd(); - } + internalTimeSpent += Time.delta; //create last stored core items if(lastCoreItems == null){ diff --git a/core/src/mindustry/game/Stats.java b/core/src/mindustry/game/Stats.java index 4a03f6199e..1d175607ba 100644 --- a/core/src/mindustry/game/Stats.java +++ b/core/src/mindustry/game/Stats.java @@ -22,6 +22,7 @@ public class Stats{ /** Friendly buildings destroyed. */ public int buildingsDestroyed; + //TODO fix public RankResult calculateRank(Sector zone, boolean launched){ float score = 0; @@ -39,7 +40,7 @@ public class Stats{ //weigh used fractions float frac = 0f; - Seq obtainable = Seq.select(zone.data.resources, i -> i instanceof Item).as(); + Seq obtainable = zone.save == null ? new Seq<>() : zone.save.meta.secinfo.resources.select(i -> i instanceof Item).as(); for(Item item : obtainable){ frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size; } diff --git a/core/src/mindustry/game/Teams.java b/core/src/mindustry/game/Teams.java index 75ad0ae02f..e513c31fc6 100644 --- a/core/src/mindustry/game/Teams.java +++ b/core/src/mindustry/game/Teams.java @@ -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..b148657275 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -14,12 +14,13 @@ import static mindustry.Vars.*; /** Updates and handles state of the campaign universe. Has no relevance to other gamemodes. */ public class Universe{ - private long seconds; + private int seconds; + private int netSeconds; private float secondCounter; private int turn; private Schematic lastLoadout; - private Seq lastLaunchResources = new Seq<>(); + private ItemSeq lastLaunchResources = new ItemSeq(); public Universe(){ load(); @@ -55,23 +56,40 @@ 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() && s.getSecondsPassed() > 1); - 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(); + } } } /** Update planet rotations, global time and relevant state. */ public void update(){ - secondCounter += Time.delta / 60f; - if(secondCounter >= 1){ - seconds += (int)secondCounter; - secondCounter %= 1f; + //only update time when not in multiplayer + if(!net.client()){ + secondCounter += Time.delta / 60f; - //save every few seconds - if(seconds % 10 == 1){ - save(); + if(secondCounter >= 1){ + seconds += (int)secondCounter; + secondCounter %= 1f; + + //save every few seconds + if(seconds % 10 == 1){ + save(); + } } } @@ -86,14 +104,14 @@ public class Universe{ } } - public Seq getLaunchResources(){ - lastLaunchResources = Core.settings.getJson("launch-resources", Seq.class, ItemStack.class, Seq::new); + public ItemSeq getLaunchResources(){ + lastLaunchResources = Core.settings.getJson("launch-resources-seq", ItemSeq.class, ItemSeq::new); return lastLaunchResources; } - public void updateLaunchResources(Seq stacks){ + public void updateLaunchResources(ItemSeq stacks){ this.lastLaunchResources = stacks; - Core.settings.putJson("launch-resources", ItemStack.class, lastLaunchResources); + Core.settings.putJson("launch-resources-seq", lastLaunchResources); } /** Updates selected loadout for future deployment. */ @@ -140,17 +158,30 @@ 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)); //if so, just delete the save for now. it's lost. //TODO don't delete it later maybe sector.save.delete(); + //clear recieved + sector.setExtraItems(new ItemSeq()); sector.save = null; } } + //export to another sector + if(sector.save != null && sector.save.meta != null && sector.save.meta.secinfo != null && sector.save.meta.secinfo.destination != null){ + Sector to = sector.save.meta.secinfo.destination; + if(to.save != null){ + ItemSeq items = to.getExtraItems(); + //calculated exported items to this sector + sector.save.meta.secinfo.export.each((item, stat) -> items.add(item, (int)(stat.mean * newSecondsPassed))); + to.setExtraItems(items); + } + } + //reset time spent to 0 sector.setTimeSpent(0f); } @@ -178,25 +209,30 @@ public class Universe{ return count; } - public float secondsMod(float mod, float scale){ - return (seconds / scale) % mod; + public void updateNetSeconds(int value){ + netSeconds = value; } - public long seconds(){ - return seconds; + public float secondsMod(float mod, float scale){ + return (seconds() / scale) % mod; + } + + public int seconds(){ + //use networked seconds when playing as client + return net.client() ? netSeconds : seconds; } public float secondsf(){ - return seconds + secondCounter; + return seconds() + secondCounter; } private void save(){ - Core.settings.put("utime", seconds); + Core.settings.put("utimei", seconds); Core.settings.put("turn", turn); } private void load(){ - seconds = Core.settings.getLong("utime"); + seconds = Core.settings.getInt("utimei"); turn = Core.settings.getInt("turn"); } diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index 08b13bf9b8..c65b3cae7c 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -35,7 +35,7 @@ public class BlockRenderer implements Disposable{ private FrameBuffer dark = new FrameBuffer(); private Seq outArray2 = new Seq<>(); private Seq shadowEvents = new Seq<>(); - private IntSet processedEntities = new IntSet(); + private IntSet processedEntities = new IntSet(), processedLinks = new IntSet(); private boolean displayStatus = false; public BlockRenderer(){ @@ -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); @@ -180,6 +180,7 @@ public class BlockRenderer implements Disposable{ tileview.clear(); lightview.clear(); processedEntities.clear(); + processedLinks.clear(); int minx = Math.max(avgx - rangex - expandr, 0); int miny = Math.max(avgy - rangey - expandr, 0); @@ -192,12 +193,19 @@ public class BlockRenderer implements Disposable{ Tile tile = world.rawTile(x, y); Block block = tile.block(); //link to center - if(tile.build != null) tile = tile.build.tile(); + if(tile.build != null){ + tile = tile.build.tile; + } - if(block != Blocks.air && block.cacheLayer == CacheLayer.normal && (tile.build == null || !processedEntities.contains(tile.build.id()))){ + if(block != Blocks.air && block.cacheLayer == CacheLayer.normal && (tile.build == null || !processedEntities.contains(tile.build.id))){ if(block.expanded || !expanded){ - tileview.add(tile); - if(tile.build != null) processedEntities.add(tile.build.id()); + if(tile.build == null || processedLinks.add(tile.build.id)){ + tileview.add(tile); + if(tile.build != null){ + processedEntities.add(tile.build.id); + processedLinks.add(tile.build.id); + } + } } //lights are drawn even in the expanded range @@ -207,8 +215,8 @@ public class BlockRenderer implements Disposable{ if(tile.build != null && tile.build.power != null && tile.build.power.links.size > 0){ for(Building other : tile.build.getPowerConnections(outArray2)){ - if(other.block() instanceof PowerNode){ //TODO need a generic way to render connections! - tileview.add(other.tile()); + if(other.block instanceof PowerNode && processedLinks.add(other.id)){ //TODO need a generic way to render connections! + tileview.add(other.tile); } } } diff --git a/core/src/mindustry/graphics/CacheLayer.java b/core/src/mindustry/graphics/CacheLayer.java index 00bd578dc4..c3eed64feb 100644 --- a/core/src/mindustry/graphics/CacheLayer.java +++ b/core/src/mindustry/graphics/CacheLayer.java @@ -18,6 +18,17 @@ public enum CacheLayer{ endShader(Shaders.water); } }, + mud{ + @Override + public void begin(){ + beginShader(); + } + + @Override + public void end(){ + endShader(Shaders.mud); + } + }, tar{ @Override public void begin(){ @@ -41,7 +52,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..685110047a 100644 --- a/core/src/mindustry/graphics/Drawf.java +++ b/core/src/mindustry/graphics/Drawf.java @@ -84,6 +84,18 @@ public class Drawf{ Draw.color(); } + public static void shadow(TextureRegion region, float x, float y, float rotation){ + Draw.color(Pal.shadow); + Draw.rect(region, x, y, rotation); + Draw.color(); + } + + public static void shadow(TextureRegion region, float x, float y){ + Draw.color(Pal.shadow); + Draw.rect(region, x, y); + Draw.color(); + } + public static void dashCircle(float x, float y, float rad, Color color){ Lines.stroke(3f, Pal.gray); Lines.dashCircle(x, y, rad); @@ -150,15 +162,14 @@ public class Drawf{ } public static void laser(Team team, TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2, float rotation, float scale){ - Tmp.v1.trns(rotation, 8f * scale * Draw.scl); + float scl = 8f * scale * Draw.scl; + float vx = Mathf.cosDeg(rotation) * scl, vy = Mathf.sinDeg(rotation) * scl; - Draw.rect(edge, x, y, edge.getWidth() * scale * Draw.scl, edge.getHeight() * scale * Draw.scl, rotation + 180); - Draw.rect(edge, x2, y2, edge.getWidth() * scale * Draw.scl, edge.getHeight() * scale * Draw.scl, rotation); + Draw.rect(edge, x, y, edge.width * scale * Draw.scl, edge.height * scale * Draw.scl, rotation + 180); + Draw.rect(edge, x2, y2, edge.width * scale * Draw.scl, edge.height * scale * Draw.scl, rotation); Lines.stroke(12f * scale); - Lines.precise(true); - Lines.line(line, x + Tmp.v1.x, y + Tmp.v1.y, x2 - Tmp.v1.x, y2 - Tmp.v1.y, false, 0f); - Lines.precise(false); + Lines.line(line, x + vx, y + vy, x2 - vx, y2 - vy, false); Lines.stroke(1f); light(team, x, y, x2, y2); @@ -173,6 +184,20 @@ public class Drawf{ construct(t, content.icon(Cicon.full), rotation, progress, speed, time); } + public static void construct(float x, float y, TextureRegion region, float rotation, float progress, float speed, float time){ + Shaders.build.region = region; + Shaders.build.progress = progress; + Shaders.build.color.set(Pal.accent); + Shaders.build.color.a = speed; + Shaders.build.time = -time / 20f; + + Draw.shader(Shaders.build); + Draw.rect(region, x, y, rotation); + Draw.shader(); + + Draw.reset(); + } + public static void construct(Building t, TextureRegion region, float rotation, float progress, float speed, float time){ Shaders.build.region = region; Shaders.build.progress = progress; @@ -187,7 +212,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..4030125ebb 100644 --- a/core/src/mindustry/graphics/FloorRenderer.java +++ b/core/src/mindustry/graphics/FloorRenderer.java @@ -20,7 +20,7 @@ public class FloorRenderer implements Disposable{ //TODO find out number with best performance private static final int chunksize = mobile ? 16 : 32; - private Chunk[][] cache; + private int[][][] cache; private MultiCacheBatch cbatch; private IntSet drawnLayerSet = new IntSet(); private IntSet recacheSet = new IntSet(); @@ -63,11 +63,11 @@ public class FloorRenderer implements Disposable{ if(!Structs.inBounds(worldx, worldy, cache)) continue; - Chunk chunk = cache[worldx][worldy]; + int[] chunk = cache[worldx][worldy]; //loop through all layers, and add layer index if it exists for(int i = 0; i < layers; i++){ - if(chunk.caches[i] != -1 && i != CacheLayer.walls.ordinal()){ + if(chunk[i] != -1 && i != CacheLayer.walls.ordinal()){ drawnLayerSet.add(i); } } @@ -154,9 +154,9 @@ public class FloorRenderer implements Disposable{ continue; } - Chunk chunk = cache[worldx][worldy]; - if(chunk.caches[layer.ordinal()] == -1) continue; - cbatch.drawCache(chunk.caches[layer.ordinal()]); + int[] chunk = cache[worldx][worldy]; + if(chunk[layer.ordinal()] == -1) continue; + cbatch.drawCache(chunk[layer.ordinal()]); } } @@ -165,7 +165,7 @@ public class FloorRenderer implements Disposable{ private void cacheChunk(int cx, int cy){ used.clear(); - Chunk chunk = cache[cx][cy]; + int[] chunk = cache[cx][cy]; for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize && tilex < world.width(); tilex++){ for(int tiley = cy * chunksize; tiley < (cy + 1) * chunksize && tiley < world.height(); tiley++){ @@ -184,15 +184,15 @@ public class FloorRenderer implements Disposable{ } } - private void cacheChunkLayer(int cx, int cy, Chunk chunk, CacheLayer layer){ + private void cacheChunkLayer(int cx, int cy, int[] chunk, CacheLayer layer){ Batch current = Core.batch; Core.batch = cbatch; //begin a new cache - if(chunk.caches[layer.ordinal()] == -1){ + if(chunk[layer.ordinal()] == -1){ cbatch.beginCache(); }else{ - cbatch.beginCache(chunk.caches[layer.ordinal()]); + cbatch.beginCache(chunk[layer.ordinal()]); } for(int tilex = cx * chunksize; tilex < (cx + 1) * chunksize; tilex++){ @@ -210,15 +210,15 @@ public class FloorRenderer implements Disposable{ tile.block().drawBase(tile); }else if(floor.cacheLayer == layer && (world.isAccessible(tile.x, tile.y) || tile.block().cacheLayer != CacheLayer.walls || !tile.block().fillsTile)){ floor.drawBase(tile); - }else if(floor.cacheLayer.ordinal() < layer.ordinal() && layer != CacheLayer.walls){ - floor.drawNonLayer(tile); + }else if(floor.cacheLayer != layer && layer != CacheLayer.walls){ + floor.drawNonLayer(tile, layer); } } } Core.batch = current; cbatch.reserve(layer.capacity * chunksize * chunksize); - chunk.caches[layer.ordinal()] = cbatch.endCache(); + chunk[layer.ordinal()] = cbatch.endCache(); } public void clearTiles(){ @@ -227,15 +227,14 @@ public class FloorRenderer implements Disposable{ recacheSet.clear(); int chunksx = Mathf.ceil((float)(world.width()) / chunksize), chunksy = Mathf.ceil((float)(world.height()) / chunksize); - cache = new Chunk[chunksx][chunksy]; - cbatch = new MultiCacheBatch(chunksize * chunksize * 5); + cache = new int[chunksx][chunksy][CacheLayer.all.length]; + cbatch = new MultiCacheBatch(chunksize * chunksize * 9); Time.mark(); for(int x = 0; x < chunksx; x++){ for(int y = 0; y < chunksy; y++){ - cache[x][y] = new Chunk(); - Arrays.fill(cache[x][y].caches, -1); + Arrays.fill(cache[x][y], -1); cacheChunk(x, y); } @@ -251,13 +250,4 @@ public class FloorRenderer implements Disposable{ cbatch = null; } } - - private static class Chunk{ - /** Maps cache layer ID to cache ID in the batch. - * -1 means that this cache is unoccupied. */ - int[] caches = new int[CacheLayer.all.length]; - - Chunk(){ - } - } } diff --git a/core/src/mindustry/graphics/IndexedRenderer.java b/core/src/mindustry/graphics/IndexedRenderer.java index 83067c1f96..154147da14 100644 --- a/core/src/mindustry/graphics/IndexedRenderer.java +++ b/core/src/mindustry/graphics/IndexedRenderer.java @@ -11,7 +11,7 @@ import arc.util.*; public class IndexedRenderer implements Disposable{ private static final int vsize = 5; - private Shader program = new Shader( + private final Shader program = new Shader( "attribute vec4 a_position;\n" + "attribute vec4 a_color;\n" + "attribute vec2 a_texCoord0;\n" + @@ -68,10 +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; @@ -96,32 +96,32 @@ public class IndexedRenderer implements Disposable{ vertices[idx++] = v2; //tri2 - vertices[idx++] = x; - vertices[idx++] = y; - vertices[idx++] = color; - vertices[idx++] = u; - vertices[idx++] = v; - - vertices[idx++] = fx2; - vertices[idx++] = y; - vertices[idx++] = color; - vertices[idx++] = u2; - vertices[idx++] = v; - vertices[idx++] = fx2; vertices[idx++] = fy2; vertices[idx++] = color; vertices[idx++] = u2; vertices[idx++] = v2; + vertices[idx++] = fx2; + vertices[idx++] = y; + vertices[idx++] = color; + vertices[idx++] = u2; + vertices[idx++] = v; + + vertices[idx++] = x; + vertices[idx++] = y; + vertices[idx++] = color; + vertices[idx++] = u; + vertices[idx++] = v; + mesh.updateVertices(index * vsize * 6, vertices); } public void draw(int index, TextureRegion region, float x, float y, float w, float h, float rotation){ - float u = region.getU(); - float v = region.getV2(); - float u2 = region.getU2(); - float v2 = region.getV(); + float u = region.u; + float v = region.v2; + float u2 = region.u2; + float v2 = region.v; float originX = w / 2, originY = h / 2; @@ -155,6 +155,19 @@ public class IndexedRenderer implements Disposable{ vertices[idx++] = u; vertices[idx++] = v; + vertices[idx++] = x2; + vertices[idx++] = y2; + vertices[idx++] = color; + vertices[idx++] = u; + vertices[idx++] = v2; + + vertices[idx++] = x3; + vertices[idx++] = y3; + vertices[idx++] = color; + vertices[idx++] = u2; + vertices[idx++] = v2; + + //tri2 vertices[idx++] = x3; vertices[idx++] = y3; vertices[idx++] = color; @@ -164,28 +177,15 @@ public class IndexedRenderer implements Disposable{ vertices[idx++] = x4; vertices[idx++] = y4; vertices[idx++] = color; - vertices[idx++] = u; - vertices[idx++] = v2; + vertices[idx++] = u2; + vertices[idx++] = v; - //tri2 vertices[idx++] = x1; vertices[idx++] = y1; vertices[idx++] = color; vertices[idx++] = u; vertices[idx++] = v; - vertices[idx++] = x2; - vertices[idx++] = y2; - vertices[idx++] = color; - vertices[idx++] = u2; - vertices[idx++] = v; - - vertices[idx++] = x3; - vertices[idx++] = y3; - vertices[idx++] = color; - vertices[idx++] = u2; - vertices[idx++] = v2; - mesh.updateVertices(index * vsize * 6, vertices); } diff --git a/core/src/mindustry/graphics/LightRenderer.java b/core/src/mindustry/graphics/LightRenderer.java index 63cd3f2783..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..f9803b9db8 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(){ @@ -118,8 +122,8 @@ public class MinimapRenderer implements Disposable{ float dy = (Core.camera.position.y / tilesize); dx = Mathf.clamp(dx, sz, world.width() - sz); dy = Mathf.clamp(dy, sz, world.height() - sz); - float invTexWidth = 1f / texture.getWidth(); - float invTexHeight = 1f / texture.getHeight(); + float invTexWidth = 1f / texture.width; + float invTexHeight = 1f / texture.height; float x = dx - sz, y = world.height() - dy - sz, width = sz * 2, height = sz * 2; region.set(x * invTexWidth, y * invTexHeight, (x + width) * invTexWidth, (y + height) * invTexHeight); return region; diff --git a/core/src/mindustry/graphics/OverlayRenderer.java b/core/src/mindustry/graphics/OverlayRenderer.java index 133d8898b0..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); } @@ -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..a61b363557 100644 --- a/core/src/mindustry/graphics/Pal.java +++ b/core/src/mindustry/graphics/Pal.java @@ -3,12 +3,14 @@ package mindustry.graphics; import arc.graphics.Color; public class Pal{ - public static final Color + public static Color items = Color.valueOf("2ea756"), command = Color.valueOf("eab678"), sap = Color.valueOf("665c9f"), + sapBullet = Color.valueOf("bf92f9"), + sapBulletBack = Color.valueOf("6d56bf"), spore = Color.valueOf("7457ce"), @@ -44,6 +46,8 @@ public class Pal{ lightishGray = Color.valueOf("a2a2a2"), darkishGray = new Color(0.3f, 0.3f, 0.3f, 1f), darkerGray = new Color(0.2f, 0.2f, 0.2f, 1f), + darkestGray = new Color(0.1f, 0.1f, 0.1f, 1f), + shadow = new Color(0, 0, 0, 0.22f), ammo = Color.valueOf("ff8947"), rubble = Color.valueOf("1c1817"), diff --git a/core/src/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java index 884f70b84e..5fed02b762 100644 --- a/core/src/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -20,7 +20,7 @@ public class Shaders{ public static UnitBuild build; public static DarknessShader darkness; public static LightShader light; - public static SurfaceShader water, tar, slag; + public static SurfaceShader water, mud, tar, slag; public static PlanetShader planet; public static PlanetGridShader planetGrid; public static AtmosphereShader atmosphere; @@ -42,6 +42,7 @@ public class Shaders{ darkness = new DarknessShader(); light = new LightShader(); water = new SurfaceShader("water"); + mud = new SurfaceShader("mud"); tar = new SurfaceShader("tar"); slag = new SurfaceShader("slag"); planet = new PlanetShader(); @@ -152,9 +153,9 @@ public class Shaders{ setUniformf("u_time", time); setUniformf("u_color", color); setUniformf("u_progress", progress); - setUniformf("u_uv", region.getU(), region.getV()); - setUniformf("u_uv2", region.getU2(), region.getV2()); - setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); + setUniformf("u_uv", region.u, region.v); + setUniformf("u_uv2", region.u2, region.v2); + setUniformf("u_texsize", region.texture.width, region.texture.height); } } @@ -171,10 +172,10 @@ public class Shaders{ public void apply(){ setUniformf("u_progress", progress); setUniformf("u_color", color); - setUniformf("u_uv", region.getU(), region.getV()); - setUniformf("u_uv2", region.getU2(), region.getV2()); + setUniformf("u_uv", region.u, region.v); + setUniformf("u_uv2", region.u2, region.v2); setUniformf("u_time", Time.time()); - setUniformf("u_texsize", region.getTexture().getWidth(), region.getTexture().getHeight()); + setUniformf("u_texsize", region.texture.width, region.texture.height); } } diff --git a/core/src/mindustry/graphics/g3d/MeshBuilder.java b/core/src/mindustry/graphics/g3d/MeshBuilder.java index 2342c469c6..dc26cec9f5 100644 --- a/core/src/mindustry/graphics/g3d/MeshBuilder.java +++ b/core/src/mindustry/graphics/g3d/MeshBuilder.java @@ -4,11 +4,10 @@ import arc.graphics.*; import arc.graphics.VertexAttributes.*; import arc.graphics.gl.*; import arc.math.geom.*; -import arc.util.*; import mindustry.graphics.g3d.PlanetGrid.*; public class MeshBuilder{ - private static final Vec3 v1 = new Vec3(), v2 = new Vec3(), v3 = new Vec3(); + private static final Vec3 v1 = new Vec3(), v2 = new Vec3(), v3 = new Vec3(), v4 = new Vec3(); private static final float[] floats = new float[3 + 3 + 1]; private static Mesh mesh; @@ -111,7 +110,7 @@ public class MeshBuilder{ } private static Vec3 normal(Vec3 v1, Vec3 v2, Vec3 v3){ - return Tmp.v32.set(v2).sub(v1).crs(v3.x - v1.x, v3.y - v1.y, v3.z - v1.z).nor(); + return v4.set(v2).sub(v1).crs(v3.x - v1.x, v3.y - v1.y, v3.z - v1.z).nor(); } private static void verts(Vec3 a, Vec3 b, Vec3 c, Vec3 normal, Color color){ diff --git a/core/src/mindustry/graphics/g3d/PlanetRenderer.java b/core/src/mindustry/graphics/g3d/PlanetRenderer.java index 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/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 6128b2539a..88c317d29b 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -27,28 +27,29 @@ 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; - - private boolean panning = 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") && !player.dead() && !player.unit().spawnedByCore() && !(Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty())); + t.visible(() -> Core.settings.getBool("hints") && ui.hudfrag.shown() && !player.dead() && !player.unit().spawnedByCore() && !(Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty())); t.bottom(); t.table(Styles.black6, b -> { b.defaults().left(); @@ -75,13 +76,13 @@ public class DesktopInput extends InputHandler{ }); group.fill(t -> { - t.visible(() -> Core.settings.getBool("hints") && lastSchematic != null && !selectRequests.isEmpty()); + t.visible(() -> lastSchematic != null && !selectRequests.isEmpty()); t.bottom(); t.table(Styles.black6, b -> { b.defaults().left(); - b.label( () -> Core.bundle.format("schematic.flip", - Core.keybinds.get(Binding.schematic_flip_x).key.toString(), - Core.keybinds.get(Binding.schematic_flip_y).key.toString())).style(Styles.outlineLabel); + b.label(() -> Core.bundle.format("schematic.flip", + Core.keybinds.get(Binding.schematic_flip_x).key.toString(), + Core.keybinds.get(Binding.schematic_flip_y).key.toString())).style(Styles.outlineLabel).visible(() -> Core.settings.getBool("hints")); b.row(); b.table(a -> { a.button("@schematic.add", Icon.save, this::showSchematicSave).colspan(2).size(250f, 50f).disabled(f -> lastSchematic == null || lastSchematic.file != null); @@ -98,10 +99,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); } @@ -181,7 +182,7 @@ public class DesktopInput extends InputHandler{ } boolean panCam = false; - float camSpeed = !Core.input.keyDown(Binding.boost) ? 3f : 8f; + float camSpeed = (!Core.input.keyDown(Binding.boost) ? panSpeed : panBoostSpeed) * Time.delta; if(input.keyDown(Binding.pan)){ panCam = true; @@ -199,14 +200,14 @@ public class DesktopInput extends InputHandler{ } panning = false; - Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(Time.delta * camSpeed)); + Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(camSpeed)); }else if(!player.dead() && !panning){ Core.camera.position.lerpDelta(player, Core.settings.getBool("smoothcamera") ? 0.08f : 1f); } if(panCam){ - 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; + 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(); @@ -224,7 +225,7 @@ public class DesktopInput extends InputHandler{ if(!player.dead() && !state.isPaused() && !(Core.scene.getKeyboardFocus() instanceof TextField)){ updateMovement(player.unit()); - if(Core.input.keyDown(Binding.respawn) && !player.unit().spawnedByCore()){ + if(Core.input.keyDown(Binding.respawn) && !player.unit().spawnedByCore() && !scene.hasField()){ Call.unitClear(player); controlledType = null; } @@ -306,7 +307,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); } } @@ -342,20 +343,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"); + ui.planet.showLaunch(state.getSector(), player.team().core()); + }).visible(() -> state.isCampaign()).tooltip("@launchcore").disabled(b -> player.team().core() == null); } void pollInput(){ @@ -392,7 +392,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; } @@ -411,12 +411,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()){ @@ -495,6 +497,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){ @@ -515,6 +519,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 @@ -522,8 +532,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); @@ -568,6 +584,8 @@ public class DesktopInput extends InputHandler{ @Override public void updateState(){ + super.updateState(); + if(state.isMenu()){ droppingItem = false; mode = none; @@ -578,7 +596,7 @@ public class DesktopInput extends InputHandler{ } protected void updateMovement(Unit unit){ - boolean omni = !(unit instanceof WaterMovec); + boolean omni = unit.type().omniMovement; boolean ground = unit.isGrounded(); float strafePenalty = ground ? 1f : Mathf.lerp(1f, unit.type().strafePenalty, Angles.angleDist(unit.vel().angle(), unit.rotation()) / 180f); @@ -587,7 +605,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 dee48a2690..bbca06d7e0 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,58 +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(); + + //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(); - //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); - } + float prevx = pay.x(), prevy = pay.y(); + pay.set(x, y); + pay.dropLastPayload(); + pay.set(prevx, prevy); } @Remote(targets = Loc.client, called = Loc.server) @@ -173,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."); @@ -185,10 +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) || tile.items == null) 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(); }))){ @@ -215,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))); } @@ -236,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); + }else if(unit.isAI() && unit.team == player.team() && !unit.dead){ + 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); @@ -268,7 +324,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ commander.clearCommand(); }else{ - commander.commandNearby(new SquareFormation()); + //TODO try out some other formations + commander.commandNearby(new CircleFormation()); Fx.commandSend.at(player); } @@ -297,12 +354,18 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ player.builder().updateBuilding(isBuilding); } + if(player.shooting && !wasShooting && player.unit().hasWeapons() && state.rules.unitAmmo && player.unit().ammo <= 0){ + player.unit().type().weapons.first().noAmmoSound.at(player.unit()); + } + + wasShooting = player.shooting; + if(!player.dead()){ controlledType = player.unit().type(); } if(controlledType != null && player.dead()){ - Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.deactivated() && !u.dead); + Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.dead); if(unit != null){ Call.unitControl(player, unit); @@ -312,7 +375,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ public void checkUnit(){ if(controlledType != null){ - Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.deactivated() && !u.dead); + Unit unit = Units.closest(player.team(), player.x, player.y, u -> !u.isPlayer() && u.type() == controlledType && !u.dead); if(unit == null && controlledType == UnitTypes.block){ unit = world.buildWorld(player.x, player.y) instanceof ControlBlock ? ((ControlBlock)world.buildWorld(player.x, player.y)).unit() : null; } @@ -332,16 +395,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); } } } @@ -349,10 +410,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(){ @@ -372,7 +431,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public void updateState(){ - + if(state.isMenu()){ + controlledType = null; + } } public void drawBottom(){ @@ -383,6 +444,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); } @@ -397,7 +462,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){ @@ -541,7 +606,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ 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); @@ -588,6 +653,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); @@ -634,13 +703,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. */ @@ -655,8 +717,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++){ @@ -709,7 +781,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); }); @@ -738,7 +810,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 @@ -765,10 +837,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; @@ -859,7 +931,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public @Nullable Unit selectedUnit(){ - Unit unit = Units.closest(player.team(), Core.input.mouseWorld().x, Core.input.mouseWorld().y, 40f, u -> u.isAI() && !u.deactivated()); + Unit unit = Units.closest(player.team(), Core.input.mouseWorld().x, Core.input.mouseWorld().y, 40f, u -> u.isAI()); if(unit != null){ unit.hitbox(Tmp.r1); Tmp.r1.grow(6f); @@ -909,6 +981,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ uiGroup.touchable = Touchable.childrenOnly; uiGroup.setFillParent(true); ui.hudGroup.addChild(uiGroup); + uiGroup.toBack(); buildUI(uiGroup); frag.add(); @@ -938,7 +1011,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)); @@ -982,13 +1055,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)); } @@ -1004,15 +1076,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 24be7b1440..03d90e18be 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 @@ -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)); @@ -797,7 +804,7 @@ public class MobileInput extends InputHandler implements GestureListener{ if(type == null) return; boolean flying = type.flying; - boolean omni = !(unit instanceof WaterMovec); + boolean omni = unit.type().omniMovement; boolean legs = unit.isGrounded(); boolean allowHealing = type.canHeal; boolean validHealTarget = allowHealing && target instanceof Building && ((Building)target).isValid() && target.team() == unit.team && diff --git a/core/src/mindustry/io/JsonIO.java b/core/src/mindustry/io/JsonIO.java index a8995103d0..e6ea20cf9e 100644 --- a/core/src/mindustry/io/JsonIO.java +++ b/core/src/mindustry/io/JsonIO.java @@ -100,6 +100,20 @@ public class JsonIO{ } }); + json.setSerializer(Liquid.class, new Serializer(){ + @Override + public void write(Json json, Liquid object, Class knownType){ + json.writeValue(object.name); + } + + @Override + public Liquid read(Json json, JsonValue jsonData, Class type){ + if(jsonData.asString() == null) return Liquids.water; + Liquid i = Vars.content.getByName(ContentType.liquid, jsonData.asString()); + return i == null ? Liquids.water : i; + } + }); + json.setSerializer(Item.class, new Serializer(){ @Override public void write(Json json, Item object, Class knownType){ @@ -165,6 +179,21 @@ public class JsonIO{ return new ItemStack(json.getSerializer(Item.class).read(json, jsonData.get("item"), Item.class), jsonData.getInt("amount")); } }); + + json.setSerializer(UnlockableContent.class, new Serializer(){ + @Override + public void write(Json json, UnlockableContent object, Class knownType){ + json.writeValue(object.name); + } + + @Override + public UnlockableContent read(Json json, JsonValue jsonData, Class type){ + String str = jsonData.asString(); + Item item = Vars.content.getByName(ContentType.item, str); + Liquid liquid = Vars.content.getByName(ContentType.liquid, str); + return item != null ? item : liquid; + } + }); } static class CustomJson extends Json{ diff --git a/core/src/mindustry/io/SaveFileReader.java b/core/src/mindustry/io/SaveFileReader.java index 793d8b2eb8..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,9 +30,33 @@ public abstract class SaveFileReader{ "titan-factory", "legacy-unit-factory", "fortress-factory", "legacy-unit-factory", - "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/SaveIO.java b/core/src/mindustry/io/SaveIO.java index 3ae3996d23..8b56ef2a61 100644 --- a/core/src/mindustry/io/SaveIO.java +++ b/core/src/mindustry/io/SaveIO.java @@ -3,6 +3,7 @@ package mindustry.io; import arc.*; import arc.files.*; import arc.struct.*; +import arc.util.*; import arc.util.io.*; import mindustry.*; import mindustry.game.EventType.*; @@ -41,7 +42,7 @@ public class SaveIO{ if(exists) file.moveTo(backupFileFor(file)); try{ write(file); - }catch(Exception e){ + }catch(Throwable e){ if(exists) backupFileFor(file).moveTo(file); throw new RuntimeException(e); } @@ -56,9 +57,9 @@ public class SaveIO{ } public static boolean isSaveValid(Fi file){ - try{ - return isSaveValid(new DataInputStream(new InflaterInputStream(file.read(bufferSize)))); - }catch(Exception e){ + try(DataInputStream stream = new DataInputStream(new InflaterInputStream(file.read(bufferSize)))){ + return isSaveValid(stream); + }catch(Throwable e){ return false; } } @@ -67,8 +68,8 @@ public class SaveIO{ try{ getMeta(stream); return true; - }catch(Exception e){ - e.printStackTrace(); + }catch(Throwable e){ + Log.err(e); return false; } } @@ -76,7 +77,8 @@ public class SaveIO{ public static SaveMeta getMeta(Fi file){ try{ return getMeta(getStream(file)); - }catch(Exception e){ + }catch(Throwable e){ + Log.err(e); return getMeta(getBackupStream(file)); } } @@ -119,11 +121,15 @@ public class SaveIO{ }else{ getVersion().write(stream, tags); } - }catch(Exception e){ + }catch(Throwable e){ throw new RuntimeException(e); } } + public static void load(String saveName) throws SaveException{ + load(saveDirectory.child(saveName + ".msav")); + } + public static void load(Fi file) throws SaveException{ load(file, world.context); } @@ -133,7 +139,7 @@ public class SaveIO{ //try and load; if any exception at all occurs load(new InflaterInputStream(file.read(bufferSize)), context); }catch(SaveException e){ - e.printStackTrace(); + Log.err(e); Fi backup = file.sibling(file.name() + "-backup." + file.extension()); if(backup.exists()){ load(new InflaterInputStream(backup.read(bufferSize)), context); @@ -153,7 +159,7 @@ public class SaveIO{ ver.read(stream, counter, context); Events.fire(new SaveLoadEvent()); - }catch(Exception e){ + }catch(Throwable e){ throw new SaveException(e); }finally{ world.setGenerating(false); diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index c3f83b30d8..cacac7700a 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -257,7 +257,7 @@ public abstract class SaveVersion extends SaveFileReader{ if(hadEntity){ if(isCenter){ //only read entity for center blocks - if(block.hasEntity()){ + if(block.hasBuilding()){ try{ readChunk(stream, true, in -> { byte revision = in.readByte(); diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index f5d721f2c5..733bb27c28 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -231,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); } } @@ -254,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..7e84526bec 100644 --- a/core/src/mindustry/io/legacy/LegacySaveVersion.java +++ b/core/src/mindustry/io/legacy/LegacySaveVersion.java @@ -54,14 +54,14 @@ public abstract class LegacySaveVersion extends SaveVersion{ if(block == null) block = Blocks.air; //occupied by multiblock part - boolean occupied = tile.build != null && !tile.isCenter() && (tile.build.block() == block || block == Blocks.air); + boolean occupied = tile.build != null && !tile.isCenter() && (tile.build.block == block || block == Blocks.air); //do not override occupied cells if(!occupied){ tile.setBlock(block); } - if(block.hasEntity()){ + if(block.hasBuilding()){ try{ readChunk(stream, true, in -> { byte version = in.readByte(); @@ -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/ConditionOp.java b/core/src/mindustry/logic/ConditionOp.java index c85bc6f37a..0954567c06 100644 --- a/core/src/mindustry/logic/ConditionOp.java +++ b/core/src/mindustry/logic/ConditionOp.java @@ -1,21 +1,28 @@ package mindustry.logic; public enum ConditionOp{ - equal("==", (a, b) -> Math.abs(a - b) < 0.000001), - notEqual("not", (a, b) -> Math.abs(a - b) >= 0.000001), + equal("==", (a, b) -> Math.abs(a - b) < 0.000001, (a, b) -> a == b), + notEqual("not", (a, b) -> Math.abs(a - b) >= 0.000001, (a, b) -> a != b), lessThan("<", (a, b) -> a < b), lessThanEq("<=", (a, b) -> a <= b), greaterThan(">", (a, b) -> a > b), - greaterThanEq(">=", (a, b) -> a >= b); + greaterThanEq(">=", (a, b) -> a >= b), + always("always", (a, b) -> true); public static final ConditionOp[] all = values(); + public final CondObjOpLambda objFunction; public final CondOpLambda function; public final String symbol; ConditionOp(String symbol, CondOpLambda function){ + this(symbol, function, null); + } + + ConditionOp(String symbol, CondOpLambda function, CondObjOpLambda objFunction){ this.symbol = symbol; this.function = function; + this.objFunction = objFunction; } @Override @@ -23,6 +30,10 @@ public enum ConditionOp{ return symbol; } + interface CondObjOpLambda{ + boolean get(Object a, Object b); + } + interface CondOpLambda{ boolean get(double a, double b); } diff --git a/core/src/mindustry/logic/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 8ac7481dd0..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; diff --git a/core/src/mindustry/logic/LCanvas.java b/core/src/mindustry/logic/LCanvas.java index c00a69b887..d626f95388 100644 --- a/core/src/mindustry/logic/LCanvas.java +++ b/core/src/mindustry/logic/LCanvas.java @@ -17,18 +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{ - static Seq postDraw = new Seq<>(); - static Seq postDrawPriority = new Seq<>(); + //ew static variables + static LCanvas canvas; DragLayout statements; StatementElem dragging; ScrollPane pane; + Group jumps; float targetWidth; public LCanvas(){ + canvas = this; + rebuild(); } @@ -45,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 @@ -76,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); @@ -104,19 +112,11 @@ public class LCanvas extends Table{ } } - @Override - public void draw(){ - postDraw.clear(); - postDrawPriority.clear(); - super.draw(); - postDraw.each(Runnable::run); - postDrawPriority.each(Runnable::run); - } - public class DragLayout extends WidgetGroup{ float space = Scl.scl(10f), prefWidth, prefHeight; Seq seq = new Seq<>(); int insertPosition = 0; + boolean invalidated; { setTransform(true); @@ -124,6 +124,7 @@ public class LCanvas extends Table{ @Override public void layout(){ + invalidated = true; float cy = 0; seq.clear(); @@ -171,6 +172,10 @@ public class LCanvas extends Table{ } invalidateHierarchy(); + + if(parent != null && parent instanceof Table){ + setCullingArea(parent.getCullingArea()); + } } @Override @@ -196,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(){ @@ -338,6 +352,9 @@ public class LCanvas extends Table{ boolean selecting; float mx, my; ClickListener listener; + StatementElem hovered; + + JumpCurve curve; public JumpButton(@NonNull Prov getter, Cons setter){ super(Tex.logicNode, Styles.colori); @@ -383,53 +400,26 @@ public class LCanvas extends Table{ 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); - (listener.isOver() ? postDrawPriority : 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); - - float s = width; - Draw.color(color); - Tex.logicNode.draw(tx + s*0.75f, ty - s/2f, -s, s); - Draw.reset(); - } - }); + if(stage == null){ + curve.remove(); + }else{ + canvas.jumps.addChild(curve); + } } StatementElem hovered(){ @@ -442,9 +432,60 @@ public class LCanvas extends Table{ if(e == null || isDescendantOf(e)) return null; return (StatementElem)e; } + } + + 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, color); + Lines.stroke(4f, button.color); Draw.alpha(parentAlpha); float dist = 100f; @@ -454,7 +495,7 @@ 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)) ); } } diff --git a/core/src/mindustry/logic/LExecutor.java b/core/src/mindustry/logic/LExecutor.java index 485743a016..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); @@ -251,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); - } } @@ -395,7 +409,17 @@ public class LExecutor{ if(op.unary){ exec.setnum(dest, op.function1.get(exec.num(a))); }else{ - exec.setnum(dest, op.function2.get(exec.num(a), exec.num(b))); + Var va = exec.vars[a]; + Var vb = exec.vars[b]; + + if(op.objFunction2 != null && (va.isobj || vb.isobj)){ + //use object function if provided, and one of the variables is an object + exec.setnum(dest, op.objFunction2.get(exec.obj(a), exec.obj(b))); + }else{ + //otherwise use the numeric function + exec.setnum(dest, op.function2.get(exec.num(a), exec.num(b))); + } + } } } @@ -462,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(); } @@ -487,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]" : @@ -546,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 1a8abf221b..6d57f2c079 100644 --- a/core/src/mindustry/logic/LStatements.java +++ b/core/src/mindustry/logic/LStatements.java @@ -1,6 +1,7 @@ package mindustry.logic; import arc.func.*; +import arc.graphics.*; import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; @@ -633,6 +634,8 @@ public class LStatements{ @RegisterStatement("jump") public static class JumpStatement extends LStatement{ + private static Color last = new Color(); + public transient StatementElem dest; public int destIndex; @@ -644,19 +647,30 @@ public class LStatements{ public void build(Table table){ table.add("if ").padLeft(4); - field(table, value, str -> value = str); - - table.button(b -> { - b.label(() -> op.symbol); - b.clicked(() -> showSelect(b, ConditionOp.all, op, o -> op = o)); - }, Styles.logict, () -> {}).size(48f, 40f).pad(4f).color(table.color); - - field(table, compare, str -> compare = str); + last = table.color; + table.table(this::rebuild); table.add().growX(); table.add(new JumpButton(() -> dest, s -> dest = s)).size(30).right().padLeft(-8); } + void rebuild(Table table){ + table.clearChildren(); + table.setColor(last); + + if(op != ConditionOp.always) field(table, value, str -> value = str); + + table.button(b -> { + b.label(() -> op.symbol); + b.clicked(() -> showSelect(b, ConditionOp.all, op, o -> { + op = o; + rebuild(table); + })); + }, Styles.logict, () -> {}).size(op == ConditionOp.always ? 80f : 48f, 40f).pad(4f).color(table.color); + + if(op != ConditionOp.always) field(table, compare, str -> compare = str); + } + //elements need separate conversion logic @Override public void setupUI(){ diff --git a/core/src/mindustry/logic/LogicDialog.java b/core/src/mindustry/logic/LogicDialog.java index a9f2debfbb..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); @@ -75,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 index 616ae5a464..b289efc1f2 100644 --- a/core/src/mindustry/logic/LogicOp.java +++ b/core/src/mindustry/logic/LogicOp.java @@ -7,25 +7,27 @@ public enum LogicOp{ sub("-", (a, b) -> a - b), mul("*", (a, b) -> a * b), div("/", (a, b) -> a / b), + idiv("//", (a, b) -> Math.floor(a / b)), mod("%", (a, b) -> a % b), - equal("==", (a, b) -> Math.abs(a - b) < 0.000001 ? 1 : 0), - notEqual("not", (a, b) -> Math.abs(a - b) < 0.000001 ? 0 : 1), + equal("==", (a, b) -> Math.abs(a - b) < 0.000001 ? 1 : 0, (a, b) -> 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) -> (int)a >> (int)b), - shr("<<", (a, b) -> (int)a << (int)b), - or("or", (a, b) -> (int)a | (int)b), - and("and", (a, b) -> (int)a & (int)b), - xor("xor", (a, b) -> (int)a ^ (int)b), + shl("<<", (a, b) -> (long)a << (long)b), + shr(">>", (a, b) -> (long)a >> (long)b), + or("or", (a, b) -> (long)a | (long)b), + and("and", (a, b) -> (long)a & (long)b), + xor("xor", (a, b) -> (long)a ^ (long)b), max("max", Math::max), min("min", Math::min), atan2("atan2", (x, y) -> Mathf.atan2((float)x, (float)y) * Mathf.radDeg), dst("dst", (x, y) -> Mathf.dst((float)x, (float)y)), + noise("noise", LExecutor.noise::rawNoise2D), - not("not", a -> ~(int)(a)), + not("not", a -> ~(long)(a)), abs("abs", a -> Math.abs(a)), log("log", Math::log), log10("log10", Math::log10), @@ -41,16 +43,22 @@ public enum LogicOp{ public static final LogicOp[] all = values(); + public final OpObjLambda2 objFunction2; public final OpLambda2 function2; public final OpLambda1 function1; public final boolean unary; public final String symbol; LogicOp(String symbol, OpLambda2 function){ + this(symbol, function, null); + } + + LogicOp(String symbol, OpLambda2 function, OpObjLambda2 objFunction){ this.symbol = symbol; this.function2 = function; this.function1 = null; this.unary = false; + this.objFunction2 = objFunction; } LogicOp(String symbol, OpLambda1 function){ @@ -58,6 +66,7 @@ public enum LogicOp{ this.function1 = function; this.function2 = null; this.unary = true; + this.objFunction2 = null; } @Override @@ -65,6 +74,10 @@ public enum LogicOp{ return symbol; } + interface OpObjLambda2{ + double get(Object a, Object b); + } + interface OpLambda2{ double get(double a, double b); } diff --git a/core/src/mindustry/logic/RadarSort.java b/core/src/mindustry/logic/RadarSort.java index 4164563f6d..50e553b70f 100644 --- a/core/src/mindustry/logic/RadarSort.java +++ b/core/src/mindustry/logic/RadarSort.java @@ -6,6 +6,8 @@ import mindustry.gen.*; public enum RadarSort{ distance((pos, other) -> -pos.dst2(other)), health((pos, other) -> other.health()), + shield((pos, other) -> other.shield()), + armor((pos, other) -> other.armor()), maxHealth((pos, other) -> other.maxHealth()); public final RadarSortFunc func; @@ -17,6 +19,6 @@ public enum RadarSort{ } public interface RadarSortFunc{ - float get(Position pos, Healthc other); + float get(Position pos, Unit other); } } diff --git a/core/src/mindustry/logic/RadarTarget.java b/core/src/mindustry/logic/RadarTarget.java index 5c82064fae..ddd7a1f368 100644 --- a/core/src/mindustry/logic/RadarTarget.java +++ b/core/src/mindustry/logic/RadarTarget.java @@ -8,7 +8,9 @@ public enum RadarTarget{ enemy((team, other) -> team != other.team), ally((team, other) -> team == other.team), player((team, other) -> other.isPlayer()), + attacker((pos, other) -> other.canShoot()), flying((team, other) -> other.isFlying()), + boss((team, other) -> other.isBoss()), ground((team, other) -> other.isGrounded()); public final RadarTargetFunc func; diff --git a/core/src/mindustry/logic/Senseable.java b/core/src/mindustry/logic/Senseable.java index 3f9e3798a4..6ae99afbfa 100644 --- a/core/src/mindustry/logic/Senseable.java +++ b/core/src/mindustry/logic/Senseable.java @@ -3,6 +3,12 @@ package mindustry.logic; import mindustry.ctype.*; public interface Senseable{ + Object noSensed = new Object(); + double sense(LAccess sensor); double sense(Content content); + + default Object senseObject(LAccess sensor){ + return noSensed; + } } diff --git a/core/src/mindustry/maps/Map.java b/core/src/mindustry/maps/Map.java index e47e369140..ebf2896e0e 100644 --- a/core/src/mindustry/maps/Map.java +++ b/core/src/mindustry/maps/Map.java @@ -130,7 +130,7 @@ public class Map implements Comparable, Publishable{ } public String tag(String name){ - return tags.containsKey(name) && !tags.get(name).trim().isEmpty() ? tags.get(name) : Core.bundle.get("unknown"); + return tags.containsKey(name) && !tags.get(name).trim().isEmpty() ? tags.get(name) : Core.bundle.get("unknown", "unknown"); } public boolean hasTag(String name){ @@ -146,7 +146,7 @@ public class Map implements Comparable, Publishable{ public void addSteamID(String id){ tags.put("steamid", id); - ui.editor.editor.getTags().put("steamid", id); + ui.editor.editor.tags.put("steamid", id); try{ ui.editor.save(); }catch(Exception e){ @@ -159,7 +159,7 @@ public class Map implements Comparable, Publishable{ public void removeSteamID(){ tags.remove("steamid"); - ui.editor.editor.getTags().remove("steamid"); + ui.editor.editor.tags.remove("steamid"); try{ ui.editor.save(); }catch(Exception e){ @@ -203,7 +203,7 @@ public class Map implements Comparable, Publishable{ @Override public boolean prePublish(){ tags.put("author", player.name); - ui.editor.editor.getTags().put("author", tags.get("author")); + ui.editor.editor.tags.put("author", tags.get("author")); ui.editor.save(); return true; diff --git a/core/src/mindustry/maps/Maps.java b/core/src/mindustry/maps/Maps.java index 137b91bb36..54c3856d7d 100644 --- a/core/src/mindustry/maps/Maps.java +++ b/core/src/mindustry/maps/Maps.java @@ -59,6 +59,7 @@ public class Maps{ /** @return the next map to shuffle to. May be null, in which case the server should be stopped. */ public @Nullable Map getNextMap(Gamemode mode, @Nullable Map previous){ + if(shuffler != null) return shuffler.next(mode, previous); return shuffleMode.next(mode, previous); } @@ -292,25 +293,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/FilterOption.java b/core/src/mindustry/maps/filters/FilterOption.java index 1124c195b8..dedebfe713 100644 --- a/core/src/mindustry/maps/filters/FilterOption.java +++ b/core/src/mindustry/maps/filters/FilterOption.java @@ -17,13 +17,13 @@ import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; public abstract class FilterOption{ - public static final Boolf floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); - public static final Boolf wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); - public static final Boolf floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full))); - public static final Boolf wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full))); - public static final Boolf wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full))); + public static final Boolf floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)); + public static final Boolf wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full)) && b.inEditor; + public static final Boolf floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full))); + public static final Boolf wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full))); + public static final Boolf wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && !headless && Core.atlas.isFound(b.icon(Cicon.full))) && b.inEditor; public static final Boolf oresOnly = b -> b instanceof OverlayFloor && !headless && Core.atlas.isFound(b.icon(mindustry.ui.Cicon.full)); - public static final Boolf anyOptional = b -> floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air; + public static final Boolf anyOptional = b -> (floorsOnly.get(b) || wallsOnly.get(b) || oresOnly.get(b) || b == Blocks.air) && b.inEditor; public abstract void build(Table table); diff --git a/core/src/mindustry/maps/filters/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/generators/FileMapGenerator.java b/core/src/mindustry/maps/generators/FileMapGenerator.java index e0b8bf3946..dab00370ed 100644 --- a/core/src/mindustry/maps/generators/FileMapGenerator.java +++ b/core/src/mindustry/maps/generators/FileMapGenerator.java @@ -3,7 +3,6 @@ package mindustry.maps.generators; import arc.math.*; import arc.math.geom.*; import mindustry.content.*; -import mindustry.ctype.*; import mindustry.game.*; import mindustry.io.*; import mindustry.maps.*; @@ -29,12 +28,13 @@ public class FileMapGenerator implements WorldGenerator{ world.setGenerating(true); tiles = world.tiles; + Item[] items = {Items.blastCompound, Items.pyratite, Items.copper, Items.thorium, Items.copper, Items.lead}; for(Tile tile : tiles){ if(tile.block() instanceof StorageBlock && !(tile.block() instanceof CoreBlock) && state.hasSector()){ - for(Content content : state.getSector().data.resources){ - if(content instanceof Item && Mathf.chance(0.3)){ - tile.build.items.add((Item)content, Math.min(Mathf.random(500), tile.block().itemCapacity)); + for(Item content : items){ + if(Mathf.chance(0.2)){ + tile.build.items.add(content, Math.min(Mathf.random(500), tile.block().itemCapacity)); } } } diff --git a/core/src/mindustry/maps/generators/PlanetGenerator.java b/core/src/mindustry/maps/generators/PlanetGenerator.java index 2ce0bbae27..6bbc15ed2f 100644 --- a/core/src/mindustry/maps/generators/PlanetGenerator.java +++ b/core/src/mindustry/maps/generators/PlanetGenerator.java @@ -5,7 +5,6 @@ import arc.util.noise.*; import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.type.*; -import mindustry.type.Sector.*; import mindustry.world.*; public abstract class PlanetGenerator extends BasicGenerator implements HexMesher{ @@ -24,7 +23,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe if(noise < 0.15){ for(Ptile other : tile.tiles){ - if(sector.planet.getSector(other).is(SectorAttribute.base)){ + if(sector.planet.getSector(other).generateEnemyBase){ any = false; break; } @@ -32,7 +31,7 @@ public abstract class PlanetGenerator extends BasicGenerator implements HexMeshe } if(any){ - sector.data.attributes |= (1 << SectorAttribute.base.ordinal()); + sector.generateEnemyBase = true; } } diff --git a/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java b/core/src/mindustry/maps/planet/SerpuloPlanetGenerator.java index a8dccace17..6c5f047a90 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,22 +284,17 @@ 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; - //scale up the spawning base on difficulty (this is just for testing) - for(SpawnGroup group : state.rules.spawns){ - group.unitAmount *= difficulty; - if(group.unitScaling != SpawnGroup.never){ - group.unitScaling *= difficulty; - } - } + //TODO better waves + state.rules.spawns = defaultWaves.get(); } @Override 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/Mods.java b/core/src/mindustry/mod/Mods.java index 2a87330c82..89f378f406 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -25,7 +25,6 @@ import mindustry.type.*; import mindustry.ui.*; import java.io.*; -import java.net.*; import static mindustry.Vars.*; @@ -192,10 +191,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 +424,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 +438,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 +455,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. */ @@ -596,9 +599,14 @@ public class Mods implements Loadable{ zip = zip.list()[0]; } - Fi metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : zip.child("plugin.json"); + Fi metaf = + zip.child("mod.json").exists() ? zip.child("mod.json") : + zip.child("mod.hjson").exists() ? zip.child("mod.hjson") : + zip.child("plugin.json").exists() ? zip.child("plugin.json") : + zip.child("plugin.hjson"); + if(!metaf.exists()){ - Log.warn("Mod @ doesn't have a 'mod.json'/'mod.hjson'/'plugin.json' file, skipping.", sourceFile); + Log.warn("Mod @ doesn't have a '[mod/plugin].[h]json' file, skipping.", sourceFile); throw new IllegalArgumentException("Invalid file: No mod.json found."); } @@ -625,12 +633,11 @@ public class Mods implements Loadable{ //make sure the main class exists before loading it; if it doesn't just don't put it there if(mainFile.exists()){ //mobile versions don't support class mods - if(mobile){ - throw new IllegalArgumentException("Java class mods are not supported on mobile."); + if(ios){ + throw new IllegalArgumentException("Java class mods are not supported on iOS."); } - URLClassLoader classLoader = new URLClassLoader(new URL[]{sourceFile.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); - Class main = classLoader.loadClass(mainClass); + Class main = platform.loadJar(sourceFile, mainClass); metas.put(main, meta); mainMod = (Mod)main.getDeclaredConstructor().newInstance(); }else{ @@ -642,7 +649,9 @@ public class Mods implements Loadable{ meta.hidden = true; } - Log.info("Loaded mod '@' in @", meta.name, Time.elapsed()); + if(!headless){ + Log.info("Loaded mod '@' in @ms", meta.name, Time.elapsed()); + } return new LoadedMod(sourceFile, zip, mainMod, meta); }catch(Exception e){ @@ -703,14 +712,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 @@ -788,7 +832,7 @@ public class Mods implements Loadable{ /** Mod metadata information.*/ public static class ModMeta{ - public String name, displayName, author, description, version, main, minGameVersion; + public String name, displayName, author, description, version, main, minGameVersion = "0"; public Seq dependencies = Seq.with(); /** Hidden mods are only server-side or client-side, and do not support adding new content. */ public boolean hidden; diff --git a/core/src/mindustry/mod/Scripts.java b/core/src/mindustry/mod/Scripts.java index d2009187f7..1aa260e8fa 100644 --- a/core/src/mindustry/mod/Scripts.java +++ b/core/src/mindustry/mod/Scripts.java @@ -22,7 +22,7 @@ public class Scripts implements Disposable{ private final Seq blacklist = Seq.with(".net.", "java.net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk", "runtime", "util.os", "rmi", "security", "org.", "sun.", "beans", "sql", "http", "exec", "compiler", "process", "system", ".awt", "socket", "classloader", "oracle", "invoke", "java.util.function", "java.util.stream", "org."); - private final Seq whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic."); + private final Seq whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen.", "mindustry.logic.", "mindustry.async.", "saveio"); private final Context context; private final Scriptable scope; private boolean errored; diff --git a/core/src/mindustry/net/Administration.java b/core/src/mindustry/net/Administration.java index 1901592263..7e5eb65339 100644 --- a/core/src/mindustry/net/Administration.java +++ b/core/src/mindustry/net/Administration.java @@ -19,28 +19,19 @@ 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<>(); + public ObjectMap kickedIPs = new ObjectMap<>(); + + /** All player info. Maps UUIDs to info. This persists throughout restarts. Do not access directly. */ private ObjectMap playerInfo = new ObjectMap<>(); - 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; @@ -73,24 +64,19 @@ 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 - but only once. - if(lastPlaced.get(action.tile.pos(), -1) == action.player.id()){ - lastPlaced.remove(action.tile.pos()); - return true; - } - Ratekeeper rate = action.player.getInfo().rate; if(rate.allow(Config.interactRateWindow.num() * 1000, Config.interactRateLimit.num())){ return true; }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."); } @@ -101,6 +87,20 @@ public class Administration{ }); } + /** @return time at which a player would be pardoned for a kick (0 means they were never kicked) */ + public long getKickTime(String uuid, String ip){ + return Math.max(getInfo(uuid).lastKicked, kickedIPs.get(ip, 0L)); + } + + /** Sets up kick duration for a player. */ + public void handleKicked(String uuid, String ip, long duration){ + kickedIPs.put(ip, Math.max(kickedIPs.get(ip, 0L), Time.millis() + duration)); + + PlayerInfo info = getInfo(uuid); + info.timesKicked++; + info.lastKicked = Math.max(Time.millis() + duration, info.lastKicked); + } + public Seq getSubnetBans(){ return subnetBans; } @@ -166,7 +166,7 @@ public class Administration{ Core.settings.put("playerlimit", limit); } - public boolean getStrict(){ + public boolean isStrict(){ return Config.strict.bool(); } @@ -658,6 +658,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 ea0146312e..bd4f948f89 100644 --- a/core/src/mindustry/net/ArcNetProvider.java +++ b/core/src/mindustry/net/ArcNetProvider.java @@ -61,7 +61,7 @@ public class ArcNetProvider implements NetProvider{ try{ net.handleClientReceived(object); }catch(Throwable e){ - handleException(e); + net.handleException(e); } }); @@ -144,14 +144,14 @@ public class ArcNetProvider implements NetProvider{ try{ client.run(); }catch(Exception e){ - if(!(e instanceof ClosedSelectorException)) handleException(e); + if(!(e instanceof ClosedSelectorException)) net.handleException(e); } }); client.connect(5000, ip, port, port); success.run(); }catch(Exception e){ - handleException(e); + net.handleException(e); } }); } @@ -269,16 +269,6 @@ public class ArcNetProvider implements NetProvider{ return null; } - void handleException(Throwable e){ - if(e instanceof ArcNetException){ - Core.app.post(() -> net.showError(new IOException("mismatch"))); - }else if(e instanceof ClosedChannelException){ - Core.app.post(() -> net.showError(new IOException("alreadyconnected"))); - }else{ - Core.app.post(() -> net.showError(e)); - } - } - class ArcConnection extends NetConnection{ public final Connection connection; 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/CrashSender.java b/core/src/mindustry/net/CrashSender.java index 24a82a9e07..9a98d87555 100644 --- a/core/src/mindustry/net/CrashSender.java +++ b/core/src/mindustry/net/CrashSender.java @@ -19,19 +19,33 @@ import java.text.*; import java.util.*; import static arc.Core.*; +import static mindustry.Vars.mods; import static mindustry.Vars.net; public class CrashSender{ + public static String createReport(String error){ + String report = "Mindustry has crashed. How unforunate.\n"; + if(mods.list().size == 0 && Version.build != -1){ + report += "Report this at " + Vars.reportIssueURL + "\n\n"; + } + return report + "Version: " + Version.combined() + (Vars.headless ? " (Server)" : "") + "\n" + + "OS: " + System.getProperty("os.name") + " x" + (OS.is64Bit ? "64" : "32") + "\n" + + "Java Version: " + System.getProperty("java.version") + "\n" + + "Java Architecture: " + System.getProperty("sun.arch.data.model") + "\n" + + mods.list().size + " Mods" + (mods.list().isEmpty() ? "" : ": " + mods.list().toString(", ", mod -> mod.name + ":" + mod.meta.version)) + + "\n\n" + error; + } + public static void log(Throwable exception){ try{ - Core.settings.getDataDirectory().child("crashes").child("crash_" + System.currentTimeMillis() + ".txt").writeString(Strings.neatError(exception)); + Core.settings.getDataDirectory().child("crashes").child("crash_" + System.currentTimeMillis() + ".txt") + .writeString(createReport(Strings.neatError(exception))); }catch(Throwable ignored){ } } public static void send(Throwable exception, Cons writeListener){ - try{ exception.printStackTrace(); @@ -70,7 +84,7 @@ public class CrashSender{ try{ File file = new File(OS.getAppDataDirectoryString(Vars.appName), "crashes/crash-report-" + new SimpleDateFormat("MM_dd_yyyy_HH_mm_ss").format(new Date()) + ".txt"); new Fi(OS.getAppDataDirectoryString(Vars.appName)).child("crashes").mkdirs(); - new Fi(file).writeString(parseException(exception)); + new Fi(file).writeString(createReport(parseException(exception))); writeListener.get(file); }catch(Throwable e){ Log.err("Failed to save local crash report.", e); @@ -130,7 +144,7 @@ public class CrashSender{ boolean[] sent = {false}; Log.info("Sending crash report."); - //post to crash report URL + //post to crash report URL, exit code indicates send success httpPost(Vars.crashReportURL, value.toJson(OutputType.json), r -> { Log.info("Crash sent successfully."); sent[0] = true; @@ -138,7 +152,7 @@ public class CrashSender{ }, t -> { t.printStackTrace(); sent[0] = true; - System.exit(1); + System.exit(-1); }); //sleep until report is sent diff --git a/core/src/mindustry/net/Net.java b/core/src/mindustry/net/Net.java index 8993b84f83..af8d2ff739 100644 --- a/core/src/mindustry/net/Net.java +++ b/core/src/mindustry/net/Net.java @@ -1,10 +1,11 @@ package mindustry.net; import arc.*; -import arc.struct.*; import arc.func.*; -import arc.util.*; +import arc.net.*; +import arc.struct.*; import arc.util.ArcAnnotate.*; +import arc.util.*; import arc.util.pooling.*; import mindustry.gen.*; import mindustry.net.Packets.*; @@ -13,6 +14,7 @@ import net.jpountz.lz4.*; import java.io.*; import java.nio.*; +import java.nio.channels.*; import static mindustry.Vars.*; @@ -36,6 +38,16 @@ public class Net{ this.provider = provider; } + public void handleException(Throwable e){ + if(e instanceof ArcNetException){ + Core.app.post(() -> showError(new IOException("mismatch"))); + }else if(e instanceof ClosedChannelException){ + Core.app.post(() -> showError(new IOException("alreadyconnected"))); + }else{ + Core.app.post(() -> showError(e)); + } + } + /** Display a network error. Call on the graphics thread. */ public void showError(Throwable e){ @@ -152,7 +164,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..976bea5a74 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,17 +61,18 @@ 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); - info.timesKicked++; - info.lastKicked = Math.max(Time.millis() + kickDuration, info.lastKicked); + netServer.admins.handleKicked(uuid, address, kickDuration); Call.kick(this, reason); Time.runTask(2f, this::close); netServer.admins.save(); + kicked = true; } public boolean isConnected(){ diff --git a/core/src/mindustry/type/AmmoType.java b/core/src/mindustry/type/AmmoType.java new file mode 100644 index 0000000000..afe0a9818a --- /dev/null +++ b/core/src/mindustry/type/AmmoType.java @@ -0,0 +1,28 @@ +package mindustry.type; + +import arc.graphics.*; +import mindustry.ctype.*; +import mindustry.gen.*; +import mindustry.graphics.*; + +/** Type of ammo that a unit uses. */ +public class AmmoType extends Content{ + public String icon = Iconc.itemCopper + ""; + public Color color = Pal.ammo; + public Color barColor = Pal.ammo; + + public AmmoType(char icon, Color color){ + this.icon = icon + ""; + this.color = color; + } + + public AmmoType(){ + } + + public void resupply(Unit unit){} + + @Override + public ContentType getContentType(){ + return ContentType.ammo; + } +} diff --git a/core/src/mindustry/type/AmmoTypes.java b/core/src/mindustry/type/AmmoTypes.java new file mode 100644 index 0000000000..0dafe2ba8b --- /dev/null +++ b/core/src/mindustry/type/AmmoTypes.java @@ -0,0 +1,86 @@ +package mindustry.type; + +import arc.util.ArcAnnotate.*; +import mindustry.*; +import mindustry.content.*; +import mindustry.ctype.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.meta.*; + +public class AmmoTypes implements ContentList{ + public static AmmoType + powerLow, + power, + powerHigh, + copper, + thorium; + + @Override + public void load(){ + powerLow = new PowerAmmoType(500); + power = new PowerAmmoType(1000); + powerHigh = new PowerAmmoType(2000); + copper = new ItemAmmoType(Items.copper); + thorium = new ItemAmmoType(Items.thorium); + } + + public static class PowerAmmoType extends AmmoType{ + public float totalPower = 1000; + + public PowerAmmoType(){ + super(Iconc.power, Pal.powerLight); + barColor = color; + } + + public PowerAmmoType(float totalPower){ + this(); + this.totalPower = totalPower; + } + + @Override + public void resupply(Unit unit){ + float range = unit.hitSize + 60f; + Tile closest = Vars.indexer.findClosestFlag(unit.x, unit.y, unit.team, BlockFlag.powerResupply); + + if(closest != null && closest.build != null && unit.within(closest.build, range) && closest.build.power != null){ + Building build = closest.build; + + if(build.block.consumes.hasPower() && build.block.consumes.getPower().buffered){ + float amount = closest.build.power.status * build.block.consumes.getPower().capacity; + float powerPerAmmo = totalPower / unit.type().ammoCapacity; + float ammoRequired = unit.type().ammoCapacity - unit.ammo; + float powerRequired = ammoRequired * powerPerAmmo; + float powerTaken = Math.min(amount, powerRequired); + + if(powerTaken > 1){ + closest.build.power.status -= powerTaken / build.block.consumes.getPower().capacity; + unit.ammo += powerTaken / powerPerAmmo; + + Fx.itemTransfer.at(build.x, build.y, Math.max(powerTaken / 100f, 1f), Pal.power, unit); + } + } + } + } + } + + public static class ItemAmmoType extends AmmoType{ + public @NonNull Item item; + + public ItemAmmoType(Item item){ + this.item = item; + this.color = item.color; + } + + public ItemAmmoType(){ + } + + @Override + public void load(){ + if(item != null){ + icon = item.emoji(); + } + } + } +} diff --git a/core/src/mindustry/type/ItemSeq.java b/core/src/mindustry/type/ItemSeq.java index af8436bf44..9926e1d3b9 100644 --- a/core/src/mindustry/type/ItemSeq.java +++ b/core/src/mindustry/type/ItemSeq.java @@ -11,13 +11,14 @@ 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; + protected final int[] values = new int[Vars.content.items().size]; public int total; public ItemSeq(){ - values = new int[Vars.content.items().size]; + } + + public ItemSeq(Seq stacks){ + stacks.each(this::add); } public void each(ItemConsumer cons){ @@ -28,6 +29,11 @@ public class ItemSeq implements Iterable, Serializable{ } } + public void clear(){ + total = 0; + Arrays.fill(values, 0); + } + public Seq toSeq(){ Seq out = new Seq<>(); for(int i = 0; i < values.length; i++){ diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index e217b3431e..651c5c7923 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -1,7 +1,6 @@ package mindustry.type; import arc.*; -import arc.files.*; import arc.func.*; import arc.graphics.*; import arc.math.*; @@ -10,15 +9,12 @@ import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; -import arc.util.io.*; import arc.util.noise.*; -import mindustry.*; import mindustry.ctype.*; import mindustry.graphics.*; import mindustry.graphics.g3d.*; import mindustry.graphics.g3d.PlanetGrid.*; import mindustry.maps.generators.*; -import mindustry.type.Sector.*; import static mindustry.Vars.*; @@ -83,25 +79,10 @@ public class Planet extends UnlockableContent{ sectors = new Seq<>(grid.tiles.length); for(int i = 0; i < grid.tiles.length; i++){ - sectors.add(new Sector(this, grid.tiles[i], new SectorData())); + sectors.add(new Sector(this, grid.tiles[i])); } sectorApproxRadius = sectors.first().tile.v.dst(sectors.first().tile.corners[0].v); - - //read data for sectors - Fi data = Vars.tree.get("planets/" + name + ".dat"); - if(data.exists()){ - try{ - try(Reads read = data.reads()){ - short dsize = read.s(); - for(int i = 0; i < dsize; i++){ - sectors.get(i).data.read(read); - } - } - }catch(Throwable t){ - t.printStackTrace(); - } - } }else{ sectors = new Seq<>(); } @@ -196,7 +177,7 @@ public class Planet extends UnlockableContent{ for(Sector sector : sectors){ float sum = 1f; for(Sector other : sector.inRange(2)){ - if(other.is(SectorAttribute.base)){ + if(other.generateEnemyBase){ sum += 1f; } } @@ -205,7 +186,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..5fb65ce091 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -7,12 +7,9 @@ import arc.struct.ObjectIntMap.*; import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; -import arc.util.io.*; import mindustry.*; -import mindustry.ctype.*; import mindustry.game.Saves.*; import mindustry.graphics.g3d.PlanetGrid.*; -import mindustry.world.*; import static mindustry.Vars.*; @@ -27,23 +24,19 @@ public class Sector{ public final Ptile tile; public final int id; - public final SectorData data; - public @Nullable SaveSlot save; public @Nullable SectorPreset preset; + /** Number 0-1 indicating the difficulty based on nearby bases. */ public float baseCoverage; + public boolean generateEnemyBase; - //TODO implement a dynamic launch period - public int launchPeriod = 10; - - public Sector(Planet planet, Ptile tile, SectorData data){ + public Sector(Planet planet, Ptile tile){ this.planet = planet; this.tile = tile; this.plane = new Plane(); this.rect = makeRect(); this.id = tile.id; - this.data = data; } public Seq inRange(int range){ @@ -99,12 +92,12 @@ public class Sector{ /** @return whether the enemy has a generated base here. */ public boolean hasEnemyBase(){ - return is(SectorAttribute.base) && (save == null || save.meta.rules.waves); + return generateEnemyBase && (save == null || save.meta.rules.waves); } public boolean isBeingPlayed(){ //after the launch dialog, a sector is no longer considered being played - return Vars.state.isGame() && Vars.state.rules.sector == this && !Vars.state.launched && !Vars.state.gameOver; + return Vars.state.isGame() && Vars.state.rules.sector == this && !Vars.state.gameOver; } public boolean isCaptured(){ @@ -138,16 +131,6 @@ public class Sector{ return res % 2 == 0 ? res : res + 1; } - //TODO implement - public boolean isLaunchWave(int wave){ - return metCondition() && wave % launchPeriod == 0; - } - - public boolean metCondition(){ - //TODO implement - return false; - } - //TODO this should be stored in a more efficient structure, and be updated each turn public ItemSeq getExtraItems(){ return Core.settings.getJson(key("extra-items"), ItemSeq.class, ItemSeq::new); @@ -279,6 +262,10 @@ public class Sector{ Core.settings.put(key(key), value); } + public String toString(){ + return planet.name + "#" + id; + } + /** Projects this sector onto a 4-corner square for use in map gen. * Allocates a new object. Do not call in the main loop. */ private SectorRect makeRect(){ @@ -310,10 +297,6 @@ public class Sector{ return new SectorRect(radius, center, planeTop, planeRight, angle); } - public boolean is(SectorAttribute attribute){ - return (data.attributes & (1 << attribute.ordinal())) != 0; - } - public static class SectorRect{ public final Vec3 center, top, right; public final Vec3 result = new Vec3(); @@ -334,62 +317,4 @@ public class Sector{ return result.set(center).add(right, nx).add(top, ny); } } - - /** Cached data about a sector. */ - public static class SectorData{ - public UnlockableContent[] resources = {}; - public int spawnX, spawnY; - - public Block[] floors = {}; - public int[] floorCounts = {}; - public int attributes; - - public void write(Writes write){ - write.s(resources.length); - for(Content resource : resources){ - write.b(resource.getContentType().ordinal()); - write.s(resource.id); - } - write.s(spawnX); - write.s(spawnY); - write.s(floors.length); - for(int i = 0; i < floors.length; i++){ - write.s(floors[i].id); - write.i(floorCounts[i]); - } - - write.i(attributes); - } - - public void read(Reads read){ - resources = new UnlockableContent[read.s()]; - for(int i = 0; i < resources.length; i++){ - resources[i] = Vars.content.getByID(ContentType.all[read.b()], read.s()); - } - spawnX = read.s(); - spawnY = read.s(); - floors = new Block[read.s()]; - floorCounts = new int[floors.length]; - for(int i = 0; i < floors.length; i++){ - floors[i] = Vars.content.block(read.s()); - floorCounts[i] = read.i(); - } - attributes = read.i(); - } - } - - public enum SectorAttribute{ - /** Requires naval technology to land on, e.g. mostly water */ - naval, - /** Has rain. */ - rainy, - /** Has snow. */ - snowy, - /** Has sandstorms. */ - desert, - /** Has an enemy base. */ - base, - /** Has spore weather. */ - spores - } } diff --git a/core/src/mindustry/type/StatusEffect.java b/core/src/mindustry/type/StatusEffect.java index cce31e77c1..fda8dbbbf2 100644 --- a/core/src/mindustry/type/StatusEffect.java +++ b/core/src/mindustry/type/StatusEffect.java @@ -56,7 +56,7 @@ public class StatusEffect extends MappableContent{ } if(effect != Fx.none && Mathf.chanceDelta(effectChance)){ - Tmp.v1.rnd(unit.type().hitsize/2f); + Tmp.v1.rnd(unit.type().hitSize /2f); effect.at(unit.x + Tmp.v1.x, unit.y + Tmp.v1.y); } } diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index f2e521cb48..7b17ca53e4 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -15,6 +15,7 @@ import arc.util.ArcAnnotate.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; +import mindustry.core.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.abilities.*; @@ -28,11 +29,12 @@ import mindustry.world.*; import mindustry.world.blocks.environment.*; import mindustry.world.blocks.payloads.*; import mindustry.world.blocks.units.*; +import mindustry.world.consumers.*; import static mindustry.Vars.*; public class UnitType extends UnlockableContent{ - public static final float shadowTX = -12, shadowTY = -13, shadowColor = Color.toFloatBits(0, 0, 0, 0.22f); + public static final float shadowTX = -12, shadowTY = -13, outlineSpace = 0.01f; private static final Vec2 legOffset = new Vec2(); /** If true, the unit is always at elevation 1. */ @@ -42,18 +44,19 @@ public class UnitType extends UnlockableContent{ public float speed = 1.1f, boostMultiplier = 1f, rotateSpeed = 5f, baseRotateSpeed = 5f; public float drag = 0.3f, accel = 0.5f, landShake = 0f, rippleScale = 1f, fallSpeed = 0.018f; public float health = 200f, range = -1, armor = 0f; - public float crashDamageMultiplier = 3f; + public float crashDamageMultiplier = 1f; public boolean targetAir = true, targetGround = true; public boolean faceTarget = true, rotateShooting = true, isCounted = true, lowAltitude = false; public boolean canBoost = false; public boolean destructibleWreck = true; public float groundLayer = Layer.groundUnit; - public float sway = 1f; - public int payloadCapacity = 1; + public float payloadCapacity = 8; + public float aimDst = -1f; public int commandLimit = 24; public float visualElevation = -1f; public boolean allowLegStep = false; public boolean hovering = false; + public boolean omniMovement = true; public Effect fallEffect = Fx.fallSmoke; public Effect fallThrusterEffect = Fx.fallSmoke; public Seq abilities = new Seq<>(); @@ -63,19 +66,27 @@ public class UnitType extends UnlockableContent{ public float legSplashDamage = 0f, legSplashRange = 5; public boolean flipBackLegs = true; - public int itemCapacity = 30; - public int ammoCapacity = 220; + public float mechSideSway = 0.54f, mechFrontSway = 0.1f; + public float mechStride = -1f; + public float mechStepShake = -1f; + public boolean mechStepParticles = false; + public Color mechLegColor = Pal.darkMetal; + + public int itemCapacity = -1; + public int ammoCapacity = -1; + public AmmoType ammoType = AmmoTypes.copper; public int mineTier = -1; public float buildSpeed = 1f, mineSpeed = 1f; + public float clipSize = -1; + public boolean canDrown = true; public float engineOffset = 5f, engineSize = 2.5f; public float strafePenalty = 0.5f; - public float hitsize = 6f; + public float hitSize = 6f; public float itemOffsetY = 3f; public float lightRadius = 60f, lightOpacity = 0.6f; public Color lightColor = Pal.powerLight; public boolean drawCell = true, drawItems = true, drawShields = true; - public int parts = 0; public int trailLength = 3; public float trailX = 4f, trailY = -3f, trailScl = 1f; /** Whether the unit can heal blocks. Initialized in init() */ @@ -87,8 +98,8 @@ public class UnitType extends UnlockableContent{ public Seq weapons = new Seq<>(); public TextureRegion baseRegion, legRegion, region, shadowRegion, cellRegion, - occlusionRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion; - public TextureRegion[] partRegions, partCellRegions, wreckRegions; + occlusionRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion, outlineRegion; + public TextureRegion[] wreckRegions; public UnitType(String name){ super(name); @@ -110,16 +121,23 @@ public class UnitType extends UnlockableContent{ return unit; } + public Unit spawn(Team team, float x, float y){ + Unit out = create(team); + out.set(x, y); + out.add(); + return out; + } + + public Unit spawn(float x, float y){ + return spawn(state.rules.defaultTeam, x, y); + } + public boolean hasWeapons(){ return weapons.size > 0; } public void update(Unit unit){ - if(abilities.size > 0){ - for(Ability a : abilities){ - a.update(unit); - } - } + } public void landed(Unit unit){} @@ -127,31 +145,24 @@ 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(); table.table(bars -> { - bars.defaults().growX().height(18f).pad(4); + bars.defaults().growX().height(20f).pad(4); bars.add(new Bar("blocks.health", Pal.health, unit::healthf).blink(Color.white)); bars.row(); if(state.rules.unitAmmo){ - bars.add(new Bar("blocks.ammo", Pal.ammo, () -> unit.ammo / ammoCapacity)); + bars.add(new Bar(ammoType.icon + " " + Core.bundle.get("blocks.ammo"), ammoType.barColor, () -> unit.ammo / ammoCapacity)); bars.row(); } }).growX(); table.row(); - if(unit.deactivated){ - table.table(d -> { - d.left(); - d.label(() -> Core.bundle.format("bar.limitreached", unit.count(), unit.cap(), Fonts.getUnicodeStr(name))); - }).left().visible(() -> unit.deactivated); - } - } @Override @@ -181,16 +192,42 @@ public class UnitType extends UnlockableContent{ public void init(){ if(constructor == null) throw new IllegalArgumentException("no constructor set up for unit '" + name + "'"); + Unit example = constructor.get(); + + //water preset + if(example instanceof WaterMovec){ + canDrown = false; + omniMovement = false; + immunities.add(StatusEffects.wet); + } + singleTarget = weapons.size <= 1; + if(itemCapacity < 0){ + itemCapacity = Math.max(Mathf.round(hitSize * 7, 20), 20); + } + //set up default range if(range < 0){ range = Float.MAX_VALUE; for(Weapon weapon : weapons){ - range = Math.min(range, weapon.bullet.range() + hitsize/2f); + range = Math.min(range, weapon.bullet.range() + hitSize /2f); } } + if(mechStride < 0){ + mechStride = 4f + (hitSize -8f)/2.1f; + } + + if(aimDst < 0){ + aimDst = weapons.contains(w -> !w.rotate) ? hitSize * 2f : hitSize / 2f; + } + + if(mechStepShake < 0){ + mechStepShake = Mathf.round((hitSize - 11f) / 9f); + mechStepParticles = hitSize > 15f; + } + canHeal = weapons.contains(w -> w.bullet instanceof HealBulletType); //add mirrored weapon variants @@ -215,6 +252,15 @@ public class UnitType extends UnlockableContent{ } } this.weapons = mapped; + + //dynamically create ammo capacity based on firing rate + if(ammoCapacity < 0){ + float shotsPerSecond = weapons.sumf(w -> 60f / w.reload); + //duration of continuous fire without reload + float targetSeconds = 30; + + ammoCapacity = Math.max(1, (int)(shotsPerSecond * targetSeconds)); + } } @CallSuper @@ -230,22 +276,43 @@ public class UnitType extends UnlockableContent{ baseRegion = Core.atlas.find(name + "-base"); cellRegion = Core.atlas.find(name + "-cell", Core.atlas.find("power-cell")); occlusionRegion = Core.atlas.find("circle-shadow"); + outlineRegion = Core.atlas.find(name + "-outline"); shadowRegion = icon(Cicon.full); - partRegions = new TextureRegion[parts]; - partCellRegions = new TextureRegion[parts]; - - for(int i = 0; i < parts; i++){ - partRegions[i] = Core.atlas.find(name + "-part" + i); - partCellRegions[i] = Core.atlas.find(name + "-cell" + i); - } - wreckRegions = new TextureRegion[3]; for(int i = 0; i < wreckRegions.length; i++){ wreckRegions[i] = Core.atlas.find(name + "-wreck" + i); } } + @Override + public ItemStack[] researchRequirements(){ + ItemStack[] stacks = null; + + //calculate costs based on reconstructors or factories found + Block rec = content.blocks().find(b -> b instanceof Reconstructor && Structs.contains(((Reconstructor)b).upgrades, u -> u[1] == this)); + + if(rec != null && rec.consumes.has(ConsumeType.item) && rec.consumes.get(ConsumeType.item) instanceof ConsumeItems){ + stacks = ((ConsumeItems)rec.consumes.get(ConsumeType.item)).items; + }else{ + UnitFactory factory = (UnitFactory)content.blocks().find(u -> u instanceof UnitFactory && Structs.contains(((UnitFactory)u).plans, p -> p.unit == this)); + if(factory != null){ + stacks = Structs.find(factory.plans, p -> p.unit == this).requirements; + } + } + + if(stacks != null){ + ItemStack[] out = new ItemStack[stacks.length]; + for(int i = 0; i < out.length; i++){ + out[i] = new ItemStack(stacks[i].item, UI.roundAmount((int)(Math.pow(stacks[i].amount, 1.1) * 50))); + } + + return out; + } + + return super.researchRequirements(); + } + @Override public ContentType getContentType(){ return ContentType.unit; @@ -254,25 +321,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(mech.walkExtend(true), 2f/Mathf.PI, 1) * mechSideSway, 0f, unit.elevation)); + + //front + legOffset.add(Tmp.v1.trns(mech.baseRotation() + 90, 0f, Mathf.lerp(Mathf.sin(mech.walkExtend(true), 1f/Mathf.PI, 1) * mechFrontSway, 0f, unit.elevation))); - float ft = Mathf.sin(legs.walkTime(), 3f, 3f); - legOffset.trns(legs.baseRotation(), 0f, Mathf.lerp(ft * 0.18f * sway, 0f, unit.elevation)); unit.trns(legOffset.x, legOffset.y); } @@ -286,8 +357,13 @@ public class UnitType extends UnlockableContent{ drawPayload((Unit & Payloadc)unit); } + //TODO drawOcclusion(unit); + Draw.z(z - outlineSpace); + + drawOutline(unit); + Draw.z(z); if(engineSize > 0) drawEngine(unit); drawBody(unit); @@ -300,16 +376,12 @@ public class UnitType extends UnlockableContent{ drawShield(unit); } - if(legs != null){ + if(mech != null){ unit.trns(-legOffset.x, -legOffset.y); } - if(unit.deactivated){ - drawDeactive(unit); - } - - if(abilities.size > 0){ - for(Ability a : abilities){ + if(unit.abilities.size > 0){ + for(Ability a : unit.abilities){ Draw.reset(); a.draw(unit); } @@ -318,16 +390,6 @@ public class UnitType extends UnlockableContent{ } } - public void drawDeactive(Unit unit){ - Draw.color(Color.scarlet); - Draw.alpha(0.8f); - - float size = 8f; - Draw.rect(Icon.warning.getRegion(), unit.x, unit.y, size, size); - - Draw.reset(); - } - public void drawPayload(T unit){ if(unit.hasPayload()){ Payload pay = unit.payloads().first(); @@ -352,7 +414,7 @@ public class UnitType extends UnlockableContent{ } public void drawShadow(Unit unit){ - Draw.color(shadowColor); + Draw.color(Pal.shadow); float e = Math.max(unit.elevation, visualElevation); Draw.rect(shadowRegion, unit.x + shadowTX * e, unit.y + shadowTY * e, unit.rotation - 90); Draw.color(); @@ -361,7 +423,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 +495,6 @@ public class UnitType extends UnlockableContent{ float rotation = unit.rotation - 90; float weaponRotation = rotation + (weapon.rotate ? mount.rotation : 0); - float width = weapon.region.getWidth(); float recoil = -((mount.reload) / weapon.reload * weapon.recoil); float wx = unit.x + Angles.trnsx(rotation, weapon.x, weapon.y) + Angles.trnsx(weaponRotation, 0, recoil), wy = unit.y + Angles.trnsy(rotation, weapon.x, weapon.y) + Angles.trnsy(weaponRotation, 0, recoil); @@ -442,19 +503,53 @@ public class UnitType extends UnlockableContent{ Drawf.shadow(wx, wy, weapon.occlusion); } - Draw.rect(weapon.region, wx, wy, - width * Draw.scl * -Mathf.sign(weapon.flipSprite), - weapon.region.getHeight() * Draw.scl, + if(weapon.outlineRegion.found()){ + float z = Draw.z(); + if(!weapon.top) Draw.z(z - outlineSpace); + + Draw.rect(weapon.outlineRegion, + wx, wy, + weapon.outlineRegion.width * Draw.scl * -Mathf.sign(weapon.flipSprite), + weapon.region.height * Draw.scl, + weaponRotation); + + Draw.z(z); + } + + Draw.rect(weapon.region, + wx, wy, + weapon.region.width * Draw.scl * -Mathf.sign(weapon.flipSprite), + weapon.region.height * Draw.scl, weaponRotation); + + if(weapon.heatRegion.found() && mount.heat > 0){ + Draw.color(weapon.heatColor, mount.heat); + Draw.blend(Blending.additive); + Draw.rect(weapon.heatRegion, + wx, wy, + weapon.heatRegion.width * Draw.scl * -Mathf.sign(weapon.flipSprite), + weapon.heatRegion.height * Draw.scl, + weaponRotation); + Draw.blend(); + Draw.color(); + } } Draw.reset(); } + public void drawOutline(Unit unit){ + Draw.reset(); + + if(Core.atlas.isFound(outlineRegion)){ + Draw.rect(outlineRegion, unit.x, unit.y, unit.rotation - 90); + } + } + public void drawBody(Unit unit){ applyColor(unit); - Draw.rect(region, unit, unit.rotation - 90); + Draw.rect(region, unit.x, unit.y, unit.rotation - 90); Draw.reset(); } @@ -463,7 +558,7 @@ public class UnitType extends UnlockableContent{ applyColor(unit); Draw.color(cellColor(unit)); - Draw.rect(cellRegion, unit, unit.rotation - 90); + Draw.rect(cellRegion, unit.x, unit.y, unit.rotation - 90); Draw.reset(); } @@ -473,29 +568,25 @@ public class UnitType extends UnlockableContent{ public void drawLight(Unit unit){ if(lightRadius > 0){ - Drawf.light(unit.team, unit, lightRadius, lightColor, lightOpacity); + Drawf.light(unit.team, unit.x, unit.y, lightRadius, lightColor, lightOpacity); } } 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){ Drawf.shadow(leg.base.x, leg.base.y, ssize); } - //TODO should be below/above legs - if(baseRegion.found()){ - Draw.rect(baseRegion, unit.x, unit.y, rotation); - } - - //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; @@ -508,18 +599,18 @@ public class UnitType extends UnlockableContent{ if(leg.moving && visualElevation > 0){ float scl = visualElevation; float elev = Mathf.slope(1f - leg.stage) * scl; - Draw.color(shadowColor); + Draw.color(Pal.shadow); Draw.rect(footRegion, leg.base.x + shadowTX * elev, leg.base.y + shadowTY * elev, position.angleTo(leg.base)); Draw.color(); } Draw.rect(footRegion, leg.base.x, leg.base.y, position.angleTo(leg.base)); - Lines.stroke(legRegion.getHeight() * Draw.scl * flips); - Lines.line(legRegion, position.x, position.y, leg.joint.x, leg.joint.y, false, 0); + Lines.stroke(legRegion.height * Draw.scl * flips); + Lines.line(legRegion, position.x, position.y, leg.joint.x, leg.joint.y, false); - Lines.stroke(legBaseRegion.getHeight() * Draw.scl * flips); - Lines.line(legBaseRegion, leg.joint.x + Tmp.v1.x, leg.joint.y + Tmp.v1.y, leg.base.x, leg.base.y, false, 0); + Lines.stroke(legBaseRegion.height * Draw.scl * flips); + Lines.line(legBaseRegion, leg.joint.x + Tmp.v1.x, leg.joint.y + Tmp.v1.y, leg.base.x, leg.base.y, false); if(jointRegion.found()){ Draw.rect(jointRegion, leg.joint.x, leg.joint.y); @@ -530,17 +621,23 @@ public class UnitType extends UnlockableContent{ } } + //TODO should be below/above legs + if(baseRegion.found()){ + Draw.rect(baseRegion, unit.x, unit.y, rotation - 90); + } + Draw.reset(); } - public void drawMech(T unit){ + public void drawMech(Mechc mech){ + Unit unit = (Unit)mech; + Draw.reset(); - Draw.mixcol(Color.white, unit.hitTime); - float e = unit.elevation; - float sin = Mathf.lerp(Mathf.sin(unit.walkTime(), 3f, 1f), 0f, e); - float ft = sin*(2.5f + (unit.hitSize-8f)/2f); + + float sin = Mathf.lerp(Mathf.sin(mech.walkExtend(true), 2f / Mathf.PI, 1f), 0f, e); + float extension = Mathf.lerp(mech.walkExtend(false), 0, e); float boostTrns = e * 2f; Floor floor = unit.isFlying() ? Blocks.air.asFloor() : unit.floorOn(); @@ -550,26 +647,31 @@ 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 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..2734dc3fca 100644 --- a/core/src/mindustry/type/Weapon.java +++ b/core/src/mindustry/type/Weapon.java @@ -2,12 +2,14 @@ package mindustry.type; import arc.*; import arc.audio.*; +import arc.graphics.*; import arc.graphics.g2d.*; import arc.util.ArcAnnotate.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.entities.bullet.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.io.*; public class Weapon{ @@ -25,6 +27,10 @@ public class Weapon{ public boolean alternate = true; /** whether to rotate toward the target independently of unit */ public boolean rotate = false; + /** whether to draw the outline on top. */ + public boolean top = true; + /** whether to hold the bullet in place while firing */ + public boolean continuous; /** rotation speed of weapon when rotation is enabled, in degrees/t*/ public float rotateSpeed = 20f; /** weapon reload in frames */ @@ -43,14 +49,20 @@ public class Weapon{ public float shootX = 0f, shootY = 3f; /** offsets of weapon position on unit */ public float x = 5f, y = 0f; + /** random spread on the X axis */ + public float xRand = 0f; /** radius of occlusion drawn under the weapon; <0 to diable */ public float occlusion = -1f; /** fraction of velocity that is random */ public float velocityRnd = 0f; /** delay in ticks between shots */ + public float firstShotDelay = 0; + /** delay in ticks between shots */ public float shotDelay = 0; /** The half-radius of the cone in which shooting will start. */ public float shootCone = 5f; + /** ticks to cool down the heat region */ + public float cooldownTime = 20f; /** whether shooter rotation is ignored when shooting. */ public boolean ignoreRotation = false; /** min velocity required for this weapon to shoot */ @@ -59,8 +71,20 @@ 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; + /** heat region, must be same size as region (optional) */ + public TextureRegion heatRegion; + /** outline region to display if top is false */ + public TextureRegion outlineRegion; + /** heat region tint */ + public Color heatColor = Pal.turretHeat; + /** status effect applied when shooting */ + public StatusEffect shootStatus = StatusEffects.none; + /** status effect duration when shot */ + public float shootStatusDuration = 60f * 5f; public Weapon(String name){ this.name = name; @@ -78,6 +102,8 @@ public class Weapon{ public void load(){ region = Core.atlas.find(name, Core.atlas.find("clear")); + heatRegion = Core.atlas.find(name + "-heat"); + outlineRegion = Core.atlas.find(name + "-outline"); } } diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index 163fa7f211..98d0a9f7e2 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -4,6 +4,7 @@ import arc.func.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.layout.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; @@ -14,9 +15,10 @@ import mindustry.world.blocks.*; import static mindustry.Vars.*; -public abstract class Weather extends MappableContent{ +public abstract class Weather extends UnlockableContent{ /** Default duration of this weather event in ticks. */ - public float duration = 9f * Time.toMinutes; + public float duration = 8f * Time.toMinutes; + public float opacityMultiplier = 1f; public Attributes attrs = new Attributes(); //internals @@ -89,14 +91,24 @@ public abstract class Weather extends MappableContent{ } + @Override + public void displayInfo(Table table){ + //do not + } + + @Override + public boolean isHidden(){ + return true; + } + @Override public ContentType getContentType(){ return ContentType.weather; } @Remote(called = Loc.server) - public static void createWeather(Weather weather, float intensity, float duration){ - weather.create(intensity, duration); + public static void createWeather(Weather weather, float intensity, float duration, float windX, float windY){ + weather.create(intensity, duration).windVector.set(windX, windY); } public static class WeatherEntry{ @@ -104,14 +116,14 @@ public abstract class Weather extends MappableContent{ public Weather weather; /** Minimum and maximum spacing between weather events. Does not include the time of the event itself. */ public float minFrequency, maxFrequency, minDuration, maxDuration; - /** Cooldown time before the next weather event takes place. */ + /** Cooldown time before the next weather event takes place This is *state*, not configuration. */ public float cooldown; /** Intensity of the weather produced. */ public float intensity = 1f; /** Creates a weather entry with some approximate weather values. */ public WeatherEntry(Weather weather){ - this(weather, weather.duration * 1f, weather.duration * 3f, weather.duration / 2f, weather.duration * 1.5f); + this(weather, weather.duration * 3f, weather.duration * 6f, weather.duration / 2f, weather.duration * 1.5f); } public WeatherEntry(Weather weather, float minFrequency, float maxFrequency, float minDuration, float maxDuration){ @@ -132,12 +144,12 @@ public abstract class Weather extends MappableContent{ @EntityDef(value = {WeatherStatec.class}, pooled = true, isFinal = false) @Component(base = true) - abstract static class WeatherStateComp implements Drawc{ + abstract static class WeatherStateComp implements Drawc, Syncc{ private static final float fadeTime = 60 * 4; Weather weather; float intensity = 1f, opacity = 0f, life, effectTimer; - Vec2 windVector = new Vec2(); + Vec2 windVector = new Vec2().setToRandomDirection(); void init(Weather weather){ this.weather = weather; @@ -146,15 +158,15 @@ public abstract class Weather extends MappableContent{ @Override public void update(){ if(life < fadeTime){ - opacity = life / fadeTime; + opacity = Math.min(life / fadeTime, opacity); }else{ opacity = Mathf.lerpDelta(opacity, 1f, 0.004f); } life -= Time.delta; - weather.update(base()); - weather.updateEffect(base()); + weather.update(self()); + weather.updateEffect(self()); if(life < 0){ remove(); @@ -166,15 +178,15 @@ public abstract class Weather extends MappableContent{ if(renderer.weatherAlpha() > 0.0001f){ Draw.draw(Layer.weather, () -> { weather.rand.setSeed(0); - Draw.alpha(renderer.weatherAlpha() * opacity); - weather.drawOver(base()); + Draw.alpha(renderer.weatherAlpha() * opacity * weather.opacityMultiplier); + weather.drawOver(self()); Draw.reset(); }); Draw.draw(Layer.debris, () -> { weather.rand.setSeed(0); - Draw.alpha(renderer.weatherAlpha() * opacity); - weather.drawUnder(base()); + Draw.alpha(renderer.weatherAlpha() * opacity * weather.opacityMultiplier); + weather.drawUnder(self()); Draw.reset(); }); } diff --git a/core/src/mindustry/ui/Bar.java b/core/src/mindustry/ui/Bar.java index 5cc23d27ca..d58ad53c37 100644 --- a/core/src/mindustry/ui/Bar.java +++ b/core/src/mindustry/ui/Bar.java @@ -21,7 +21,7 @@ public class Bar extends Element{ public Bar(String name, Color color, Floatp fraction){ this.fraction = fraction; - this.name = Core.bundle.get(name); + this.name = Core.bundle.get(name, name); this.blinkColor.set(color); lastValue = value = fraction.get(); setColor(color); @@ -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/ContentDisplay.java b/core/src/mindustry/ui/ContentDisplay.java index 9a3edace27..3e82412f0e 100644 --- a/core/src/mindustry/ui/ContentDisplay.java +++ b/core/src/mindustry/ui/ContentDisplay.java @@ -5,6 +5,7 @@ import arc.struct.*; import arc.graphics.*; import arc.scene.ui.layout.*; import arc.util.*; +import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; @@ -129,7 +130,7 @@ public class ContentDisplay{ public static void displayUnit(Table table, UnitType unit){ table.table(title -> { - title.image(unit.icon(Cicon.xlarge)).size(8 * 6); + title.image(unit.icon(Cicon.xlarge)).size(8 * 6).scaling(Scaling.fit); title.add("[accent]" + unit.localizedName).padLeft(5); }); @@ -149,10 +150,16 @@ public class ContentDisplay{ table.left().defaults().fillX(); - table.add(Core.bundle.format("unit.health", unit.health)); - table.row(); - table.add(Core.bundle.format("unit.speed", Strings.fixed(unit.speed, 1))); - table.row(); + Unit inst = unit.constructor.get(); + + //TODO more stats + table.add(Core.bundle.format("unit.health", unit.health)).row(); + table.add(Core.bundle.format("unit.speed", Strings.fixed(unit.speed, 1))).row(); + table.add(Core.bundle.format("unit.itemcapacity", unit.itemCapacity)).row(); + + if(inst instanceof Minerc) table.add(Core.bundle.format("unit.minespeed", (int)(unit.mineSpeed * 100f))).row(); + if(inst instanceof Builderc) table.add(Core.bundle.format("unit.buildspeed", (int)(unit.buildSpeed * 100f))).row(); + table.row(); } } diff --git a/core/src/mindustry/ui/CoreItemsDisplay.java b/core/src/mindustry/ui/CoreItemsDisplay.java index 13f91d6108..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,7 +27,7 @@ public class CoreItemsDisplay extends Table{ margin(4); update(() -> { - CoreBuild core = Vars.player.team().core(); + core = Vars.player.team().core(); if(content.items().contains(item -> core != null && core.items.get(item) > 0 && usedItems.add(item))){ rebuild(); @@ -35,11 +36,11 @@ public class CoreItemsDisplay extends Table{ 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..cbc0100943 100644 --- a/core/src/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -72,7 +72,7 @@ public class Fonts{ public static void loadContentIcons(){ Seq fonts = Seq.with(Fonts.chat, Fonts.def, Fonts.outline); - Texture uitex = Core.atlas.find("logo").getTexture(); + Texture uitex = Core.atlas.find("logo").texture; int size = (int)(Fonts.def.getData().lineHeight/Fonts.def.getData().scaleY); try(Scanner scan = new Scanner(Core.files.internal("icons/icons.properties").read(512))){ @@ -84,7 +84,7 @@ public class Fonts{ int ch = Integer.parseInt(character); TextureRegion region = Core.atlas.find(texture); - if(region.getTexture() != uitex){ + if(region.texture != uitex){ continue; //throw new IllegalArgumentException("Font icon '" + texture + "' is not in the UI texture."); } @@ -98,10 +98,10 @@ public class Fonts{ glyph.srcY = 0; glyph.width = size; glyph.height = size; - glyph.u = region.getU(); - glyph.v = region.getV2(); - glyph.u2 = region.getU2(); - glyph.v2 = region.getV(); + glyph.u = region.u; + glyph.v = region.v2; + glyph.u2 = region.u2; + glyph.v2 = region.v; glyph.xoffset = 0; glyph.yoffset = -size; glyph.xadvance = size; @@ -115,7 +115,9 @@ public class Fonts{ /** Called from a static context for use in the loading screen.*/ public static void loadDefaultFont(){ - UI.packer = new PixmapPacker(2048, 2048, Format.rgba8888, 2, true); + int max = Gl.getInt(Gl.maxTextureSize); + + UI.packer = new PixmapPacker(max >= 4096 ? 4096 : 2048, 2048, Format.rgba8888, 2, true); FileHandleResolver resolver = new InternalFileHandleResolver(); Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver)); Core.assets.setLoader(Font.class, null, new FreetypeFontLoader(resolver){ @@ -160,21 +162,21 @@ public class Fonts{ //grab all textures from the ui page, remove all the regions assigned to it, then copy them over to Fonts.packer and replace the texture in this atlas. //grab old UI texture and regions... - Texture texture = atlas.find("logo").getTexture(); + Texture texture = atlas.find("logo").texture; Page page = UI.packer.getPages().first(); - Seq regions = atlas.getRegions().select(t -> t.getTexture() == texture); + Seq regions = atlas.getRegions().select(t -> t.texture == texture); for(AtlasRegion region : regions){ //get new pack rect page.setDirty(false); Rect rect = UI.packer.pack(region.name + (region.splits != null ? ".9" : ""), atlas.getPixmap(region)); //set new texture - region.setTexture(UI.packer.getPages().first().getTexture()); + region.texture = UI.packer.getPages().first().getTexture(); //set its new position region.set((int)rect.x, (int)rect.y, (int)rect.width, (int)rect.height); //add old texture - atlas.getTextures().add(region.getTexture()); + atlas.getTextures().add(region.texture); } //remove old texture, it will no longer be used @@ -191,7 +193,7 @@ public class Fonts{ if(g == null) throw new IllegalArgumentException("No glyph: " + glyph + " (" + (int)glyph + ")"); float size = Math.max(g.width, g.height); - TextureRegionDrawable draw = new TextureRegionDrawable(new TextureRegion(font.getRegion().getTexture(), g.u, g.v2, g.u2, g.v)){ + TextureRegionDrawable draw = new TextureRegionDrawable(new TextureRegion(font.getRegion().texture, g.u, g.v2, g.u2, g.v)){ @Override public void draw(float x, float y, float width, float height){ Draw.color(Tmp.c1.set(tint).mul(Draw.getColor()).toFloatBits()); diff --git a/core/src/mindustry/ui/ItemDisplay.java b/core/src/mindustry/ui/ItemDisplay.java index 6407a95d0a..721fbc8b33 100644 --- a/core/src/mindustry/ui/ItemDisplay.java +++ b/core/src/mindustry/ui/ItemDisplay.java @@ -14,7 +14,7 @@ public class ItemDisplay extends Table{ } public ItemDisplay(Item item, int amount, boolean showName){ - add(new ItemImage(new ItemStack(item, amount))).size(8 * 4).padRight(amount > 99 ? 12 : 0); + add(new ItemImage(new ItemStack(item, amount))); if(showName) add(item.localizedName).padLeft(4 + amount > 99 ? 4 : 0); this.item = item; diff --git a/core/src/mindustry/ui/ItemImage.java b/core/src/mindustry/ui/ItemImage.java index aed8997f5f..fb26769c98 100644 --- a/core/src/mindustry/ui/ItemImage.java +++ b/core/src/mindustry/ui/ItemImage.java @@ -8,11 +8,17 @@ import mindustry.type.*; public class ItemImage extends Stack{ public ItemImage(TextureRegion region, int amount){ - Table t = new Table().left().bottom(); - t.add(amount + "").name("item-label"); - add(new Image(region)); - add(t); + add(new Table(o -> { + o.left(); + o.add(new Image(region)).size(32f); + })); + + add(new Table(t -> { + t.left().bottom(); + t.add(amount + ""); + t.pack(); + })); } public ItemImage(TextureRegion region){ @@ -23,12 +29,18 @@ public class ItemImage extends Stack{ } public ItemImage(ItemStack stack){ - add(new Image(stack.item.icon(Cicon.medium))); + + add(new Table(o -> { + o.left(); + o.add(new Image(stack.item.icon(Cicon.medium))).size(32f); + })); if(stack.amount != 0){ - Table t = new Table().left().bottom(); - t.add(stack.amount + "").name("item-label").style(Styles.outlineLabel); - add(t); + add(new Table(t -> { + t.left().bottom(); + t.add(stack.amount + "").style(Styles.outlineLabel); + t.pack(); + })); } } } diff --git a/core/src/mindustry/ui/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..68f61f1df2 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{ @@ -135,6 +140,7 @@ public class CustomRulesDialog extends BaseDialog{ title("@rules.title.resourcesbuilding"); check("@rules.infiniteresources", b -> rules.infiniteResources = b, () -> rules.infiniteResources); check("@rules.reactorexplosions", b -> rules.reactorExplosions = b, () -> rules.reactorExplosions); + check("@rules.schematic", b-> rules.schematicsAllowed = b, () -> rules.schematicsAllowed); number("@rules.buildcostmultiplier", false, f -> rules.buildCostMultiplier = f, () -> rules.buildCostMultiplier, () -> !rules.infiniteResources); number("@rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier); number("@rules.deconstructrefundmultiplier", false, f -> rules.deconstructRefundMultiplier = f, () -> rules.deconstructRefundMultiplier, () -> !rules.infiniteResources); @@ -143,6 +149,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 +166,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 +182,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 +221,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..1a718e318a 100644 --- a/core/src/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java @@ -1,12 +1,13 @@ package mindustry.ui.dialogs; import arc.*; -import arc.input.*; -import arc.struct.*; import arc.graphics.*; +import arc.input.*; +import arc.math.*; import arc.scene.event.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import mindustry.*; import mindustry.ctype.*; @@ -14,7 +15,7 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; -import static mindustry.Vars.ui; +import static mindustry.Vars.*; public class DatabaseDialog extends BaseDialog{ @@ -49,14 +50,13 @@ public class DatabaseDialog extends BaseDialog{ table.table(list -> { list.left(); - int maxWidth = Core.graphics.isPortrait() ? 7 : 13; - + int cols = Mathf.clamp((Core.graphics.getWidth() - 30) / (32 + 10), 1, 18); int count = 0; for(int i = 0; i < array.size; i++){ UnlockableContent unlock = (UnlockableContent)array.get(i); - Image image = unlocked(unlock) ? new Image(unlock.icon(Cicon.medium)) : new Image(Icon.lockOpen, Pal.gray); + Image image = unlocked(unlock) ? new Image(unlock.icon(Cicon.medium)).setScaling(Scaling.fit) : new Image(Icon.lock, Pal.gray); list.add(image).size(8*4).pad(3); ClickListener listener = new ClickListener(); image.addListener(listener); @@ -77,7 +77,7 @@ public class DatabaseDialog extends BaseDialog{ image.addListener(new Tooltip(t -> t.background(Tex.button).add(unlock.localizedName))); } - if((++count) % maxWidth == 0){ + if((++count) % cols == 0){ list.row(); } } diff --git a/core/src/mindustry/ui/dialogs/FileChooser.java b/core/src/mindustry/ui/dialogs/FileChooser.java index 78a3c1a459..2c8f2954b9 100644 --- a/core/src/mindustry/ui/dialogs/FileChooser.java +++ b/core/src/mindustry/ui/dialogs/FileChooser.java @@ -17,7 +17,7 @@ import java.util.*; public class FileChooser extends BaseDialog{ private static final Fi homeDirectory = Core.files.absolute(Core.files.getExternalStoragePath()); - static Fi lastDirectory = homeDirectory; + static Fi lastDirectory = Core.files.absolute(Core.settings.getString("lastDirectory", homeDirectory.absolutePath())); private Table files; Fi directory = lastDirectory; @@ -108,7 +108,7 @@ public class FileChooser extends BaseDialog{ ImageButton home = new ImageButton(Icon.home); home.clicked(() -> { directory = homeDirectory; - lastDirectory = directory; + setLastDirectory(directory); updateFiles(true); }); @@ -187,7 +187,7 @@ public class FileChooser extends BaseDialog{ TextButton upbutton = new TextButton(".." + directory.toString(), Styles.clearTogglet); upbutton.clicked(() -> { directory = directory.parent(); - lastDirectory = directory; + setLastDirectory(directory); updateFiles(true); }); @@ -217,7 +217,7 @@ public class FileChooser extends BaseDialog{ updateFileFieldStatus(); }else{ directory = directory.child(filename); - lastDirectory = directory; + setLastDirectory(directory); updateFiles(true); } }); @@ -242,6 +242,11 @@ public class FileChooser extends BaseDialog{ if(open) filefield.clearText(); } + public static void setLastDirectory(Fi directory){ + lastDirectory = directory; + Core.settings.put("lastDirectory", directory.absolutePath()); + } + private String shorten(String string){ int max = 30; if(string.length() <= max){ @@ -269,14 +274,14 @@ public class FileChooser extends BaseDialog{ if(!canBack()) return; index--; directory = history.get(index - 1); - lastDirectory = directory; + setLastDirectory(directory); updateFiles(false); } public void forward(){ if(!canForward()) return; directory = history.get(index); - lastDirectory = directory; + setLastDirectory(directory); index++; updateFiles(false); } diff --git a/core/src/mindustry/ui/dialogs/GameOverDialog.java b/core/src/mindustry/ui/dialogs/GameOverDialog.java index b53627b835..b9967e6564 100644 --- a/core/src/mindustry/ui/dialogs/GameOverDialog.java +++ b/core/src/mindustry/ui/dialogs/GameOverDialog.java @@ -29,7 +29,7 @@ public class GameOverDialog extends BaseDialog{ } void rebuild(){ - title.setText(state.launched ? "@launch.title" : "@gameover"); + title.setText("@gameover"); buttons.clear(); cont.clear(); @@ -79,7 +79,7 @@ public class GameOverDialog extends BaseDialog{ } if(state.hasSector()){ - RankResult result = state.stats.calculateRank(state.getSector(), state.launched); + RankResult result = state.stats.calculateRank(state.getSector(), true); t.add(Core.bundle.format("stat.rank", result.rank + result.modifier)); t.row(); } diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 92776ab729..1c80418708 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -30,6 +30,7 @@ public class JoinDialog extends BaseDialog{ Table global = new Table(); Table hosts = new Table(); int totalHosts; + int refreshes; public JoinDialog(){ super("@joingame"); @@ -95,6 +96,8 @@ public class JoinDialog extends BaseDialog{ } void refreshAll(){ + refreshes ++; + refreshLocal(); refreshRemote(); refreshGlobal(); @@ -262,14 +265,10 @@ public class JoinDialog extends BaseDialog{ cont.clear(); cont.table(t -> { t.add("@name").padRight(10); - if(!steam){ - t.field(Core.settings.getString("name"), text -> { - player.name(text); - Core.settings.put("name", text); - }).grow().pad(8).addInputDialog(maxNameLength); - }else{ - t.add(player.name).update(l -> l.setColor(player.color())).grow().pad(8); - } + t.field(Core.settings.getString("name"), text -> { + player.name(text); + Core.settings.put("name", text); + }).grow().pad(8).addInputDialog(maxNameLength); ImageButton button = t.button(Tex.whiteui, Styles.clearFulli, 40, () -> { new PaletteDialog().show(color -> { @@ -331,12 +330,15 @@ public class JoinDialog extends BaseDialog{ } void refreshGlobal(){ + int cur = refreshes; + global.clear(); global.background(null); for(String host : defaultServers){ String resaddress = host.contains(":") ? host.split(":")[0] : host; int resport = host.contains(":") ? Strings.parseInt(host.split(":")[1]) : port; net.pingHost(resaddress, resport, res -> { + if(refreshes != cur) return; res.port = resport; addGlobalHost(res); }, e -> {}); @@ -410,7 +412,7 @@ public class JoinDialog extends BaseDialog{ void safeConnect(String ip, int port, int version){ if(version != Version.build && Version.build != -1 && version != -1){ ui.showInfo("[scarlet]" + (version > Version.build ? KickReason.clientOutdated : KickReason.serverOutdated).toString() + "\n[]" + - Core.bundle.format("server.versions", Version.build, version)); + Core.bundle.format("server.versions", Version.build, version)); }else{ connect(ip, port); } @@ -431,7 +433,7 @@ public class JoinDialog extends BaseDialog{ } //get servers - Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonURL, result -> { + Core.net.httpGet(becontrol.active() ? serverJsonBeURL : serverJsonV6URL, result -> { try{ Jval val = Jval.read(result.getResultAsString()); Core.app.post(() -> { diff --git a/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java b/core/src/mindustry/ui/dialogs/LaunchLoadoutDialog.java index aacfb4a2dd..acb240d7c9 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.*; @@ -17,10 +18,8 @@ import static mindustry.Vars.*; /** Dialog for selecting loadout at sector launch. */ public class LaunchLoadoutDialog extends BaseDialog{ LoadoutDialog loadout = new LoadoutDialog(); - //total as a map - ObjectIntMap totalMap = new ObjectIntMap<>(); //total required items - Seq total = new Seq<>(); + ItemSeq total = new ItemSeq(); //currently selected schematic Schematic selected; //validity of loadout items @@ -33,21 +32,14 @@ public class LaunchLoadoutDialog extends BaseDialog{ public void show(CoreBlock core, Building build, Runnable confirm){ cont.clear(); buttons.clear(); - totalMap.clear(); - - Seq stacks = universe.getLaunchResources(); addCloseButton(); //updates sum requirements Runnable update = () -> { - totalMap.clear(); total.clear(); - selected.requirements().each(i -> totalMap.increment(i.item, i.amount)); - universe.getLaunchResources().each(i -> totalMap.increment(i.item, i.amount)); - for(Item item : content.items()){ - if(totalMap.containsKey(item)) total.add(new ItemStack(item, totalMap.get(item))); - } + selected.requirements().each(total::add); + universe.getLaunchResources().each(total::add); valid = build.items.has(total); }; @@ -55,10 +47,18 @@ public class LaunchLoadoutDialog extends BaseDialog{ table.clearChildren(); int i = 0; + ItemSeq schems = selected.requirements(); + ItemSeq launches = universe.getLaunchResources(); + for(ItemStack s : total){ table.image(s.item.icon(Cicon.small)).left(); - table.add((build.items.has(s.item, s.amount)) ? "[lightgray]" + s.amount + "" : - "[scarlet]" + (Math.min(build.items.get(s.item), s.amount) + "[lightgray]/" + s.amount)).padLeft(2).left().padRight(4); + int as = schems.get(s.item), al = launches.get(s.item); + + String amountStr = "[lightgray]" + (al + " + [accent]" + as + "[lightgray]"); + + table.add( + build.items.has(s.item, s.amount) ? amountStr : + "[scarlet]" + (Math.min(build.items.get(s.item), s.amount) + "[lightgray]/" + amountStr)).padLeft(2).left().padRight(4); if(++i % 4 == 0){ table.row(); @@ -71,8 +71,11 @@ public class LaunchLoadoutDialog extends BaseDialog{ Runnable rebuildItems = () -> rebuild.get(items); buttons.button("@resources", Icon.terrain, () -> { - loadout.show(core.itemCapacity, stacks, stacks::clear, () -> {}, () -> { - universe.updateLaunchResources(stacks); + ItemSeq stacks = universe.getLaunchResources(); + Seq out = stacks.toSeq(); + + loadout.show(core.itemCapacity, out, UnlockableContent::unlocked, out::clear, () -> {}, () -> { + universe.updateLaunchResources(new ItemSeq(out)); update.run(); rebuildItems.run(); }); diff --git a/core/src/mindustry/ui/dialogs/LoadDialog.java b/core/src/mindustry/ui/dialogs/LoadDialog.java index 2d3f653fab..6e2e56e2d8 100644 --- a/core/src/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/mindustry/ui/dialogs/LoadDialog.java @@ -104,7 +104,7 @@ public class LoadDialog extends BaseDialog{ button.left().add(new BorderImage(def, 4f)).update(im -> { TextureRegionDrawable draw = (TextureRegionDrawable)im.getDrawable(); - if(draw.getRegion().getTexture().isDisposed()){ + if(draw.getRegion().texture.isDisposed()){ draw.setRegion(def); } diff --git a/core/src/mindustry/ui/dialogs/LoadoutDialog.java b/core/src/mindustry/ui/dialogs/LoadoutDialog.java index e2543903ed..d818f5ecda 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.*; @@ -15,8 +16,10 @@ public class LoadoutDialog extends BaseDialog{ private Runnable hider; private Runnable resetter; private Runnable updater; + //TODO use itemseqs private Seq stacks = new Seq<>(); private Seq originalStacks = new Seq<>(); + private Boolf validator = i -> true; private Table items; private int capacity; @@ -51,13 +54,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 +110,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/MapsDialog.java b/core/src/mindustry/ui/dialogs/MapsDialog.java index 24b1cf3609..c03c01e799 100644 --- a/core/src/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/mindustry/ui/dialogs/MapsDialog.java @@ -54,7 +54,7 @@ public class MapsDialog extends BaseDialog{ Runnable show = () -> ui.loadAnd(() -> { hide(); ui.editor.show(); - ui.editor.editor.getTags().put("name", text); + ui.editor.editor.tags.put("name", text); Events.fire(new MapMakeEvent()); }); diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index f674fa5f86..4695091886 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -162,11 +162,17 @@ public class ModsDialog extends BaseDialog{ }}).size(h - 8f).padTop(-8f).padLeft(-8f).padRight(8f); title.table(text -> { - text.add("" + mod.meta.displayName() + "\n[lightgray]v" + mod.meta.version + (mod.enabled() ? "" : "\n" + Core.bundle.get("mod.disabled") + "")) + boolean hideDisabled = !mod.isSupported() || mod.hasUnmetDependencies() || mod.hasContentErrors(); + + text.add("" + mod.meta.displayName() + "\n[lightgray]v" + mod.meta.version + (mod.enabled() || hideDisabled ? "" : "\n" + Core.bundle.get("mod.disabled") + "")) .wrap().top().width(300f).growX().left(); text.row(); - if(!mod.isSupported()){ + + if(mod.isOutdated()){ + text.labelWrap("@mod.outdated").growX(); + text.row(); + }else if(!mod.isSupported()){ text.labelWrap(Core.bundle.format("mod.requiresversion", mod.meta.minGameVersion)).growX(); text.row(); }else if(mod.hasUnmetDependencies()){ diff --git a/core/src/mindustry/ui/dialogs/PausedDialog.java b/core/src/mindustry/ui/dialogs/PausedDialog.java index ae91f18f10..559450a591 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.showLaunch(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..11b12cf0a5 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -1,6 +1,7 @@ package mindustry.ui.dialogs; import arc.*; +import arc.func.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.graphics.gl.*; @@ -29,17 +30,18 @@ import static mindustry.graphics.g3d.PlanetRenderer.*; import static mindustry.ui.dialogs.PlanetDialog.Mode.*; public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ - private final FrameBuffer buffer = new FrameBuffer(2, 2, true); + final FrameBuffer buffer = new FrameBuffer(2, 2, true); final PlanetRenderer planets = renderer.planets; - private final LaunchLoadoutDialog loadouts = new LaunchLoadoutDialog(); - private final Table stable = new Table().background(Styles.black3); + final LaunchLoadoutDialog loadouts = new LaunchLoadoutDialog(); + final Table stable = new Table().background(Styles.black3); - private int launchRange; - private float zoom = 1f, selectAlpha = 1f; + int launchRange; + float zoom = 1f, selectAlpha = 1f; @Nullable Sector selected, hovered, launchSector; - private CoreBuild launcher; + CoreBuild launcher; Mode mode = look; - private boolean launching; + boolean launching; + Cons listener = s -> {}; public PlanetDialog(){ super("", Styles.fullDialog); @@ -93,7 +95,27 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ return super.show(); } - public void show(Sector sector, CoreBuild launcher){ + public void showSelect(Sector sector, Cons listener){ + selected = null; + hovered = null; + launching = false; + this.listener = listener; + + //update view to sector + lookAt(sector); + zoom = 1f; + planets.zoom = 2f; + selectAlpha = 0f; + launchSector = sector; + + mode = select; + + super.show(); + } + + public void showLaunch(Sector sector, CoreBuild launcher){ + if(launcher == null) return; + this.launcher = launcher; selected = null; hovered = null; @@ -116,7 +138,9 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ planets.camPos.set(Tmp.v33.set(sector.tile.v).rotate(Vec3.Y, -sector.planet.getRotation())); } - boolean canLaunch(Sector sector){ + boolean canSelect(Sector sector){ + if(mode == select) return sector.hasBase(); + return mode == launch && (sector.tile.v.within(launchSector.tile.v, (launchRange + 0.5f) * planets.planet.sectorApproxRadius*2) //within range || (sector.preset != null && sector.preset.unlocked())); //is an unlocked preset @@ -127,10 +151,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(canSelect(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 = @@ -166,8 +191,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ planets.batch.flush(Gl.triangles); - if(mode == launch){ - if(hovered != launchSector && hovered != null && canLaunch(hovered)){ + if(mode == launch || mode == select){ + if(hovered != launchSector && hovered != null && canSelect(hovered)){ planets.drawArc(planet, launchSector.tile.v, hovered.tile.v); } } @@ -190,7 +215,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ planets.drawPlane(hovered, () -> { Draw.color(Color.white, Pal.accent, Mathf.absin(5f, 1f)); - TextureRegion icon = hovered.locked() && !canLaunch(hovered) ? Icon.lock.getRegion() : null; + TextureRegion icon = hovered.locked() && !canSelect(hovered) ? Icon.lock.getRegion() : null; if(icon != null){ Draw.rect(icon, 0, 0); @@ -216,7 +241,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ addListener(new ElementGestureListener(){ @Override public void tap(InputEvent event, float x, float y, int count, KeyCode button){ - if(hovered != null && (mode == launch ? canLaunch(hovered) && hovered != launchSector : hovered.unlocked())){ + if(hovered != null && (mode == launch ? canSelect(hovered) && hovered != launchSector : hovered.unlocked())){ selected = hovered; } @@ -236,7 +261,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ new Table(t -> { //TODO localize t.top(); - t.label(() -> mode == launch ? "Select Launch Sector" : "Turn " + universe.turn()).style(Styles.outlineLabel).color(Pal.accent); + t.label(() -> mode == select ? "@sectors.select" : mode == launch ? "Select Launch Sector" : "Turn " + universe.turn()).style(Styles.outlineLabel).color(Pal.accent); })).grow(); } @@ -290,7 +315,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,29 +329,43 @@ 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.table(t -> { - t.left(); - int idx = 0; - int max = 5; - for(UnlockableContent c : sector.data.resources){ - t.image(c.icon(Cicon.small)).padRight(3); - if(++idx % max == 0) t.row(); - } - }).fillX().row(); + if(sector.save != null){ + stable.add("@sectors.resources").row(); + stable.table(t -> { + + if(sector.save != null && sector.save.meta.secinfo != null && sector.save.meta.secinfo.resources.any()){ + t.left(); + int idx = 0; + int max = 5; + for(UnlockableContent c : sector.save.meta.secinfo.resources){ + t.image(c.icon(Cicon.small)).padRight(3); + if(++idx % max == 0) t.row(); + } + }else{ + t.add("@unknown").color(Color.lightGray); + } + + + }).fillX().row(); + } //production if(sector.hasBase() && sector.save.meta.hasProduction){ - stable.add("Production:").row(); + stable.add("@sectors.production").row(); stable.table(t -> { t.left(); @@ -335,7 +373,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 +382,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(); @@ -366,13 +404,13 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ stable.row(); - if((sector.hasBase() && mode == look) || canLaunch(sector) || (sector.preset != null && sector.preset.alwaysUnlocked)){ - stable.button(sector.hasBase() ? "Resume" : "Launch", Styles.transt, () -> { + if((sector.hasBase() && mode == look) || canSelect(sector) || (sector.preset != null && sector.preset.alwaysUnlocked)){ + stable.button(mode == select ? "@sectors.select" : sector.hasBase() ? "@sectors.resume" : "@sectors.launch", Styles.transt, () -> { boolean shouldHide = true; //save before launch. - if(control.saves.getCurrent() != null && state.isGame()){ + if(control.saves.getCurrent() != null && state.isGame() && mode != select){ try{ control.saves.getCurrent().save(); }catch(Throwable e){ @@ -392,12 +430,14 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ ui.hudfrag.showLaunchDirect(); Time.runTask(launchDuration, () -> control.playSector(current, sector)); }); + }else if(mode == select){ + listener.get(sector); }else{ control.playSector(sector); } if(shouldHide) hide(); - }).growX().padTop(2f).height(50f).minWidth(170f); + }).growX().padTop(2f).height(50f).minWidth(170f).disabled(b -> state.rules.sector == sector && !state.isMenu()); } stable.pack(); @@ -428,6 +468,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ /** Look around for existing sectors. Can only deploy. */ look, /** Launch to a new location. */ - launch + launch, + /** Select a sector for some purpose. */ + select } } diff --git a/core/src/mindustry/ui/dialogs/ResearchDialog.java b/core/src/mindustry/ui/dialogs/ResearchDialog.java index 8fc2c387c7..155b6db9c4 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{ } }); - view.addListener(new ElementGestureListener(){ + touchable = Touchable.enabled; + + addCaptureListener(new ElementGestureListener(){ @Override public void zoom(InputEvent event, float initialDistance, float distance){ if(view.lastZoom < 0){ @@ -161,6 +163,19 @@ public class ResearchDialog extends BaseDialog{ }); } + @Override + public Dialog show(){ + Core.app.post(() -> { + if(net.client()){ + //TODO make this not display every time + //TODO rework this in the future + ui.showInfo("@campaign.multiplayer"); + } + }); + + return super.show(); + } + void treeLayout(){ float spacing = 20f; LayoutNode node = new LayoutNode(root, null); @@ -338,7 +353,7 @@ public class ResearchDialog extends BaseDialog{ button.update(() -> { float offset = (Core.graphics.getHeight() % 2) / 2f; button.setPosition(node.x + panX + width / 2f, node.y + panY + height / 2f + offset, Align.center); - button.getStyle().up = !locked(node.node) ? Tex.buttonOver : selectable(node.node) && !canSpend(node.node) ? Tex.buttonRed : Tex.button; + button.getStyle().up = !locked(node.node) ? Tex.buttonOver : !selectable(node.node) || !canSpend(node.node) ? Tex.buttonRed : Tex.button; ((TextureRegionDrawable)button.getStyle().imageUp).setRegion(node.selectable ? node.node.content.icon(Cicon.medium) : Icon.lock.getRegion()); button.getImage().setColor(!locked(node.node) ? Color.white : node.selectable ? Color.gray : Pal.gray); @@ -375,8 +390,18 @@ public class ResearchDialog extends BaseDialog{ } boolean canSpend(TechNode node){ - //can spend when there's at least 1 item that can be spent - return selectable(node) && (node.requirements.length == 0 || Structs.contains(node.requirements, i -> items.has(i.item))); + if(!selectable(node)) return false; + + if(node.requirements.length == 0) return true; + + //can spend when there's at least 1 item that can be spent (non complete) + for(int i = 0; i < node.requirements.length; i++){ + if(node.finishedRequirements[i].amount < node.requirements[i].amount && items.has(node.requirements[i].item)){ + return true; + } + } + + return false; } void spend(TechNode node){ diff --git a/core/src/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/mindustry/ui/dialogs/SchematicsDialog.java index 3d920d1f14..7a2afbbd1e 100644 --- a/core/src/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/mindustry/ui/dialogs/SchematicsDialog.java @@ -10,8 +10,8 @@ import arc.scene.ui.*; import arc.scene.ui.ImageButton.*; import arc.scene.ui.TextButton.*; import arc.scene.ui.layout.*; -import arc.struct.*; import arc.util.*; +import mindustry.Vars; import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -64,8 +64,12 @@ public class SchematicsDialog extends BaseDialog{ t.update(() -> { if(Core.input.keyTap(Binding.chat) && Core.scene.getKeyboardFocus() == searchField && firstSchematic != null){ - control.input.useSchematic(firstSchematic); - hide(); + if(!Vars.state.rules.schematicsAllowed){ + ui.showInfo("@schematic.disabled"); + }else{ + control.input.useSchematic(firstSchematic); + hide(); + } } }); @@ -146,8 +150,12 @@ public class SchematicsDialog extends BaseDialog{ if(state.isMenu()){ showInfo(s); }else{ - control.input.useSchematic(s); - hide(); + if(!Vars.state.rules.schematicsAllowed){ + ui.showInfo("@schematic.disabled"); + }else{ + control.input.useSchematic(s); + hide(); + } } }).pad(4).style(Styles.cleari).get(); @@ -333,7 +341,7 @@ public class SchematicsDialog extends BaseDialog{ cont.add(new SchematicImage(schem)).maxSize(800f); cont.row(); - Seq arr = schem.requirements(); + ItemSeq arr = schem.requirements(); cont.table(r -> { int i = 0; for(ItemStack s : arr){ diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index 10cd96366f..8dd9753fda 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -86,14 +86,14 @@ public class SettingsMenuDialog extends SettingsDialog{ dataDialog.addCloseButton(); dataDialog.cont.table(Tex.button, t -> { - t.defaults().size(270f, 60f).left(); + t.defaults().size(280f, 60f).left(); TextButtonStyle style = Styles.cleart; t.button("@settings.cleardata", Icon.trash, style, () -> ui.showConfirm("@confirm", "@settings.clearall.confirm", () -> { ObjectMap map = new ObjectMap<>(); for(String value : Core.settings.keys()){ if(value.contains("usid") || value.contains("uuid")){ - map.put(value, Core.settings.getString(value)); + map.put(value, Core.settings.get(value, null)); } } Core.settings.clear(); @@ -419,6 +419,9 @@ public class SettingsMenuDialog extends SettingsDialog{ zipped.walk(f -> f.copyTo(base.child(f.path()))); dest.delete(); + + //load data so it's saved on exit + settings.load(); } private void back(){ diff --git a/core/src/mindustry/ui/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..f0f83b8be2 100644 --- a/core/src/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/mindustry/ui/fragments/ChatFragment.java @@ -57,12 +57,12 @@ public class ChatFragment extends Table{ } } - return net.active(); + return net.active() && ui.hudfrag.shown(); }); 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(); } @@ -227,6 +227,7 @@ public class ChatFragment extends Table{ } public void addMessage(String message, String sender){ + if(sender == null && message == null) return; messages.insert(0, new ChatMessage(message, sender)); fadetime += 1f; @@ -244,7 +245,7 @@ public class ChatFragment extends Table{ this.message = message; this.sender = sender; if(sender == null){ //no sender, this is a server message? - formattedMessage = message; + formattedMessage = message == null ? "" : message; }else{ formattedMessage = "[coral][[" + sender + "[coral]]:[white] " + message; } diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index d1eae438a2..a1cd52354d 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -1,8 +1,9 @@ package mindustry.ui.fragments; import arc.*; +import arc.func.*; import arc.graphics.*; -import arc.input.*; +import arc.graphics.g2d.*; import arc.math.*; import arc.scene.*; import arc.scene.actions.*; @@ -24,15 +25,18 @@ import mindustry.input.*; import mindustry.net.Packets.*; import mindustry.type.*; import mindustry.ui.*; -import mindustry.ui.dialogs.*; import static mindustry.Vars.*; public class HudFragment extends Fragment{ - private static final float dsize = 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 +68,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 +135,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 +160,52 @@ 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{ + 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 +221,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 +277,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 +346,7 @@ public class HudFragment extends Fragment{ }); //TODO DEBUG: rate table + if(false) parent.fill(t -> { t.bottom().left(); t.table(Styles.black6, c -> { @@ -554,40 +572,6 @@ public class HudFragment extends Fragment{ Core.scene.add(image); } - private void showLaunchConfirm(){ - BaseDialog dialog = new BaseDialog("@launch"); - dialog.update(() -> { - if(!inLaunchWave()){ - dialog.hide(); - } - }); - dialog.cont.add("@launch.confirm").width(500f).wrap().pad(4f).get().setAlignment(Align.center, Align.center); - dialog.buttons.defaults().size(200f, 54f).pad(2f); - dialog.setFillParent(false); - dialog.buttons.button("@cancel", dialog::hide); - dialog.buttons.button("@ok", () -> { - dialog.hide(); - Call.launchZone(); - }); - dialog.keyDown(KeyCode.escape, dialog::hide); - dialog.keyDown(KeyCode.back, dialog::hide); - dialog.show(); - } - - //TODO launching is disabled, possibly forever - private boolean inLaunchWave(){ - return false; - /* - return state.hasSector() && - state.getSector().metCondition() && - !net.client() && - state.wave % state.getSector().launchPeriod == 0 && !spawner.isSpawning();*/ - } - - private boolean canLaunch(){ - return inLaunchWave() && state.enemies <= 0; - } - private void toggleMenus(){ if(flip != null){ flip.getStyle().imageUp = shown ? Icon.downOpen : Icon.upOpen; @@ -596,7 +580,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,27 +609,111 @@ public class HudFragment extends Fragment{ StringBuilder builder = new StringBuilder(); table.name = "waves"; + + table.marginTop(0).marginBottom(4).marginLeft(4); + + class SideBar extends Element{ + public final Floatp amount; + public final boolean flip; + public final Boolp flash; + + float last, blink, value; + + public SideBar(Floatp amount, Boolp flash, boolean flip){ + this.amount = amount; + this.flip = flip; + this.flash = flash; + + setColor(Pal.health); + } + + @Override + public void draw(){ + float next = amount.get(); + + if(next < last && flash.get()){ + blink = 1f; + } + + blink = Mathf.lerpDelta(blink, 0f, 0.2f); + value = Mathf.lerpDelta(value, next, 0.15f); + last = next; + + drawInner(Pal.darkishGray); + + Draw.beginStencil(); + + Fill.crect(x, y, width, height * value); + + Draw.beginStenciled(); + + drawInner(Tmp.c1.set(color).lerp(Color.white, blink)); + + Draw.endStencil(); + } + + void drawInner(Color color){ + if(flip){ + x += width; + width = -width; + } + + float stroke = width * 0.35f; + float bh = height/2f; + Draw.color(color); + + Fill.quad( + x, y, + x + stroke, y, + x + width, y + bh, + x + width - stroke, y + bh + ); + + Fill.quad( + x + width, y + bh, + x + width - stroke, y + bh, + x, y + height, + x + stroke, y + height + ); + + Draw.reset(); + + if(flip){ + width = -width; + x -= width; + } + } + } + + table.stack( + new Element(){ + @Override + public void draw(){ + Draw.color(Pal.darkerGray); + Fill.poly(x + width/2f, y + height/2f, 6, height / Mathf.sqrt3); + Draw.reset(); + Drawf.shadow(x + width/2f, y + height/2f, height * 1.13f); + } + }, + new Table(t -> { + float bw = 40f; + float pad = -20; + t.margin(0); + + t.add(new SideBar(() -> player.unit().healthf(), () -> true, true)).width(bw).growY().padRight(pad); + t.image(() -> player.icon()).scaling(Scaling.bounded).grow().maxWidth(54f); + t.add(new SideBar(() -> player.dead() ? 0f : player.displayAmmo() ? player.unit().ammof() : player.unit().healthf(), () -> !player.displayAmmo(), false)).width(bw).growY().padLeft(pad).update(b -> { + b.color.set(player.displayAmmo() ? player.dead() ? Pal.ammo : player.unit().type().ammoType.color : Pal.health); + }); + + t.getChildren().get(1).toFront(); + })).size(120f, 80).padRight(4); + table.labelWrap(() -> { builder.setLength(0); builder.append(wavef.get(state.wave)); builder.append("\n"); - if(inLaunchWave()){ - builder.append("[#"); - Tmp.c1.set(Color.white).lerp(state.enemies > 0 ? Color.white : Color.scarlet, Mathf.absin(Time.time(), 2f, 1f)).toString(builder); - builder.append("]"); - - if(!canLaunch()){ - builder.append(Core.bundle.get("launch.unable2")); - }else{ - builder.append(Core.bundle.get("launch")); - builder.append("\n"); - builder.append(Core.bundle.format("launch.next", state.wave + state.getSector().launchPeriod)); - builder.append("\n"); - } - builder.append("[]\n"); - } - if(state.enemies > 0){ if(state.enemies == 1){ builder.append(enemyf.get(state.enemies)); @@ -662,29 +732,14 @@ public class HudFragment extends Fragment{ return builder; }).growX().pad(8f); - table.setDisabled(() -> !canLaunch()); + table.setDisabled(true); table.visible(() -> state.rules.waves); - table.clicked(() -> { - if(canLaunch()){ - showLaunchConfirm(); - } - }); + + return table; } private boolean canSkipWave(){ return state.rules.waves && ((net.server() || player.admin) || !net.active()) && state.enemies == 0 && !spawner.isSpawning() && !state.rules.tutorial; } - private void addPlayButton(Table table){ - table.right().button(Icon.play, Styles.righti, 30f, () -> { - if(net.client() && player.admin){ - Call.adminRequest(player, AdminAction.wave); - }else if(inLaunchWave()){ - ui.showConfirm("@confirm", "@launch.skip.confirm", () -> !canSkipWave(), () -> logic.skipWave()); - }else{ - logic.skipWave(); - } - }).growY().fillX().right().width(40f) - .visible(this::canSkipWave); - } } diff --git a/core/src/mindustry/ui/fragments/MenuFragment.java b/core/src/mindustry/ui/fragments/MenuFragment.java index f66a6c7777..45faa9bf10 100644 --- a/core/src/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/mindustry/ui/fragments/MenuFragment.java @@ -73,13 +73,12 @@ public class MenuFragment extends Fragment{ })); } - String versionText = "[#ffffffba]" + ((Version.build == -1) ? "[#fc8140aa]custom build" : (Version.type.equals("official") ? Version.modifier : Version.type) + " build " + Version.build + (Version.revision == 0 ? "" : "." + Version.revision)); - + String versionText = ((Version.build == -1) ? "[#fc8140aa]" : "[#ffffffba]") + Version.combined(); parent.fill((x, y, w, h) -> { TextureRegion logo = Core.atlas.find("logo"); float logoscl = Scl.scl(1); - float logow = Math.min(logo.getWidth() * logoscl, Core.graphics.getWidth() - Scl.scl(20)); - float logoh = logow * (float)logo.getHeight() / logo.getWidth(); + float logow = Math.min(logo.width * logoscl, Core.graphics.getWidth() - Scl.scl(20)); + float logoh = logow * (float)logo.height / logo.width; float fx = (int)(Core.graphics.getWidth() / 2f); float fy = (int)(Core.graphics.getHeight() - 6 - logoh) + logoh / 2 - (Core.graphics.isPortrait() ? Scl.scl(30f) : 0f); diff --git a/core/src/mindustry/ui/fragments/MinimapFragment.java b/core/src/mindustry/ui/fragments/MinimapFragment.java index 68ac728af7..7c9d3b5994 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().width; TextureRegion reg = Draw.wrap(renderer.minimap.getTexture()); Draw.rect(reg, w/2f + panx*zoom, h/2f + pany*zoom, size, size * ratio); renderer.minimap.drawEntities(w/2f + panx*zoom - size/2f, h/2f + pany*zoom - size/2f * ratio, size, size * ratio, zoom, true); @@ -113,7 +113,7 @@ public class MinimapFragment extends Fragment{ public void toggle(){ if(Core.settings.getBool("mapcenter")){ float size = baseSize * zoom * world.width(); - float ratio = (float)renderer.minimap.getTexture().getHeight() / renderer.minimap.getTexture().getWidth(); + float ratio = (float)renderer.minimap.getTexture().height / renderer.minimap.getTexture().width; panx = (size/2f - player.x() / (world.width() * tilesize) * size) / zoom; pany = (size*ratio/2f - player.y() / (world.height() * tilesize) * size*ratio) / zoom; } diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 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..c7b07fe401 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -15,6 +15,7 @@ import arc.util.*; import arc.util.ArcAnnotate.*; import arc.util.pooling.*; import mindustry.annotations.Annotations.*; +import mindustry.core.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.units.*; @@ -56,6 +57,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 +196,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; @@ -204,6 +209,7 @@ public class Block extends UnlockableContent{ public @Load("@-team") TextureRegion teamRegion; public TextureRegion[] teamRegions; + //TODO make this not static public static TextureRegion[][] cracks; protected static final Seq tempTiles = new Seq<>(); protected static final Seq tempTileEnts = new Seq<>(); @@ -215,7 +221,7 @@ public class Block extends UnlockableContent{ public Block(String name){ super(name); - initEntity(); + initBuilding(); } public void drawBase(Tile tile){ @@ -364,6 +370,7 @@ public class Block extends UnlockableContent{ } public boolean canReplace(Block other){ + if(other.alwaysReplace) return true; return (other != this || rotate) && this.group != BlockGroup.none && other.group == this.group && size == other.size; } @@ -372,6 +379,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 +401,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); } } @@ -486,12 +500,12 @@ public class Block extends UnlockableContent{ return variantRegions; } - public boolean hasEntity(){ + public boolean hasBuilding(){ return destructible || update; } - public final Building newEntity(){ - return entityType.get(); + public final Building newBuilding(){ + return buildType.get(); } public Rect bounds(int x, int y, Rect rect){ @@ -567,7 +581,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 +590,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,12 +612,24 @@ public class Block extends UnlockableContent{ }catch(Throwable ignored){ } - if(entityType == null){ + if(buildType == null){ //assign default value - entityType = Building::create; + buildType = Building::create; } } + @Override + public ItemStack[] researchRequirements(){ + ItemStack[] out = new ItemStack[requirements.length]; + for(int i = 0; i < out.length; i++){ + int quantity = 40 + Mathf.round(Mathf.pow(requirements[i].amount, 1.25f) * 20, 10); + + out[i] = new ItemStack(requirements[i].item, UI.roundAmount(quantity)); + } + + return out; + } + @Override public void getDependencies(Cons cons){ //just requires items @@ -662,7 +688,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..15c7decbcf 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.size == sub.size ? previous : Blocks.air, result); result.placeBegan(tile, previous); @@ -68,8 +68,13 @@ public class Build{ /** Returns whether a tile can be placed at this location by this team. */ public static boolean validPlace(Block type, Team team, int x, int y, int rotation){ + return validPlace(type, team, x, y, rotation, true); + } + + /** Returns whether a tile can be placed at this location by this team. */ + public static boolean validPlace(Block type, Team team, int x, int y, int rotation, boolean checkVisible){ //the wave team can build whatever they want as long as it's visible - banned blocks are not applicable - if(type == null || (!type.isPlaceable() && !(state.rules.waves && team == state.rules.waveTeam && type.isVisible()))){ + if(type == null || (checkVisible && (!type.isPlaceable() && !(state.rules.waves && team == state.rules.waveTeam && type.isVisible())))){ return false; } @@ -90,65 +95,37 @@ public class Build{ return false; } - if(type.isMultiblock()){ - if((type.canReplace(tile.block()) || (tile.block instanceof BuildBlock && tile.bc().cblock == type)) && - type.canPlaceOn(tile, team) && tile.interactable(team)){ - - //if the block can be replaced but the sizes differ, check all the spaces around the block to make sure it can fit - if(type.size != tile.block().size){ - int offsetx = -(type.size - 1) / 2; - int offsety = -(type.size - 1) / 2; - - //this does not check *all* the conditions for placeability yet - for(int dx = 0; dx < type.size; dx++){ - for(int dy = 0; dy < type.size; dy++){ - int wx = dx + offsetx + x, wy = dy + offsety + y; - - Tile check = world.tile(wx, wy); - if(check == null || (!check.block.alwaysReplace && check.block != tile.block)) return false; - } - } - } - - //make sure that the new block can fit the old one - return type.bounds(x, y, Tmp.r1).grow(0.01f).contains(tile.block.bounds(tile.centerX(), tile.centerY(), Tmp.r2)); - } - - if(!type.requiresWater && !contactsShallows(tile.x, tile.y, type) && !type.placeableLiquid){ - return false; - } - - if(!type.canPlaceOn(tile, team)){ - return false; - } - - int offsetx = -(type.size - 1) / 2; - int offsety = -(type.size - 1) / 2; - for(int dx = 0; dx < type.size; dx++){ - for(int dy = 0; dy < type.size; dy++){ - Tile other = world.tile(x + dx + offsetx, y + dy + offsety); - if( - other == null || - !other.block().alwaysReplace || - !other.floor().placeableOn || - (other.floor().isDeep() && !type.floating && !type.requiresWater && !type.placeableLiquid) || - (type.requiresWater && tile.floor().liquidDrop != Liquids.water) - ){ - return false; - } - } - } - return true; - }else{ - return tile.interactable(team) - && (contactsShallows(tile.x, tile.y, type) || type.requiresWater || type.placeableLiquid) - && (!tile.floor().isDeep() || type.floating || type.requiresWater || type.placeableLiquid) - && tile.floor().placeableOn - && (!type.requiresWater || tile.floor().liquidDrop == Liquids.water) - && (((type.canReplace(tile.block()) || (tile.block instanceof BuildBlock && tile.bc().cblock == type)) - && !(type == tile.block() && (tile.build != null && rotation == tile.build.rotation) && type.rotate)) || tile.block().alwaysReplace || tile.block() == Blocks.air) - && tile.block().isMultiblock() == type.isMultiblock() && type.canPlaceOn(tile, team); + if(!type.requiresWater && !contactsShallows(tile.x, tile.y, type) && !type.placeableLiquid){ + return false; } + + if(!type.canPlaceOn(tile, team)){ + return false; + } + + int offsetx = -(type.size - 1) / 2; + int offsety = -(type.size - 1) / 2; + + for(int dx = 0; dx < type.size; dx++){ + for(int dy = 0; dy < type.size; dy++){ + int wx = dx + offsetx + tile.x, wy = dy + offsety + tile.y; + + Tile check = world.tile(wx, wy); + if( + check == null || //nothing there + (check.floor().isDeep() && !type.floating && !type.requiresWater && !type.placeableLiquid) || //deep water + (type == check.block() && check.build != null && rotation == check.build.rotation && type.rotate) || //same block, same rotation + !check.interactable(team) || //cannot interact + !check.floor().placeableOn || //solid wall + !((type.canReplace(check.block()) || //can replace type + (check.block instanceof ConstructBlock && check.bc().cblock == type && check.centerX() == tile.x && check.centerY() == tile.y)) && //same type in construction + type.bounds(tile.x, tile.y, Tmp.r1).grow(0.01f).contains(check.block.bounds(check.centerX(), check.centerY(), Tmp.r2))) || //no replacement + (type.requiresWater && check.floor().liquidDrop != Liquids.water) //requires water but none found + ) return false; + } + } + + return true; } public static boolean contactsGround(int x, int y, Block block){ diff --git a/core/src/mindustry/world/CachedTile.java b/core/src/mindustry/world/CachedTile.java index 7e25c78b3b..3c14ade132 100644 --- a/core/src/mindustry/world/CachedTile.java +++ b/core/src/mindustry/world/CachedTile.java @@ -26,7 +26,7 @@ public class CachedTile extends Tile{ Block block = block(); - if(block.hasEntity()){ + if(block.hasBuilding()){ Building n = entityprov.get(); n.cons(new ConsumeModule(build)); n.tile(this); diff --git a/core/src/mindustry/world/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 a63026f827..63f08d6de4 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(); } @@ -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(); } } } @@ -540,8 +508,8 @@ public class Tile implements Position, QuadTreeObject, Displayable{ } } - if(block.hasEntity()){ - build = entityprov.get().init(this, team, block.update, rotation); + if(block.hasBuilding()){ + build = entityprov.get().init(this, team, block.update && !state.isEditor(), rotation); } } @@ -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 af3a9ac2cc..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..d6bb877be8 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,13 @@ 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); - tile.build.placed(); + public static void constructed(Tile tile, Block block, Unit builder, byte rotation, Team team, Object config){ + Call.constructFinish(tile, block, builder, rotation, team, config); + if(tile.build != null){ + 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 +120,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 +134,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 +166,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 +202,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 +225,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 +264,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..093fff4f70 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -5,6 +5,7 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import mindustry.annotations.Annotations.*; @@ -34,6 +35,7 @@ public class LaunchPad extends Block{ hasItems = true; solid = true; update = true; + configurable = true; } @Override @@ -51,6 +53,7 @@ public class LaunchPad extends Block{ } public class LaunchPadBuild extends Building{ + @Override public void draw(){ super.draw(); @@ -97,7 +100,7 @@ public class LaunchPad extends Block{ //launch when full and base conditions are met if(items.total() >= itemCapacity && efficiency() >= 1f && timer(timerLaunch, launchTime / timeScale)){ LaunchPayload entity = LaunchPayload.create(); - items.each((item, amount) -> entity.stacks().add(new ItemStack(item, amount))); + items.each((item, amount) -> entity.stacks.add(new ItemStack(item, amount))); entity.set(this); entity.lifetime(120f); entity.team(team); @@ -107,6 +110,35 @@ public class LaunchPad extends Block{ Effect.shake(3f, 3f, this); } } + + @Override + public void display(Table table){ + super.display(table); + + table.row(); + table.label(() -> { + Sector dest = state.secinfo.getRealDestination(); + + return Core.bundle.format("launch.destination", + dest == null ? Core.bundle.get("sectors.nonelaunch") : + dest.preset == null ? + "[accent]Sector " + dest.id : + "[accent]" + dest.preset.localizedName); + }).pad(4); + } + + @Override + public void buildConfiguration(Table table){ + if(!state.isCampaign()){ + deselect(); + return; + } + + table.button(Icon.upOpen, Styles.clearTransi, () -> { + ui.planet.showSelect(state.rules.sector, other -> state.secinfo.destination = other); + deselect(); + }).size(40f); + } } @EntityDef(LaunchPayloadc.class) @@ -142,7 +174,7 @@ public class LaunchPad extends Block{ Draw.z(Layer.weather - 1); TextureRegion region = Core.atlas.find("launchpod"); - float rw = region.getWidth() * Draw.scl * scale, rh = region.getHeight() * Draw.scl * scale; + float rw = region.width * Draw.scl * scale, rh = region.height * Draw.scl * scale; Draw.alpha(alpha); Draw.rect(region, cx, cy, rw, rh, rotation); @@ -174,19 +206,25 @@ public class LaunchPad extends Block{ @Override public void remove(){ + if(!state.isCampaign()) return; + + Sector destsec = state.secinfo.getRealDestination(); + //actually launch the items upon removal - if(team() == state.rules.defaultTeam && state.secinfo.origin != null){ - ItemSeq dest = state.secinfo.origin.getExtraItems(); + if(team() == state.rules.defaultTeam){ + if(destsec != null && (destsec != state.rules.sector || net.client())){ + ItemSeq dest = destsec.getExtraItems(); - for(ItemStack stack : stacks){ - dest.add(stack); + for(ItemStack stack : stacks){ + dest.add(stack); - //update export - state.secinfo.handleItemExport(stack); - Events.fire(new LaunchItemEvent(stack)); + //update export + state.secinfo.handleItemExport(stack); + Events.fire(new LaunchItemEvent(stack)); + } + + destsec.setExtraItems(dest); } - - state.secinfo.origin.setExtraItems(dest); } } } diff --git a/core/src/mindustry/world/blocks/defense/Door.java b/core/src/mindustry/world/blocks/defense/Door.java index 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..5a2fd461af 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -23,6 +23,7 @@ public class ForceProjector extends Block{ public float phaseUseTime = 350f; public float phaseRadiusBoost = 80f; + public float phaseShieldBoost = 400f; public float radius = 101.7f; public float breakage = 550f; public float cooldownNormal = 1.75f; @@ -31,7 +32,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 +49,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); } @@ -61,9 +60,11 @@ public class ForceProjector extends Block{ @Override public void setStats(){ super.setStats(); - + stats.add(BlockStat.shieldHealth, breakage, StatUnit.none); + stats.add(BlockStat.cooldownTime, (int) (breakage / cooldownBrokenBase / 60f), StatUnit.seconds); stats.add(BlockStat.powerUse, basePowerDraw * 60f, StatUnit.powerSecond); stats.add(BlockStat.boostEffect, phaseRadiusBoost / tilesize, StatUnit.blocks); + stats.add(BlockStat.boostEffect, phaseShieldBoost, StatUnit.shieldHealth); } @Override @@ -72,20 +73,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(){ @@ -120,10 +133,10 @@ public class ForceProjector extends Block{ broken = false; } - if(buildup >= breakage && !broken){ + if(buildup >= breakage + phaseShieldBoost && !broken){ broken = true; buildup = breakage; - Fx.shieldBreak.at(x, y, radius, team.color); + Fx.shieldBreak.at(x, y, realRadius(), team.color); } if(hit > 0f){ @@ -138,7 +151,7 @@ public class ForceProjector extends Block{ } } - float realRadius(){ + public float realRadius(){ return (radius + phaseHeat * phaseRadiusBoost) * radscl; } @@ -146,6 +159,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 +170,9 @@ public class ForceProjector extends Block{ Draw.blend(); Draw.reset(); } + } + public void drawShield(){ if(!broken){ float radius = realRadius(); @@ -196,4 +215,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..5602ab3052 100644 --- a/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java +++ b/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java @@ -7,6 +7,7 @@ import arc.math.geom.*; import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; +import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; @@ -60,7 +61,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 +73,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(); @@ -106,6 +112,7 @@ public class PointDefenseTurret extends Block{ @Override public void draw(){ Draw.rect(baseRegion, x, y); + Drawf.shadow(region, x - (size / 2f), y - (size / 2f), rotation - 90); Draw.rect(region, x, y, rotation - 90); } diff --git a/core/src/mindustry/world/blocks/defense/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..4c500774a4 100644 --- a/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java +++ b/core/src/mindustry/world/blocks/defense/TractorBeamTurret.java @@ -6,6 +6,7 @@ import arc.math.*; import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; +import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.entities.*; import mindustry.gen.*; @@ -31,6 +32,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 +62,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; @@ -105,6 +107,7 @@ public class TractorBeamTurret extends Block{ @Override public void draw(){ Draw.rect(baseRegion, x, y); + Drawf.shadow(region, x - (size / 2f), y - (size / 2f), rotation - 90); Draw.rect(region, x, y, rotation - 90); //draw laser if applicable @@ -113,7 +116,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 b08c2c500c..873cbaea78 100644 --- a/core/src/mindustry/world/blocks/defense/Wall.java +++ b/core/src/mindustry/world/blocks/defense/Wall.java @@ -1,6 +1,7 @@ package mindustry.world.blocks.defense; import arc.*; +import arc.audio.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -19,10 +20,14 @@ public class Wall extends Block{ public float lightningChance = -0.001f; public float lightningDamage = 20f; public int lightningLength = 17; + public Color lightningColor = Pal.surge; + public Sound lightningSound = Sounds.spark; public float chanceDeflect = 10f; - public boolean flashWhite; + public boolean flashHit; + public Color flashColor = Color.white; public boolean deflect; + public Sound deflectSound = Sounds.none; public Wall(String name){ super(name); @@ -30,6 +35,7 @@ public class Wall extends Block{ destructible = true; group = BlockGroup.walls; buildCostMultiplier = 5f; + canOverdrive = false; } @Override @@ -53,7 +59,8 @@ public class Wall extends Block{ @Override public boolean canReplace(Block other){ - return super.canReplace(other) && health > other.health && size == other.size; + if(other.alwaysReplace) return true; + return (other != this || rotate) && this.group != BlockGroup.none && other.group == this.group && other != this && size >= other.size; } public class WallBuild extends Building{ @@ -68,10 +75,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 +98,21 @@ 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); + lightningSound.at(tile, Mathf.random(0.9f, 1.1f)); } } //deflect bullets if necessary if(deflect){ + //slow bullets are not deflected + if(bullet.vel().len() <= 0.1f || !bullet.type.reflectable) return true; + //bullet reflection chance depends on bullet damage - if(!Mathf.chance(chanceDeflect/bullet.damage())) return true; + if(!Mathf.chance(chanceDeflect / bullet.damage())) return true; + + //make sound + deflectSound.at(tile, Mathf.random(0.9f, 1.1f)); //translate bullet back to where it was upon collision bullet.trns(-bullet.vel.x, -bullet.vel.y); diff --git a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java index 5fa0e70947..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); } } @@ -154,10 +167,14 @@ public class ItemTurret extends Turret{ super.read(read, revision); int amount = read.ub(); for(int i = 0; i < amount; i++){ - Item item = Vars.content.item(read.ub()); + 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 59dbc3fbbe..7ac517c51a 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -96,7 +96,7 @@ public class LaserTurret extends PowerTurret{ @Override protected void turnToTarget(float targetRot){ - rotation = Angles.moveToward(rotation, targetRot, efficiency() * rotatespeed * delta() * (bulletLife > 0f ? firingMoveFract : 1f)); + rotation = Angles.moveToward(rotation, targetRot, efficiency() * rotateSpeed * delta() * (bulletLife > 0f ? firingMoveFract : 1f)); } @Override diff --git a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 752528970b..146dfc856c 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.defense.turrets; -import arc.*; import arc.graphics.g2d.*; import arc.struct.*; import mindustry.annotations.Annotations.*; @@ -12,11 +11,12 @@ import mindustry.world.consumers.*; import mindustry.world.meta.*; import mindustry.world.meta.values.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class LiquidTurret extends Turret{ public ObjectMap ammoTypes = new ObjectMap<>(); public @Load("@-liquid") TextureRegion liquidRegion; + public @Load("@-top") TextureRegion topRegion; public LiquidTurret(String name){ super(name); @@ -54,17 +54,17 @@ public class LiquidTurret extends Turret{ } public class LiquidTurretBuild extends TurretBuild{ - @Override public void draw(){ super.draw(); - if(Core.atlas.isFound(liquidRegion)){ + if(liquidRegion.found()){ Draw.color(liquids.current().color); Draw.alpha(liquids.total() / liquidCapacity); Draw.rect(liquidRegion, x + tr2.x, y + tr2.y, rotation - 90); - Draw.color(); + Draw.reset(); } + if(topRegion.found()) Draw.rect(topRegion, x + tr2.x, y + tr2.y, rotation - 90); } @Override @@ -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..847f624247 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -22,12 +22,19 @@ public class PowerTurret extends Turret{ @Override public void init(){ - consumes.powerCond(powerUse, entity -> ((TurretBuild)entity).target != null); + consumes.powerCond(powerUse, (TurretBuild entity) -> entity.target != null || (entity.logicControlled() && entity.logicShooting)); super.init(); } public class PowerTurretBuild extends TurretBuild{ + @Override + public void updateTile(){ + unit.ammo(power.status * unit.type().ammoCapacity); + + super.updateTile(); + } + @Override public BulletType useAmmo(){ //nothing used directly diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index 99de204e4e..21033668a1 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -52,7 +52,7 @@ public abstract class Turret extends Block{ public float recoilAmount = 1f; public float restitution = 0.02f; public float cooldown = 0.02f; - public float rotatespeed = 5f; //in degrees per tick + public float rotateSpeed = 5f; //in degrees per tick public float shootCone = 8f; public float shootShake = 0f; public float xRand = 0f; @@ -77,6 +77,7 @@ public abstract class Turret extends Block{ public Cons drawer = tile -> Draw.rect(region, tile.x + tr2.x, tile.y + tr2.y, tile.rotation - 90); public Cons heatDrawer = tile -> { if(tile.heat <= 0.00001f) return; + Draw.color(heatColor, tile.heat); Draw.blend(Blending.additive); Draw.rect(heatRegion, tile.x + tr2.x, tile.y + tr2.y, tile.rotation - 90); @@ -201,6 +202,7 @@ public abstract class Turret extends Block{ tr2.trns(rotation, -recoil); + Drawf.shadow(region, x + tr2.x - (size / 2f), y + tr2.y - (size / 2f), rotation - 90); drawer.get(this); if(heatRegion != Core.atlas.find("error")){ @@ -237,7 +239,7 @@ public abstract class Turret extends Block{ canShoot = unit.isShooting(); }else if(logicControlled()){ //logic behavior canShoot = logicShooting; - }else if(peekAmmo() != null){ //default AI behavior + }else{ //default AI behavior BulletType type = peekAmmo(); float speed = type.speed; //slow bullets never intersect @@ -311,7 +313,7 @@ public abstract class Turret extends Block{ } protected void turnToTarget(float targetRot){ - rotation = Angles.moveToward(rotation, targetRot, rotatespeed * delta() * baseReloadSpeed()); + rotation = Angles.moveToward(rotation, targetRot, rotateSpeed * delta() * baseReloadSpeed()); } public boolean shouldTurn(){ @@ -436,7 +438,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 3654f8ba01..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 @@ -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 e25c4e0144..da162d9398 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,10 +273,13 @@ public class ItemBridge extends Block{ Item item = items.take(); if(item != null && other.acceptItem(this, item)){ other.handleItem(this, item); - cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); + cycleSpeed = Mathf.lerpDelta(cycleSpeed, 4f, 0.05f); //TODO this is kinda broken, because lerping only happens on a timer }else{ cycleSpeed = Mathf.lerpDelta(cycleSpeed, 1f, 0.01f); - if(item != null) items.add(item, 1); + if(item != null){ + items.add(item, 1); + items.undoFlow(item); + } } } } @@ -294,11 +305,14 @@ public class ItemBridge extends Block{ Draw.rect(endRegion, other.drawx(), other.drawy(), i * 90 + 270); Lines.stroke(8f); + + Tmp.v1.set(x, y).sub(other.worldx(), other.worldy()).setLength(tilesize/2f).scl(-1f); + Lines.line(bridgeRegion, - x, - y, - other.worldx(), - other.worldy(), false, -tilesize / 2f); + x + Tmp.v1.x, + y + Tmp.v1.y, + other.worldx() - Tmp.v1.x, + other.worldy() - Tmp.v1.y, false); int dist = Math.max(Math.abs(other.x - tile.x), Math.abs(other.y - tile.y)); @@ -310,8 +324,8 @@ public class ItemBridge extends Block{ for(int a = 0; a < arrows; a++){ Draw.alpha(Mathf.absin(a / (float)arrows - time / 100f, 0.1f, 1f) * uptime * opacity); Draw.rect(arrowRegion, - x + Geometry.d4[i].x * (tilesize / 2f + a * 4f + time % 4f), - y + Geometry.d4[i].y * (tilesize / 2f + a * 4f + time % 4f), i * 90f); + x + Geometry.d4(i).x * (tilesize / 2f + a * 4f + time % 4f), + y + Geometry.d4(i).y * (tilesize / 2f + a * 4f + time % 4f), i * 90f); } Draw.reset(); } @@ -358,7 +372,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 +383,7 @@ public class ItemBridge extends Block{ protected boolean checkDump(Building to){ Tile other = world.tile(link); if(!linkValid(tile, other)){ - Tile edge = Edges.getFacingEdge(to.tile(), tile); + Tile edge = Edges.getFacingEdge(to.tile, tile); int i = relativeTo(edge.x, edge.y); IntSetIterator it = incoming.iterator(); diff --git a/core/src/mindustry/world/blocks/distribution/Junction.java b/core/src/mindustry/world/blocks/distribution/Junction.java index 513f59d959..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 diff --git a/core/src/mindustry/world/blocks/distribution/MassDriver.java b/core/src/mindustry/world/blocks/distribution/MassDriver.java index 4afadbdba8..fa6529fd72 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; @@ -60,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); @@ -153,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); @@ -186,6 +188,9 @@ public class MassDriver extends Block{ Draw.z(Layer.turret); + Drawf.shadow(region, + x + Angles.trnsx(rotation + 180f, reload * knockback) - (size / 2), + y + Angles.trnsy(rotation + 180f, reload * knockback) - (size / 2), rotation - 90); Draw.rect(region, x + Angles.trnsx(rotation + 180f, reload * knockback), y + Angles.trnsy(rotation + 180f, reload * knockback), rotation - 90); @@ -223,7 +228,7 @@ public class MassDriver extends Block{ if(link == other.pos()){ configure(-1); return false; - }else if(other.block() instanceof MassDriver && other.dst(tile) <= range && other.team == team){ + }else if(other.block instanceof MassDriver && other.dst(tile) <= range && other.team == team){ configure(other.pos()); return false; } @@ -265,6 +270,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){ diff --git a/core/src/mindustry/world/blocks/distribution/OverflowGate.java b/core/src/mindustry/world/blocks/distribution/OverflowGate.java index 44f1b80283..981080a95d 100644 --- a/core/src/mindustry/world/blocks/distribution/OverflowGate.java +++ b/core/src/mindustry/world/blocks/distribution/OverflowGate.java @@ -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 9e64fb6a27..656315446f 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 = 40f, moveForce = 201f; 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); } } } @@ -51,6 +53,7 @@ public class PayloadConveyor extends Block{ public class PayloadConveyorBuild extends Building{ public @Nullable Payload item; public float progress, itemRotation, animation; + public float curInterp, lastInterp; public @Nullable Building next; public boolean blocked; public int step = -1, stepAccepted = -1; @@ -70,13 +73,13 @@ public class PayloadConveyor extends Block{ //next block must be aligned and of the same size if(accept != null && ( //same size - (accept.block().size == size && tileX() + Geometry.d4(rotation).x * size == accept.tileX() && tileY() + Geometry.d4(rotation).y * size == accept.tileY()) || + (accept.block.size == size && tileX() + Geometry.d4(rotation).x * size == accept.tileX() && tileY() + Geometry.d4(rotation).y * size == accept.tileY()) || //differing sizes - (accept.block().size > size && + (accept.block.size > size && (rotation % 2 == 0 ? //check orientation - Math.abs(accept.y - y) <= (accept.block().size * tilesize - size * tilesize)/2f : //check Y alignment - Math.abs(accept.x - x) <= (accept.block().size * tilesize - size * tilesize)/2f //check X alignment + Math.abs(accept.y - y) <= (accept.block.size * tilesize - size * tilesize)/2f : //check Y alignment + Math.abs(accept.x - x) <= (accept.block.size * tilesize - size * tilesize)/2f //check X alignment )))){ next = accept; }else{ @@ -95,7 +98,13 @@ public class PayloadConveyor extends Block{ @Override public void updateTile(){ - progress = Time.time() % moveTime; + if(!enabled) return; + + lastInterp = curInterp; + curInterp = fract(); + //rollover skip + if(lastInterp > curInterp) lastInterp = 0f; + progress = time() % moveTime; updatePayload(); @@ -104,6 +113,7 @@ public class PayloadConveyor extends Block{ if(curStep > step){ boolean valid = step != -1; step = curStep; + boolean had = item != null; if(valid && stepAccepted != curStep && item != null){ if(next != null){ @@ -125,9 +135,17 @@ public class PayloadConveyor extends Block{ } } } + + if(had && item != null){ + moveFailed(); + } } } + public void moveFailed(){ + + } + public void moved(){ } @@ -151,20 +169,20 @@ public class PayloadConveyor extends Block{ float s = tilesize * size; //next - Tmp.v1.set((s-clipped.getWidth()*Draw.scl) + clipped.getWidth()/2f*Draw.scl - s/2f, s-clipped.getHeight()*Draw.scl + clipped.getHeight()/2f*Draw.scl - s/2f).rotate(rot); + Tmp.v1.set((s- clipped.width *Draw.scl) + clipped.width /2f*Draw.scl - s/2f, s- clipped.height *Draw.scl + clipped.height /2f*Draw.scl - s/2f).rotate(rot); Draw.rect(clipped, x + Tmp.v1.x, y + Tmp.v1.y, rot); clipped = clipRegion(tile.getHitbox(Tmp.r1), tile.getHitbox(Tmp.r2).move(trprev, 0), topRegion); //prev - Tmp.v1.set(- s/2f + clipped.getWidth()/2f*Draw.scl, - s/2f + clipped.getHeight()/2f*Draw.scl).rotate(rot); + Tmp.v1.set(- s/2f + clipped.width /2f*Draw.scl, - s/2f + clipped.height /2f*Draw.scl).rotate(rot); Draw.rect(clipped, x + Tmp.v1.x, y + Tmp.v1.y, rot); for(int i = 0; i < 4; i++){ if(blends(i) && i != rotation){ Draw.alpha(1f - Interp.pow5In.apply(fract())); //prev from back - Tmp.v1.set(- s/2f + clipped.getWidth()/2f*Draw.scl, - s/2f + clipped.getHeight()/2f*Draw.scl).rotate(i * 90 + 180); + Tmp.v1.set(- s/2f + clipped.width /2f*Draw.scl, - s/2f + clipped.height /2f*Draw.scl).rotate(i * 90 + 180); Draw.rect(clipped, x + Tmp.v1.x, y + Tmp.v1.y, i * 90 + 180); } } @@ -184,17 +202,32 @@ public class PayloadConveyor extends Block{ } } + public float time(){ + return Time.time(); + } + + @Override + public void unitOn(Unit unit){ + //calculate derivative of units moved last frame + float delta = (curInterp - lastInterp) * size * tilesize; + Tmp.v1.trns(rotdeg(), delta * moveForce).scl(1f / Math.max(unit.mass(), 201f)); + unit.move(Tmp.v1.x, Tmp.v1.y); + } + @Override public boolean acceptPayload(Building source, Payload payload){ + if(source == this){ + return this.item == null && payload.fits(); + } //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 +246,7 @@ public class PayloadConveyor extends Block{ public void read(Reads read, byte revision){ super.read(read, revision); - progress = read.f(); + read.f(); //why is progress written? itemRotation = read.f(); item = Payload.read(read); } @@ -254,12 +287,12 @@ public class PayloadConveyor extends Block{ boolean overlaps = Intersector.intersectRectangles(bounds, sprite, over); TextureRegion out = Tmp.tr1; - out.set(region.getTexture()); + out.set(region.texture); if(overlaps){ - float w = region.getU2() - region.getU(); - float h = region.getV2() - region.getV(); - float x = region.getU(), y = region.getV(); + float w = region.u2 - region.u; + float h = region.v2 - region.v; + float x = region.u, y = region.v; float newX = (over.x - sprite.x) / sprite.width * w + x; float newY = (over.y - sprite.y) / sprite.height * h + y; float newW = (over.width / sprite.width) * w, newH = (over.height / sprite.height) * h; @@ -273,7 +306,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 af3833f34b..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 || target.block().instantTransfer))){ + if(target != null && (time >= 1f || !(target.block instanceof Router || target.block.instantTransfer))){ getTileTarget(lastItem, lastInput, true); target.handleItem(this, lastItem); items.remove(lastItem, 1); diff --git a/core/src/mindustry/world/blocks/distribution/Sorter.java b/core/src/mindustry/world/blocks/distribution/Sorter.java index f5e9d9b5ec..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){ @@ -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..d70c518bc0 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; + if(link == -1 || from == null || lastItem == null) return; + + int fromRot = from.build == null ? rotation : from.build.rotation; //offset - Tmp.v1.set(from); - Tmp.v2.set(tile); + Tmp.v1.set(from.worldx(), from.worldy()); + Tmp.v2.set(x, y); Tmp.v1.interpolate(Tmp.v2, 1f - cooldown, Interp.linear); //rotation - float a = (from.rotation%4) * 90; + float a = (fromRot%4) * 90; float b = (rotation%4) * 90; - if((from.rotation%4) == 3 && (rotation%4) == 0) a = -1 * 90; - if((from.rotation%4) == 0 && (rotation%4) == 3) a = 4 * 90; + if((fromRot%4) == 3 && (rotation%4) == 0) a = -1 * 90; + if((fromRot%4) == 0 && (rotation%4) == 3) a = 4 * 90; //stack Draw.rect(stackRegion, Tmp.v1.x, Tmp.v1.y, Mathf.lerp(a, b, Interp.smooth.apply(1f - Mathf.clamp(cooldown * 2, 0f, 1f)))); @@ -133,7 +138,7 @@ public class StackConveyor extends Block implements Autotiler{ //item float size = itemSize * Mathf.lerp(Math.min((float)items.total() / itemCapacity, 1), 1f, 0.4f); Drawf.shadow(Tmp.v1.x, Tmp.v1.y, size * 1.2f); - Draw.rect(items.first().icon(Cicon.medium), Tmp.v1.x, Tmp.v1.y, size, size, 0); + Draw.rect(lastItem.icon(Cicon.medium), Tmp.v1.x, Tmp.v1.y, size, size, 0); } @Override @@ -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..2ac5e933cf 100644 --- a/core/src/mindustry/world/blocks/environment/Floor.java +++ b/core/src/mindustry/world/blocks/environment/Floor.java @@ -67,7 +67,7 @@ public class Floor extends Block{ protected TextureRegion[][] edges; protected Seq blenders = new Seq<>(); - protected IntSet blended = new IntSet(); + protected Bits blended = new Bits(256); protected TextureRegion edgeRegion; public Floor(String name){ @@ -103,16 +103,15 @@ public class Floor extends Block{ super.init(); if(wall == Blocks.air){ - wall = content.block(name + "Rocks"); - if(wall == null) wall = content.block(name + "rocks"); - if(wall == null) wall = content.block(name.replace("darksand", "dune") + "rocks"); + wall = content.block(name + "-wall"); + if(wall == null) wall = content.block(name.replace("darksand", "dune") + "-wall"); } //keep default value if not found... if(wall == null) wall = Blocks.air; if(decoration == Blocks.air){ - decoration = content.blocks().min(b -> b instanceof Rock && b.breakable ? mapColor.diff(b.mapColor) : Float.POSITIVE_INFINITY); + decoration = content.blocks().min(b -> b instanceof Boulder && b.breakable ? mapColor.diff(b.mapColor) : Float.POSITIVE_INFINITY); } } @@ -171,30 +170,43 @@ public class Floor extends Block{ return drownTime > 0; } - public void drawNonLayer(Tile tile){ + public void drawNonLayer(Tile tile, CacheLayer layer){ Mathf.rand.setSeed(tile.pos()); - drawEdges(tile, true); - } - - protected void drawEdges(Tile tile){ - drawEdges(tile, false); - } - - protected void drawEdges(Tile tile, boolean sameLayer){ blenders.clear(); blended.clear(); for(int i = 0; i < 8; i++){ Point2 point = Geometry.d8[i]; Tile other = tile.getNearby(point); - if(other != null && doEdge(other.floor(), sameLayer) && other.floor().edges() != null){ - if(blended.add(other.floor().id)){ + if(other != null && other.floor().cacheLayer == layer && other.floor().edges() != null){ + if(!blended.getAndSet(other.floor().id)){ blenders.add(other.floor()); } } } + drawBlended(tile); + } + + protected void drawEdges(Tile tile){ + blenders.clear(); + blended.clear(); + + for(int i = 0; i < 8; i++){ + Point2 point = Geometry.d8[i]; + Tile other = tile.getNearby(point); + if(other != null && doEdge(other.floor()) && other.floor().cacheLayer == cacheLayer && other.floor().edges() != null){ + if(!blended.getAndSet(other.floor().id)){ + blenders.add(other.floor()); + } + } + } + + drawBlended(tile); + } + + protected void drawBlended(Tile tile){ blenders.sort(a -> a.id); for(Block block : blenders){ @@ -202,23 +214,18 @@ public class Floor extends Block{ Point2 point = Geometry.d8[i]; Tile other = tile.getNearby(point); if(other != null && other.floor() == block){ - TextureRegion region = edge((Floor)block, 2 - (point.x + 1), 2 - (point.y + 1)); + TextureRegion region = edge((Floor)block, 1 - point.x, 1 - point.y); Draw.rect(region, tile.worldx(), tile.worldy()); - - if(!sameLayer && block.cacheLayer.ordinal() > cacheLayer.ordinal()){ - Draw.rect(block.variantRegions()[0], tile.worldx() + point.x*tilesize, tile.worldy() + point.y*tilesize); - } } } } - } //'new' style of edges with shadows instead of colors, not used currently protected void drawEdgesFlat(Tile tile, boolean sameLayer){ for(int i = 0; i < 4; i++){ Tile other = tile.getNearby(i); - if(other != null && doEdge(other.floor(), sameLayer)){ + if(other != null && doEdge(other.floor())){ Color color = other.floor().mapColor; Draw.color(color.r, color.g, color.b, 1f); Draw.rect(edgeRegion, tile.worldx(), tile.worldy(), i*90); @@ -232,8 +239,8 @@ public class Floor extends Block{ return ((Floor)blendGroup).edges; } - protected boolean doEdge(Floor other, boolean sameLayer){ - return (((other.blendGroup.id > blendGroup.id) || edges() == null) && (other.cacheLayer.ordinal() > this.cacheLayer.ordinal() || !sameLayer)); + protected boolean doEdge(Floor other){ + return other.blendGroup.id > blendGroup.id || edges() == null; } TextureRegion edge(Floor block, int x, int y){ diff --git a/core/src/mindustry/world/blocks/environment/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/liquid/ArmoredConduit.java b/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java index 060add232a..6b8739b93a 100644 --- a/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java +++ b/core/src/mindustry/world/blocks/liquid/ArmoredConduit.java @@ -26,15 +26,15 @@ public class ArmoredConduit extends Conduit{ // draw the cap when a conduit would normally leak Building next = front(); - if(next != null && next.team == team && next.block().hasLiquids) return; + if(next != null && next.team == team && next.block.hasLiquids) return; Draw.rect(capRegion, x, y, rotdeg()); } @Override public boolean acceptLiquid(Building source, Liquid liquid, float amount){ - return super.acceptLiquid(source, liquid, amount) && (source.block() instanceof Conduit) || - Edges.getFacingEdge(source.tile(), tile).absoluteRelativeTo(tile.x, tile.y) == rotation; + return super.acceptLiquid(source, liquid, amount) && (source.block instanceof Conduit || + source.tile.absoluteRelativeTo(tile.x, tile.y) == rotation); } } } diff --git a/core/src/mindustry/world/blocks/liquid/Conduit.java b/core/src/mindustry/world/blocks/liquid/Conduit.java index 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 9ed0e4f734..b5439b3e70 100644 --- a/core/src/mindustry/world/blocks/logic/LogicBlock.java +++ b/core/src/mindustry/world/blocks/logic/LogicBlock.java @@ -16,7 +16,7 @@ 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.*; @@ -25,8 +25,6 @@ import java.util.zip.*; import static mindustry.Vars.*; public class LogicBlock extends Block{ - public static final int maxInstructions = 1500; - public int maxInstructionScale = 5; public int instructionsPerTick = 1; public float range = 8 * 10; @@ -70,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]; @@ -270,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){ @@ -315,11 +313,17 @@ public class LogicBlock extends Block{ e.printStackTrace(); //handle malformed code and replace it with nothing - executor.load("", maxInstructions); + executor.load("", LExecutor.maxInstructions); } } } + //logic blocks cause write problems when picked up + @Override + public boolean canPickup(){ + return false; + } + @Override public float range(){ return range; @@ -361,15 +365,17 @@ public class LogicBlock extends Block{ updateCode(); } - accumulator += edelta() * instructionsPerTick * (consValid() ? 1 : 0); + 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 --; } } @@ -412,27 +418,17 @@ 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); } - - @Override public void buildConfiguration(Table table){ - Table cont = new Table(); - cont.defaults().size(40); - cont.button(Icon.pencil, Styles.clearTransi, () -> { + table.button(Icon.pencil, Styles.clearTransi, () -> { Vars.ui.logic.show(code, code -> { configure(compress(code, relativeConnections())); }); - }); - - //cont.button(Icon.refreshSmall, Styles.clearTransi, () -> { - - //}); - - table.add(cont); + }).size(40); } @Override diff --git a/core/src/mindustry/world/blocks/logic/LogicDisplay.java b/core/src/mindustry/world/blocks/logic/LogicDisplay.java index 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/MemoryBlock.java b/core/src/mindustry/world/blocks/logic/MemoryBlock.java index a86900b114..d215238ced 100644 --- a/core/src/mindustry/world/blocks/logic/MemoryBlock.java +++ b/core/src/mindustry/world/blocks/logic/MemoryBlock.java @@ -3,6 +3,7 @@ package mindustry.world.blocks.logic; import arc.util.io.*; import mindustry.gen.*; import mindustry.world.*; +import mindustry.world.meta.*; public class MemoryBlock extends Block{ public int memoryCapacity = 32; @@ -13,9 +14,22 @@ public class MemoryBlock extends Block{ solid = true; } + @Override + public void setStats(){ + super.setStats(); + + stats.add(BlockStat.memoryCapacity, memoryCapacity, StatUnit.none); + } + public class MemoryBuild extends Building{ public double[] memory = new double[memoryCapacity]; + //massive byte size means picking up causes sync issues + @Override + public boolean canPickup(){ + return false; + } + @Override public void write(Writes write){ super.write(write); @@ -31,9 +45,9 @@ public class MemoryBlock extends Block{ super.read(read, revision); int amount = read.i(); - memory = memory.length != amount ? new double[amount] : memory; for(int i = 0; i < amount; i++){ - memory[i] = read.d(); + double val = read.d(); + if(i < memory.length) memory[i] = val; } } } diff --git a/core/src/mindustry/world/blocks/logic/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 5690cd46d0..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..d19d0cda68 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.5f; } /** 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..751152fb1f 100644 --- a/core/src/mindustry/world/blocks/payloads/UnitPayload.java +++ b/core/src/mindustry/world/blocks/payloads/UnitPayload.java @@ -1,30 +1,28 @@ package mindustry.world.blocks.payloads; +import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; +import arc.math.geom.*; +import arc.util.*; import arc.util.io.*; import mindustry.*; +import mindustry.entities.*; +import mindustry.entities.EntityCollisions.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; public class UnitPayload implements Payload{ + public static final float deactiveDuration = 40f; + public Unit unit; + public float deactiveTime = 0f; public UnitPayload(Unit unit){ this.unit = unit; } - @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,8 +36,31 @@ public class UnitPayload implements Payload{ unit.rotation(rotation); } + @Override + public float size(){ + return unit.hitSize; + } + @Override public boolean dump(){ + if(!Units.canCreate(unit.team, unit.type())){ + deactiveTime = 1f; + return false; + } + + //check if unit can be dumped here + SolidPred solid = unit.solidity(); + if(solid != null){ + int tx = unit.tileX(), ty = unit.tileY(); + boolean nearEmpty = !solid.solid(tx, ty); + for(Point2 p : Geometry.d4){ + nearEmpty |= !solid.solid(tx + p.x, ty + p.y); + } + + //cannot dump on solid blocks + if(!nearEmpty) return false; + } + //no client dumping if(Vars.net.client()) return true; @@ -54,5 +75,18 @@ public class UnitPayload implements Payload{ public void draw(){ Drawf.shadow(unit.x, unit.y, 20); Draw.rect(unit.type().icon(Cicon.full), unit.x, unit.y, unit.rotation - 90); + + //draw warning + if(deactiveTime > 0){ + Draw.color(Color.scarlet); + Draw.alpha(0.8f * Interp.exp5Out.apply(deactiveTime)); + + float size = 8f; + Draw.rect(Icon.warning.getRegion(), unit.x, unit.y, size, size); + + Draw.reset(); + + deactiveTime = Math.max(deactiveTime - Time.delta/deactiveDuration, 0f); + } } } diff --git a/core/src/mindustry/world/blocks/power/Battery.java b/core/src/mindustry/world/blocks/power/Battery.java index 35b9965eaa..d556f584f5 100644 --- a/core/src/mindustry/world/blocks/power/Battery.java +++ b/core/src/mindustry/world/blocks/power/Battery.java @@ -2,8 +2,10 @@ package mindustry.world.blocks.power; import arc.graphics.*; import arc.graphics.g2d.*; +import arc.struct.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; +import mindustry.world.meta.*; import static mindustry.Vars.tilesize; @@ -17,6 +19,7 @@ public class Battery extends PowerDistributor{ super(name); outputsPower = true; consumesPower = true; + flags = EnumSet.of(BlockFlag.powerResupply); } public class BatteryBuild extends Building{ diff --git a/core/src/mindustry/world/blocks/power/BurnerGenerator.java b/core/src/mindustry/world/blocks/power/BurnerGenerator.java index 44dae83b25..d1743d8481 100644 --- a/core/src/mindustry/world/blocks/power/BurnerGenerator.java +++ b/core/src/mindustry/world/blocks/power/BurnerGenerator.java @@ -39,6 +39,13 @@ public class BurnerGenerator extends ItemLiquidGenerator{ Draw.rect(turbineRegions[1], x, y, -totalTime * turbineSpeed); Draw.rect(capRegion, x, y); + + if(hasLiquids){ + Draw.color(liquids.current().color); + Draw.alpha(liquids.currentAmount() / liquidCapacity); + Draw.rect(liquidRegion, x, y); + Draw.color(); + } } } } 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 c3f3106a43..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 0871ef6e87..5d4431afef 100644 --- a/core/src/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -27,19 +27,20 @@ public class PowerNode extends PowerBlock{ protected static BuildPlan otherReq; protected final ObjectSet graphs = new ObjectSet<>(); - protected final Vec2 t1 = new Vec2(), t2 = new Vec2(); public @Load("laser") TextureRegion laser; public @Load("laser-end") TextureRegion laserEnd; public float laserRange = 6; public int maxNodes = 3; + public Color laserColor1 = Color.white; + public Color laserColor2 = Pal.powerLight; public PowerNode(String name){ super(name); - expanded = true; configurable = true; consumesPower = false; outputsPower = false; + canOverdrive = false; config(Integer.class, (entity, value) -> { PowerModule power = entity.power; @@ -109,9 +110,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 +134,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 +178,9 @@ public class PowerNode extends PowerBlock{ protected void getPotentialLinks(Tile tile, Cons others){ Boolf valid = other -> other != null && other.tile() != tile && other.power != null && - ((!other.block().outputsPower && other.block().consumesPower) || (other.block().outputsPower && !other.block().consumesPower) || other.block() instanceof PowerNode) && + ((!other.block.outputsPower && other.block.consumesPower) || (other.block.outputsPower && !other.block.consumesPower) || other.block instanceof PowerNode) && overlaps(tile.x * tilesize + offset, tile.y * tilesize + offset, other.tile(), laserRange * tilesize) && other.team == player.team() - && !other.proximity().contains(e -> e.tile() == tile) && !graphs.contains(other.power.graph); + && !other.proximity.contains(e -> e.tile == tile) && !graphs.contains(other.power.graph); tempTileEnts.clear(); graphs.clear(); @@ -201,7 +196,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 +210,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 +221,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 +232,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 +261,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 +275,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 +290,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 +368,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 +381,19 @@ public class PowerNode extends PowerBlock{ public void draw(){ super.draw(); - if(Core.settings.getInt("lasersopacity") == 0) return; + if(Mathf.zero(renderer.laserOpacity)) return; Draw.z(Layer.power); + setupColor(power.graph.getSatisfaction()); for(int i = 0; i < power.links.size; i++){ Building link = world.build(power.links.get(i)); if(!linkValid(this, link)) continue; - if(link.block() instanceof PowerNode && !(link.pos() < tile.pos())) continue; + if(link.block instanceof PowerNode && link.id >= id) continue; - drawLaserTo(link); + drawLaser(team, x, y, link.x, link.y, size, link.block.size); } Draw.reset(); @@ -405,10 +403,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/power/ThermalGenerator.java b/core/src/mindustry/world/blocks/power/ThermalGenerator.java index 7146de2959..e29b7a6bdb 100644 --- a/core/src/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/mindustry/world/blocks/power/ThermalGenerator.java @@ -22,7 +22,7 @@ public class ThermalGenerator extends PowerGenerator{ public void setStats(){ super.setStats(); - stats.add(BlockStat.tiles, attribute); + stats.add(BlockStat.tiles, attribute, floating); } @Override diff --git a/core/src/mindustry/world/blocks/production/PayloadAcceptor.java b/core/src/mindustry/world/blocks/production/PayloadAcceptor.java index 3e365b5fcd..e7456f0287 100644 --- a/core/src/mindustry/world/blocks/production/PayloadAcceptor.java +++ b/core/src/mindustry/world/blocks/production/PayloadAcceptor.java @@ -28,22 +28,22 @@ public class PayloadAcceptor extends Block{ } public static boolean blends(Building tile, int direction){ - int size = tile.block().size; + int size = tile.block.size; Building accept = tile.nearby(Geometry.d4(direction).x * size, Geometry.d4(direction).y * size); return accept != null && - accept.block().outputsPayload && + accept.block.outputsPayload && //if size is the same, block must either be facing this one, or not be rotating - ((accept.block().size == size && + ((accept.block.size == size && ((accept.tileX() + Geometry.d4(accept.rotation).x * size == tile.tileX() && accept.tileY() + Geometry.d4(accept.rotation).y * size == tile.tileY()) - || !accept.block().rotate || (accept.block().rotate && !accept.block().outputFacing))) || + || !accept.block.rotate || (accept.block.rotate && !accept.block.outputFacing))) || //if the other block is smaller, check alignment - (accept.block().size < size && + (accept.block.size < size && (accept.rotation % 2 == 0 ? //check orientation; make sure it's aligned properly with this block. - Math.abs(accept.y - tile.y) <= (size * tilesize - accept.block().size * tilesize)/2f : //check Y alignment - Math.abs(accept.x - tile.x) <= (size * tilesize - accept.block().size * tilesize)/2f //check X alignment - )) && (!accept.block().rotate || accept.front() == tile || !accept.block().outputFacing) //make sure it's facing this block + Math.abs(accept.y - tile.y) <= (size * tilesize - accept.block.size * tilesize)/2f : //check Y alignment + Math.abs(accept.x - tile.x) <= (size * tilesize - accept.block.size * tilesize)/2f //check X alignment + )) && (!accept.block.rotate || accept.front() == tile || !accept.block.outputFacing) //make sure it's facing this block ); } @@ -112,7 +112,7 @@ public class PayloadAcceptor extends Block{ payVector.clamp(-size * tilesize / 2f, -size * tilesize / 2f, size * tilesize / 2f, size * tilesize / 2f); Building front = front(); - if(front != null && front.block().outputsPayload){ + if(front != null && front.block.outputsPayload){ if(movePayload(payload)){ payload = null; } diff --git a/core/src/mindustry/world/blocks/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..720a32dc6f 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -101,7 +101,7 @@ public class CoreBlock extends StorageBlock{ CoreBuild core = team.core(); //must have all requirements if(core == null || (!state.rules.infiniteResources && !core.items.has(requirements))) return false; - return canReplace(tile.block()); + return tile.block() instanceof CoreBlock && size > tile.block().size; } @Override @@ -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 index 071bcaf273..cbad080647 100644 --- a/core/src/mindustry/world/blocks/units/CommandCenter.java +++ b/core/src/mindustry/world/blocks/units/CommandCenter.java @@ -20,7 +20,7 @@ import mindustry.world.meta.*; public class CommandCenter extends Block{ public TextureRegionDrawable[] commandRegions = new TextureRegionDrawable[UnitCommand.all.length]; - public Color topColor = Pal.command, bottomColor = Color.valueOf("5e5e5e"); + public Color topColor = null, bottomColor = Color.valueOf("5e5e5e"); public Effect effect = Fx.commandSend; public CommandCenter(String name){ @@ -63,7 +63,7 @@ public class CommandCenter extends Block{ Draw.color(bottomColor); Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), tile.drawx(), tile.drawy() - 1, size, size); - Draw.color(topColor); + Draw.color(topColor == null ? team.color : topColor); Draw.rect(commandRegions[team.data().command.ordinal()].getRegion(), tile.drawx(), tile.drawy(), size, size); Draw.color(); } diff --git a/core/src/mindustry/world/blocks/units/Reconstructor.java b/core/src/mindustry/world/blocks/units/Reconstructor.java index f297ccad57..fa2783f30f 100644 --- a/core/src/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/mindustry/world/blocks/units/Reconstructor.java @@ -140,7 +140,7 @@ public class Reconstructor extends UnitBlock{ if(moveInPayload()){ if(consValid()){ valid = true; - progress += edelta(); + progress += edelta() * state.rules.unitBuildSpeedMultiplier; } //upgrade the unit @@ -161,11 +161,7 @@ public class Reconstructor extends UnitBlock{ @Override public boolean shouldConsume(){ - //do not consume when cap reached - if(constructing()){ - return Units.canCreate(team, upgrade(payload.unit.type())); - } - return false; + return constructing(); } public UnitType unit(){ diff --git a/core/src/mindustry/world/blocks/units/RepairPoint.java b/core/src/mindustry/world/blocks/units/RepairPoint.java index d0670783c8..6100e5c61f 100644 --- a/core/src/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/mindustry/world/blocks/units/RepairPoint.java @@ -6,6 +6,7 @@ import arc.math.*; import arc.math.geom.*; import arc.struct.*; import arc.util.*; +import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.entities.*; import mindustry.gen.*; @@ -70,10 +71,11 @@ public class RepairPoint extends Block{ Draw.rect(baseRegion, x, y); Draw.z(Layer.turret); + Drawf.shadow(region, x - (size / 2), y - (size / 2), rotation - 90); Draw.rect(region, x, y, rotation - 90); if(target != null && Angles.angleDist(angleTo(target), rotation) < 30f){ - Draw.z(Layer.power); + Draw.z(Layer.flyingUnit + 1); //above all units float ang = angleTo(target); float len = 5f; diff --git a/core/src/mindustry/world/blocks/units/ResupplyPoint.java b/core/src/mindustry/world/blocks/units/ResupplyPoint.java index 5967fdd035..2af0998421 100644 --- a/core/src/mindustry/world/blocks/units/ResupplyPoint.java +++ b/core/src/mindustry/world/blocks/units/ResupplyPoint.java @@ -5,6 +5,7 @@ import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; import mindustry.graphics.*; +import mindustry.type.AmmoTypes.*; import mindustry.world.*; import static mindustry.Vars.*; @@ -53,10 +54,10 @@ public class ResupplyPoint extends Block{ public static boolean resupply(Building tile, float range, int ammoAmount, Color ammoColor){ if(!state.rules.unitAmmo) return false; - Unit unit = Units.closest(tile.team, tile.x, tile.y, range, u -> u.ammo() <= u.type().ammoCapacity - ammoAmount); + Unit unit = Units.closest(tile.team, tile.x, tile.y, range, u -> u.type().ammoType instanceof ItemAmmoType && u.ammo <= u.type().ammoCapacity - ammoAmount); if(unit != null){ Fx.itemTransfer.at(tile.x, tile.y, ammoAmount / 2f, ammoColor, unit); - unit.ammo(Math.min(unit.ammo() + ammoAmount, unit.type().ammoCapacity)); + unit.ammo = Math.min(unit.ammo + ammoAmount, unit.type().ammoCapacity); return true; } diff --git a/core/src/mindustry/world/blocks/units/UnitBlock.java b/core/src/mindustry/world/blocks/units/UnitBlock.java index 2409a9fde5..d1bce06795 100644 --- a/core/src/mindustry/world/blocks/units/UnitBlock.java +++ b/core/src/mindustry/world/blocks/units/UnitBlock.java @@ -55,7 +55,9 @@ public class UnitBlock extends PayloadAcceptor{ @Override public void dumpPayload(){ - Call.unitBlockSpawn(tile); + if(payload.dump()){ + Call.unitBlockSpawn(tile); + } } } } diff --git a/core/src/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index 4cddee5135..1e71caa8cb 100644 --- a/core/src/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -130,7 +130,7 @@ public class UnitFactory extends UnitBlock{ Seq units = Seq.with(plans).map(u -> u.unit).filter(u -> u.unlockedNow()); if(units.any()){ - ItemSelection.buildTable(table, units, () -> currentPlan == -1 ? null : plans[currentPlan].unit, unit -> configure(units.indexOf(unit))); + ItemSelection.buildTable(table, units, () -> currentPlan == -1 ? null : plans[currentPlan].unit, unit -> configure(Structs.indexOf(plans, u -> u.unit == unit))); }else{ table.table(Styles.black3, t -> t.add("@none").color(Color.lightGray)); } @@ -219,11 +219,8 @@ public class UnitFactory extends UnitBlock{ @Override public boolean shouldConsume(){ - //do not consume when cap reached - if(currentPlan != -1 && !Units.canCreate(team, plans[currentPlan].unit)){ - return false; - } - return enabled; + if(currentPlan == -1) return false; + 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..c818ba642a 100644 --- a/core/src/mindustry/world/meta/BlockFlag.java +++ b/core/src/mindustry/world/meta/BlockFlag.java @@ -10,8 +10,10 @@ public enum BlockFlag{ turret, /** Repair point. */ repair, - /** Rally point. TODO remove*/ + /** Rally point. */ rally, + /** Block that stored power for resupply. */ + powerResupply, /** 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 11add35e97..720f4c3d8e 100644 --- a/core/src/mindustry/world/meta/BlockStat.java +++ b/core/src/mindustry/world/meta/BlockStat.java @@ -8,8 +8,10 @@ import java.util.Locale; public enum BlockStat{ health(StatCategory.general), size(StatCategory.general), + displaySize(StatCategory.general), buildTime(StatCategory.general), buildCost(StatCategory.general), + memoryCapacity(StatCategory.general), itemCapacity(StatCategory.items), itemsMoved(StatCategory.items), @@ -47,6 +49,8 @@ public enum BlockStat{ targetsGround(StatCategory.shooting), damage(StatCategory.shooting), ammo(StatCategory.shooting), + shieldHealth(StatCategory.shooting), + cooldownTime(StatCategory.shooting), booster(StatCategory.optional), boostEffect(StatCategory.optional), diff --git a/core/src/mindustry/world/meta/BlockStats.java b/core/src/mindustry/world/meta/BlockStats.java index 2917a92aa3..e119ff8a74 100644 --- a/core/src/mindustry/world/meta/BlockStats.java +++ b/core/src/mindustry/world/meta/BlockStats.java @@ -38,12 +38,20 @@ public class BlockStats{ } public void add(BlockStat stat, Attribute attr){ - add(stat, attr, 1f); + add(stat, attr, false, 1f); } public void add(BlockStat stat, Attribute attr, float scale){ + add(stat, attr, false, scale); + } + + public void add(BlockStat stat, Attribute attr, boolean floating){ + add(stat, attr, floating, 1f); + } + + public void add(BlockStat stat, Attribute attr, boolean floating, float scale){ for(Block block : Vars.content.blocks()){ - if(!block.isFloor() || block.asFloor().attributes.get(attr) == 0) continue; + if(!block.isFloor() || block.asFloor().attributes.get(attr) == 0 || (block.asFloor().isLiquid && !floating)) continue; add(stat, new FloorEfficiencyValue(block.asFloor(), block.asFloor().attributes.get(attr) * scale)); } } diff --git a/core/src/mindustry/world/meta/StatUnit.java b/core/src/mindustry/world/meta/StatUnit.java index 5136280e8a..0466b4f139 100644 --- a/core/src/mindustry/world/meta/StatUnit.java +++ b/core/src/mindustry/world/meta/StatUnit.java @@ -16,9 +16,12 @@ public enum StatUnit{ powerUnits, degrees, seconds, + minutes, perSecond, + perMinute, timesSpeed(false), percent(false), + shieldHealth, none, items; diff --git a/core/src/mindustry/world/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 23a2b88745..7b3e4033ea 100644 --- a/core/src/mindustry/world/modules/ItemModule.java +++ b/core/src/mindustry/world/modules/ItemModule.java @@ -135,6 +135,15 @@ public class ItemModule extends BlockModule{ return true; } + public boolean has(ItemSeq items){ + for(Item item : content.items()){ + if(!has(item, items.get(item))){ + return false; + } + } + return true; + } + public boolean has(Iterable stacks){ for(ItemStack stack : stacks){ if(!has(stack.item, stack.amount)) return false; @@ -244,6 +253,12 @@ public class ItemModule extends BlockModule{ } } + public void undoFlow(Item item){ + if(flow != null){ + cacheSums[item.id] -= 1; + } + } + public void addAll(ItemModule items){ for(int i = 0; i < items.items.length; i++){ add(i, items.items[i]); @@ -261,6 +276,10 @@ public class ItemModule extends BlockModule{ for(ItemStack stack : stacks) remove(stack.item, stack.amount); } + public void remove(ItemSeq stacks){ + stacks.each(this::remove); + } + public void remove(Iterable stacks){ for(ItemStack stack : stacks) remove(stack.item, stack.amount); } @@ -276,30 +295,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); - int count = read.ub(); + int count = legacy ? read.ub() : read.s(); total = 0; for(int j = 0; j < count; j++){ - int itemid = read.ub(); + 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 b2fbb3407a..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; - int count = read.ub(); + int count = legacy ? read.ub() : read.s(); for(int j = 0; j < count; j++){ - int liquidid = read.ub(); + 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/SNet.java b/desktop/src/mindustry/desktop/steam/SNet.java index 9cd7c816ee..5d603067f3 100644 --- a/desktop/src/mindustry/desktop/steam/SNet.java +++ b/desktop/src/mindustry/desktop/steam/SNet.java @@ -79,10 +79,14 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, Log.err(e); } }else if(currentServer != null && fromID == currentServer.getAccountID()){ - net.handleClientReceived(output); + try{ + net.handleClientReceived(output); + }catch(Throwable t){ + net.handleException(t); + } } }catch(SteamException e){ - e.printStackTrace(); + Log.err(e); } } } @@ -233,7 +237,7 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, @Override public void onLobbyEnter(SteamID steamIDLobby, int chatPermissions, boolean blocked, ChatRoomEnterResponse response){ - Log.info("enter lobby @ @", steamIDLobby.getAccountID(), response); + Log.info("onLobbyEnter @ @", steamIDLobby.getAccountID(), response); if(response != ChatRoomEnterResponse.Success){ ui.loadfrag.hide(); @@ -241,6 +245,17 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, return; } + int version = Strings.parseInt(smat.getLobbyData(steamIDLobby, "version"), -1); + + //check version + if(version != Version.build){ + ui.loadfrag.hide(); + ui.showInfo("[scarlet]" + (version > Version.build ? KickReason.clientOutdated : KickReason.serverOutdated).toString() + "\n[]" + + Core.bundle.format("server.versions", Version.build, version)); + smat.leaveLobby(steamIDLobby); + return; + } + logic.reset(); net.reset(); diff --git a/desktop/src/mindustry/desktop/steam/SStats.java b/desktop/src/mindustry/desktop/steam/SStats.java index 2ee13bea4e..7e7c9ecef3 100644 --- a/desktop/src/mindustry/desktop/steam/SStats.java +++ b/desktop/src/mindustry/desktop/steam/SStats.java @@ -65,7 +65,7 @@ public class SStats implements SteamUserStatsCallback{ } for(Building entity : player.team().cores()){ - if(!content.items().contains(i -> entity.items.get(i) < entity.block().itemCapacity)){ + if(!content.items().contains(i -> entity.items.get(i) < entity.block.itemCapacity)){ fillCoreAllCampaign.complete(); break; } @@ -109,7 +109,7 @@ public class SStats implements SteamUserStatsCallback{ if(campaign() && e.unit != null && e.unit.isLocal() && !e.breaking){ SStat.blocksBuilt.add(); - if(e.tile.block() == Blocks.router && e.tile.build.proximity().contains(t -> t.block() == Blocks.router)){ + if(e.tile.block() == Blocks.router && e.tile.build.proximity().contains(t -> t.block == Blocks.router)){ chainRouters.complete(); } @@ -196,13 +196,14 @@ public class SStats implements SteamUserStatsCallback{ } }); - Events.on(LaunchEvent.class, e -> { - if(state.rules.tutorial){ - completeTutorial.complete(); - } - - SStat.timesLaunched.add(); - }); + //TODO + //Events.on(LaunchEvent.class, e -> { + // if(state.rules.tutorial){ + // completeTutorial.complete(); + // } +// + // SStat.timesLaunched.add(); + //}); Events.on(LaunchItemEvent.class, e -> { SStat.itemsLaunched.add(e.stack.amount); @@ -242,7 +243,7 @@ public class SStats implements SteamUserStatsCallback{ SStat.attacksWon.add(); } - RankResult result = state.stats.calculateRank(state.getSector(), state.launched); + RankResult result = state.stats.calculateRank(state.getSector(), true); if(result.rank == Rank.S) earnSRank.complete(); if(result.rank == Rank.SS) earnSSRank.complete(); } diff --git a/fastlane/metadata/android/cs-CZ/changelogs/29659.txt b/fastlane/metadata/android/cs-CZ/changelogs/29659.txt new file mode 100644 index 0000000000..db918ffffb --- /dev/null +++ b/fastlane/metadata/android/cs-CZ/changelogs/29659.txt @@ -0,0 +1,10 @@ +Toto je první alfa uvolnění verze 6.0 a obrovským přídavkem obsahu a kampaně. +I když bylo toto sestavení testováno ve hře více hráčů, stále může mít četné chyby. Jako obvykle, hlaste prosím problémy na Githubu. + +Přehled změn je příliš velký, ale mezi nejzajímavější patří: + +- Nový systém výroby jednotek, s přírůstkovými vylepšeními +- Přímé velení jednotkám a věžím +- Jednotky byly překresleny a přejmenovány +- Nové jednotky a bloky ve hře +- Námořní a hmyzu podobné jednotky diff --git a/fastlane/metadata/android/en-US/changelogs/29659.txt b/fastlane/metadata/android/en-US/changelogs/29659.txt new file mode 100644 index 0000000000..77646b10bd --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29659.txt @@ -0,0 +1,10 @@ +This is the first alpha release of 6.0, a massive campaign and content update. +While this build has been tested in multiplayer, it still may have numerous issues. As usual, report problems on Github. + +There are too many changes to list here, but the important bits include: + +- A new unit production system, with incremental upgrades +- Direct unit and turret control +- Renamed and re-sprited units +- New blocks and units +- Naval and insect-like units diff --git a/fastlane/metadata/android/en-US/changelogs/29661.txt b/fastlane/metadata/android/en-US/changelogs/29661.txt new file mode 100644 index 0000000000..076169ca4d --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29661.txt @@ -0,0 +1,9 @@ +- Fixed some bugs +- Didn't fix some other bugs +- Added 6 new units to fill in missing T4/5 upgrades +- Added unit outlines for visual clarity, may remove later +- Added mud floor (Contributed by ThePlayerA) +- Added research costs to units in tech tree +- Added ability to replace small walls with bigger ones directly +- Added launch pad destination selection (barely tested) +- Added team colors for storage blocks (Contributed by Voz-Duh) diff --git a/fastlane/metadata/android/en-US/changelogs/29664.txt b/fastlane/metadata/android/en-US/changelogs/29664.txt new file mode 100644 index 0000000000..cd151c8499 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/29664.txt @@ -0,0 +1,9 @@ +This is a small update. Not much new content, mostly bugfixes. +The next planned update will focus on the campaign, and will likely take much longer. + +- Bugfixes +- Added team color for command center (Contributed by Voz-Duh) +- Cleaned up certain sprites to match V6 style (Partially contributed by Voz-Duh) +- Added support for Java-based mods on Android (mostly undocumented for now) +- Added 2x2 high capacity memory bank for logic processors +- Balancing diff --git a/fastlane/metadata/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 8529200382..e4c41600b8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=2b13b4d008c3b5a35bf8ce3fc69a2de6708ba187 +archash=f4e823e80a634226c617e30f2d67d61562b8faaa diff --git a/server/server_template/run_server.bat b/server/server_template/run_server.bat index 8084a7149f..b470f31189 100644 --- a/server/server_template/run_server.bat +++ b/server/server_template/run_server.bat @@ -1 +1,2 @@ +@echo off java -jar server.jar diff --git a/server/src/mindustry/server/ServerControl.java b/server/src/mindustry/server/ServerControl.java index 29789f52a6..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(); @@ -67,6 +67,12 @@ public class ServerControl implements ApplicationListener{ //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); @@ -304,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); @@ -484,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."); @@ -742,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{ @@ -756,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."); @@ -960,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..c0b3bae268 100644 --- a/servers.json +++ b/servers.json @@ -1,7 +1,4 @@ [ - { - "address": "mindustry.us.to" - }, { "address": "mindustry.indielm.com:1101" }, @@ -11,15 +8,6 @@ { "address": "mindustry.nydus.app:1337" }, - { - "address": "mindustry.ecansol.com:6597" - }, - { - "address": "mindustry.ecansol.com:6499" - }, - { - "address": "mindustry.ecansol.com:6599" - }, { "address": "mindustry.ru" }, @@ -44,6 +32,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..5ebfae37df 100644 --- a/servers_be.json +++ b/servers_be.json @@ -1,11 +1,11 @@ [ { - "address": "mindustry.us.to:6568" + "address": "mindustry.us.to" }, { "address": "nydustry.nydus.app:6060" }, { - "address": "mindustry.pl:6000" + "address": "md.surrealment.com" } ] diff --git a/servers_v6.json b/servers_v6.json new file mode 100644 index 0000000000..85f4c11b19 --- /dev/null +++ b/servers_v6.json @@ -0,0 +1,26 @@ +[ + { + "address": "mindustry.pl:6000" + }, + { + "address": "mindustry.pl:6666" + }, + { + "address": "routerchain.ddns.net" + }, + { + "address": "mindustry.atannergaming.com:13000" + }, + { + "address": "pandorum.su:8000" + }, + { + "address": "mindustry.ecansol.com:6597" + }, + { + "address": "mindustry.ecansol.com:6499" + }, + { + "address": "mindustry.ecansol.com:6599" + } +] diff --git a/settings.gradle b/settings.gradle index 6883be3f0d..a8dfd17399 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")){ @@ -33,7 +33,6 @@ if(!hasProperty("release")){ ':Arc:extensions:recorder', ':Arc:extensions:arcnet', ':Arc:extensions:packer', - ':Arc:extensions:box2d', ':Arc:extensions:g3d', ':Arc:extensions:fx', ':Arc:natives', @@ -43,9 +42,6 @@ if(!hasProperty("release")){ ':Arc:natives:natives-freetype-desktop', ':Arc:natives:natives-freetype-android', ':Arc:natives:natives-freetype-ios', - ':Arc:natives:natives-box2d-desktop', - ':Arc:natives:natives-box2d-android', - ':Arc:natives:natives-box2d-ios', ':Arc:backends', ':Arc:backends:backend-sdl', ':Arc:backends:backend-android', diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index d4192ca9c6..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/build.gradle b/tools/build.gradle index 1b45dd95c0..3266834485 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -409,16 +409,6 @@ task genSprites(dependsOn: classes, type: JavaExec){ workingDir = genFolder } -task genSectorData(dependsOn: classes, type: JavaExec){ - main = "mindustry.tools.SectorDataGenerator" - classpath = sourceSets.main.runtimeClasspath - standardInput = System.in - workingDir = "../core/assets/" -} - -task updateCache(dependsOn: [genSectorData]){ -} - task updateBundles(dependsOn: classes, type: JavaExec){ file(genFolder).mkdirs() diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index 391f24c57f..2bc7fd4eac 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -2,6 +2,7 @@ package mindustry.tools; import arc.*; import arc.files.*; +import arc.func.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -126,7 +127,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 +173,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++){ @@ -232,18 +233,22 @@ public class Generators{ boolean hasEmpty = false; Color average = new Color(); + float asum = 0f; for(int x = 0; x < image.width; x++){ for(int y = 0; y < image.height; y++){ Color color = image.getColor(x, y); - average.r += color.r; - average.g += color.g; - average.b += color.b; + average.r += color.r*color.a; + average.g += color.g*color.a; + average.b += color.b*color.a; + asum += color.a; if(color.a < 0.9f){ hasEmpty = true; } } } - average.mul(1f / (image.width * image.height)); + + average.mul(1f / asum); + if(block instanceof Floor){ average.mul(0.8f); }else{ @@ -302,18 +307,37 @@ public class Generators{ ImagePacker.generate("unit-icons", () -> content.units().each(type -> { if(type.isHidden()) return; //hidden units don't generate + ObjectSet outlined = new ObjectSet<>(); + try{ type.load(); type.init(); - Image image = ImagePacker.get(type.parts > 0 ? type.partRegions[0] : type.region); - for(int i = 1; i < type.parts; i++){ - image.draw(ImagePacker.get(type.partRegions[i])); - } - if(type.parts > 0){ - image.save(type.name); + Color outc = Pal.darkerMetal; + Func outline = i -> i.outline(3, outc); + Cons outliner = t -> { + if(t != null && t.found()){ + ImagePacker.replace(t, outline.get(ImagePacker.get(t))); + } + }; + + for(Weapon weapon : type.weapons){ + if(outlined.add(weapon.name) && ImagePacker.has(weapon.name)){ + outline.get(ImagePacker.get(weapon.name)).save(weapon.name + "-outline"); + } } + outliner.get(type.jointRegion); + outliner.get(type.footRegion); + outliner.get(type.legBaseRegion); + outliner.get(type.baseJointRegion); + if(type.constructor.get() instanceof Legsc) outliner.get(type.legRegion); + + Image image = outline.get(ImagePacker.get(type.region)); + + image.save(type.name + "-outline"); + + //draw mech parts if(type.constructor.get() instanceof Mechc){ image.drawCenter(type.baseRegion); image.drawCenter(type.legRegion); @@ -321,16 +345,21 @@ public class Generators{ image.draw(type.region); } - Image baseCell = ImagePacker.get(type.parts > 0 ? type.partCellRegions[0] : type.cellRegion); - for(int i = 1; i < type.parts; i++){ - baseCell.draw(ImagePacker.get(type.partCellRegions[i])); + //draw outlines + for(Weapon weapon : type.weapons){ + weapon.load(); + + image.draw(outline.get(ImagePacker.get(weapon.region)), + (int)(weapon.x / Draw.scl + image.width / 2f - weapon.region.width / 2f), + (int)(-weapon.y / Draw.scl + image.height / 2f - weapon.region.height / 2f), + weapon.flipSprite, false); } - if(type.parts > 0){ - image.save(type.name + "-cell"); - } + //draw base region on top to mask weapons + image.draw(type.region); - Image cell = new Image(type.cellRegion.getWidth(), type.cellRegion.getHeight()); + Image baseCell = ImagePacker.get(type.cellRegion); + Image cell = new Image(type.cellRegion.width, type.cellRegion.height); cell.each((x, y) -> cell.draw(x, y, baseCell.getColor(x, y).mul(Color.valueOf("ffa665")))); image.draw(cell, image.width / 2 - cell.width / 2, image.height / 2 - cell.height / 2); @@ -338,9 +367,9 @@ public class Generators{ for(Weapon weapon : type.weapons){ weapon.load(); - image.draw(weapon.region, - (int)(weapon.x / Draw.scl + image.width / 2f - weapon.region.getWidth() / 2f), - (int)(-weapon.y / Draw.scl + image.height / 2f - weapon.region.getHeight() / 2f), + image.draw(weapon.top ? outline.get(ImagePacker.get(weapon.region)) : ImagePacker.get(weapon.region), + (int)(weapon.x / Draw.scl + image.width / 2f - weapon.region.width / 2f), + (int)(-weapon.y / Draw.scl + image.height / 2f - weapon.region.height / 2f), weapon.flipSprite, false); } @@ -382,7 +411,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..83594f22be 100644 --- a/tools/src/mindustry/tools/Image.java +++ b/tools/src/mindustry/tools/Image.java @@ -3,6 +3,8 @@ package mindustry.tools; import arc.func.*; import arc.graphics.Color; import arc.graphics.g2d.*; +import arc.math.*; +import arc.math.geom.*; import arc.struct.*; import arc.util.*; import mindustry.tools.ImagePacker.*; @@ -60,6 +62,76 @@ class Image{ return color; } + Image outline(int radius, Color outlineColor){ + Image out = copy(); + for(int x = 0; x < out.width; x++){ + for(int y = 0; y < out.height; y++){ + + Color color = getColor(x, y); + out.draw(x, y, color); + if(color.a < 1f){ + boolean found = false; + outer: + for(int rx = -radius; rx <= radius; rx++){ + for(int ry = -radius; ry <= radius; ry++){ + if(Mathf.dst(rx, ry) <= radius && getColor(rx + x, ry + y).a > 0.01f){ + found = true; + break outer; + } + } + } + if(found){ + out.draw(x, y, outlineColor); + } + } + } + } + return out; + } + + Image shadow(float alpha, int rad){ + Image out = silhouette(new Color(0f, 0f, 0f, alpha)).blur(rad); + out.draw(this); + return out; + } + + Image silhouette(Color color){ + Image out = copy(); + + each((x, y) -> out.draw(x, y, getColor(x, y).set(color.r, color.g, color.b, this.color.a * color.a))); + + return out; + } + + Image blur(int radius){ + Image out = copy(); + Color c = new Color(); + int[] sum = {0}; + + for(int x = 0; x < out.width; x++){ + for(int y = 0; y < out.height; y++){ + sum[0] = 0; + + Geometry.circle(x, y, radius, (cx, cy) -> { + int rx = Mathf.clamp(cx, 0, out.width - 1), ry = Mathf.clamp(cy, 0, out.height - 1); + + Color other = getColor(rx, ry); + c.r += other.r; + c.g += other.g; + c.b += other.b; + c.a += other.a; + sum[0] ++; + }); + + c.mula(1f / sum[0]); + + out.draw(x, y, c); + } + } + + return out; + } + void each(Intc2 cons){ for(int x = 0; x < width; x++){ for(int y = 0; y < height; y++){ @@ -81,12 +153,12 @@ class Image{ /** Draws a region at the center. */ void drawCenter(TextureRegion region){ - draw(region, (width - region.getWidth()) / 2, (height - region.getHeight()) / 2, false, false); + draw(region, (width - region.width) / 2, (height - region.height) / 2, false, false); } /** Draws a region at the center. */ void drawCenter(TextureRegion region, boolean flipx, boolean flipy){ - draw(region, (width - region.getWidth()) / 2, (height - region.getHeight()) / 2, flipx, flipy); + draw(region, (width - region.width) / 2, (height - region.height) / 2, flipx, flipy); } void drawScaled(Image image){ @@ -110,16 +182,21 @@ class Image{ void draw(TextureRegion region, int x, int y, boolean flipx, boolean flipy){ GenRegion.validate(region); + draw(ImagePacker.get(region), x, y, flipx, flipy); + } + + void draw(Image region, int x, int y, boolean flipx, boolean flipy){ + int ofx = 0, ofy = 0; - graphics.drawImage(ImagePacker.get(region).image, + graphics.drawImage(region.image, x, y, - x + region.getWidth(), - y + region.getHeight(), - (flipx ? region.getWidth() : 0) + ofx, - (flipy ? region.getHeight() : 0) + ofy, - (flipx ? 0 : region.getWidth()) + ofx, - (flipy ? 0 : region.getHeight()) + ofy, + x + region.width, + y + region.height, + (flipx ? region.width : 0) + ofx, + (flipy ? region.height : 0) + ofy, + (flipx ? 0 : region.width) + ofx, + (flipy ? 0 : region.height) + ofy, null); } diff --git a/tools/src/mindustry/tools/ImagePacker.java b/tools/src/mindustry/tools/ImagePacker.java index 9f359dd30a..2533f99af9 100644 --- a/tools/src/mindustry/tools/ImagePacker.java +++ b/tools/src/mindustry/tools/ImagePacker.java @@ -42,28 +42,12 @@ public class ImagePacker{ BufferedImage image = ImageIO.read(path.file()); if(image == null) throw new IOException("image " + path.absolutePath() + " is null for terrible reasons"); - GenRegion region = new GenRegion(fname, path){ - - @Override - public int getX(){ - return 0; - } - - @Override - public int getY(){ - return 0; - } - - @Override - public int getWidth(){ - return image.getWidth(); - } - - @Override - public int getHeight(){ - return image.getHeight(); - } - }; + GenRegion region = new GenRegion(fname, path){{ + width = image.getWidth(); + height = image.getHeight(); + u2 = v2 = 1f; + u = v = 0f; + }}; regionCache.put(fname, region); imageCache.put(fname, image); @@ -105,7 +89,7 @@ public class ImagePacker{ } }; - Draw.scl = 1f / Core.atlas.find("scale_marker").getWidth(); + Draw.scl = 1f / Core.atlas.find("scale_marker").width; Time.mark(); Generators.generate(); @@ -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()){ @@ -179,6 +163,15 @@ public class ImagePacker{ return new Image(imageCache.get(((AtlasRegion)region).name)); } + static void replace(String name, Image image){ + image.save(name); + ((GenRegion)Core.atlas.find(name)).path.delete(); + } + + static void replace(TextureRegion region, Image image){ + replace(((GenRegion)region).name, image); + } + static void err(String message, Object... args){ throw new IllegalArgumentException(Strings.format(message, args)); } diff --git a/tools/src/mindustry/tools/ScriptMainGenerator.java b/tools/src/mindustry/tools/ScriptMainGenerator.java index 06b76360d9..e15335e91a 100644 --- a/tools/src/mindustry/tools/ScriptMainGenerator.java +++ b/tools/src/mindustry/tools/ScriptMainGenerator.java @@ -11,6 +11,8 @@ import arc.struct.*; import arc.util.*; import mindustry.game.*; import mindustry.gen.*; +import mindustry.io.*; +import mindustry.net.*; import java.io.*; import java.lang.reflect.*; @@ -41,6 +43,8 @@ public class ScriptMainGenerator{ classes.removeAll(type -> type.isSynthetic() || type.isAnonymousClass() || type.getCanonicalName() == null || Modifier.isPrivate(type.getModifiers()) || blacklist.contains(s -> type.getName().startsWith(base + "." + s + ".")) || nameBlacklist.contains(type.getSimpleName())); + classes.add(NetConnection.class, SaveIO.class); + classes.distinct(); classes.sortComparing(Class::getName); ObjectSet used = ObjectSet.with(); @@ -53,12 +57,12 @@ public class ScriptMainGenerator{ 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 deleted file mode 100644 index 34cc7c7200..0000000000 --- a/tools/src/mindustry/tools/SectorDataGenerator.java +++ /dev/null @@ -1,166 +0,0 @@ -package mindustry.tools; - -import arc.*; -import arc.backend.headless.mock.*; -import arc.files.*; -import arc.mock.*; -import arc.struct.*; -import arc.struct.ObjectIntMap.*; -import arc.util.*; -import arc.util.io.*; -import mindustry.*; -import mindustry.content.*; -import mindustry.core.*; -import mindustry.ctype.*; -import mindustry.game.*; -import mindustry.net.Net; -import mindustry.type.*; -import mindustry.type.Sector.*; -import mindustry.world.*; -import mindustry.world.blocks.storage.CoreBlock.*; - -import static mindustry.Vars.*; - -public class SectorDataGenerator{ - - public static void main(String[] args){ - ArcNativesLoader.load(); - Core.files = new MockFiles(); - Core.app = new MockApplication(); - Core.settings = new MockSettings(); - Core.graphics = new MockGraphics(); - - headless = true; - net = new Net(null); - tree = new FileTree(); - Vars.init(); - content.createBaseContent(); - - logic = new Logic(); - netServer = new NetServer(); - world = new World(); - - content.init(); - - for(Planet planet : content.getBy(ContentType.planet)){ - int[] count = {0}; - if(planet.grid == null) continue; - - Fi fi = Fi.get("planets").child(planet.name + ".dat"); - - Seq list = planet.sectors.map(sector -> { - SectorData data = new SectorData(); - - ObjectIntMap floors = new ObjectIntMap<>(); - ObjectSet content = new ObjectSet<>(); - - logic.reset(); - world.loadSector(sector); - float waterFloors = 0, totalFloors = 0; - state.rules.sector = sector; - - for(Tile tile : world.tiles){ - if(world.getDarkness(tile.x, tile.y) >= 3){ - continue; - } - - Liquid liquid = tile.floor().liquidDrop; - if(tile.floor().itemDrop != null) content.add(tile.floor().itemDrop); - if(tile.overlay().itemDrop != null) content.add(tile.overlay().itemDrop); - if(liquid != null) content.add(liquid); - - if(!tile.block().isStatic()){ - totalFloors ++; - if(liquid == Liquids.water){ - waterFloors += tile.floor().isDeep() ? 1f : 0.7f; - } - floors.increment(tile.floor()); - if(tile.overlay() != Blocks.air){ - floors.increment(tile.overlay()); - } - } - } - - CoreBuild entity = Team.sharded.core(); - int cx = entity.tileX(), cy = entity.tileY(); - - int nearTiles = 0; - int waterCheckRad = 5; - - //check for water presence - for(int rx = -waterCheckRad; rx <= waterCheckRad; rx++){ - for(int ry = -waterCheckRad; ry <= waterCheckRad; ry++){ - Tile tile = world.tile(cx + rx, cy + ry); - if(tile == null || tile.floor().liquidDrop != null){ - nearTiles ++; - } - } - } - - if(waterFloors / totalFloors >= 0.6f){ - Log.debug("Sector @ has @/@ water -> naval", sector.id, waterFloors, totalFloors); - } - - //naval sector guaranteed - if(nearTiles > 4){ - Log.debug("Sector @ has @ water tiles at @ @ -> naval", sector.id, nearTiles, cx, cy); - waterFloors = totalFloors; - } - - //sort counts in descending order - Seq> entries = floors.entries().toArray(); - entries.sort(e -> -e.value); - //remove all blocks occuring < 30 times - unimportant - entries.removeAll(e -> e.value < 30); - - data.floors = new Block[entries.size]; - data.floorCounts = new int[entries.size]; - for(int i = 0; i < entries.size; i++){ - data.floorCounts[i] = entries.get(i).value; - data.floors[i] = entries.get(i).key; - } - - //TODO bad code - boolean hasSnow = data.floors[0].name.contains("ice") || data.floors[0].name.contains("snow"); - boolean hasRain = !hasSnow && data.floors[0].name.contains("water"); - boolean hasDesert = !hasSnow && !hasRain && data.floors[0].name.contains("sand"); - boolean hasSpores = data.floors[0].name.contains("spore") || data.floors[0].name.contains("moss") || data.floors[0].name.contains("tainted"); - - if(hasSnow){ - data.attributes |= (1 << SectorAttribute.snowy.ordinal()); - } - - if(hasRain){ - data.attributes |= (1 << SectorAttribute.rainy.ordinal()); - } - - if(hasDesert){ - data.attributes |= (1 << SectorAttribute.desert.ordinal()); - } - - if(hasSpores){ - data.attributes |= (1 << SectorAttribute.spores.ordinal()); - } - - data.resources = content.asArray().sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id))).toArray(UnlockableContent.class); - - //50% water -> naval attribute - if(waterFloors / totalFloors >= 0.6f){ - data.attributes |= (1 << SectorAttribute.naval.ordinal()); - } - - if(count[0]++ % 10 == 0){ - Log.info("&lyDone with sector &lm@/@", count[0], planet.sectors.size); - } - - return data; - }); - - //write data - try(Writes write = fi.writes()){ - write.s(list.size); - list.each(s -> s.write(write)); - } - } - } -}