diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index d7d43c1d44..c2326a4d0a 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -3,15 +3,26 @@ name: Java CI on: [push] jobs: - build: - + buildJava8: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - - name: Set up JDK 1.8 + - name: Set up JDK 8 uses: actions/setup-java@v1 with: - java-version: 1.8 - #- name: Run unit tests with gradle - # run: ./gradlew test + java-version: 8 + - name: Run unit tests with gradle and Java 8 + run: ./gradlew test + + buildJava14: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + - name: Set up JDK 14 + uses: actions/setup-java@v1 + with: + java-version: 14 + - name: Run unit tests with gradle and Java 14 + run: ./gradlew test diff --git a/.travis.yml b/.travis.yml index 9c63be80eb..ef04618dc9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,6 +20,12 @@ script: - "./gradlew test" - "./gradlew desktop:dist -Pbuildversion=${TRAVIS_TAG:1}" - "./gradlew server:dist -Pbuildversion=${TRAVIS_TAG:1}" +- "./gradlew core:javadoc" +- cd ../ +- git clone --depth=1 https://github.com/MindustryGame/docs.git +- 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 deploy: - provider: releases skip_cleanup: true diff --git a/README.md b/README.md index 03152f0cf6..06026e0e02 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,8 @@ A sandbox tower defense game written in Java. _[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_ -_[Wiki](https://mindustrygame.github.io/wiki)_ +_[Wiki](https://mindustrygame.github.io/wiki)_ +_[Javadoc](https://mindustrygame.github.io/docs/)_ ### Contributing diff --git a/android/src/mindustry/android/AndroidLauncher.java b/android/src/mindustry/android/AndroidLauncher.java index 4d41e46cb4..60735d9f7d 100644 --- a/android/src/mindustry/android/AndroidLauncher.java +++ b/android/src/mindustry/android/AndroidLauncher.java @@ -69,7 +69,7 @@ public class AndroidLauncher extends AndroidApplication{ } @Override - public org.mozilla.javascript.Context getScriptContext(){ + public rhino.Context getScriptContext(){ return AndroidRhinoContext.enter(getContext().getCacheDir()); } diff --git a/android/src/mindustry/android/AndroidRhinoContext.java b/android/src/mindustry/android/AndroidRhinoContext.java index bd6c144478..513911820d 100644 --- a/android/src/mindustry/android/AndroidRhinoContext.java +++ b/android/src/mindustry/android/AndroidRhinoContext.java @@ -13,7 +13,7 @@ import com.android.dx.dex.cf.*; import com.android.dx.dex.file.DexFile; import com.android.dx.merge.*; import dalvik.system.*; -import org.mozilla.javascript.*; +import rhino.*; import java.io.*; import java.nio.*; diff --git a/annotations/build.gradle b/annotations/build.gradle index d6f05e0038..4ee43cfcb3 100644 --- a/annotations/build.gradle +++ b/annotations/build.gradle @@ -1,3 +1,2 @@ -sourceCompatibility = 1.8 sourceSets.main.java.srcDirs = ["src/main/java/"] sourceSets.main.resources.srcDirs = ["src/main/resources/"] \ No newline at end of file diff --git a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java index 22b3e173f3..46c4b92f73 100644 --- a/annotations/src/main/java/mindustry/annotations/BaseProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/BaseProcessor.java @@ -1,7 +1,7 @@ package mindustry.annotations; import arc.files.*; -import arc.struct.Array; +import arc.struct.*; import arc.util.*; import arc.util.Log; import arc.util.Log.*; @@ -126,12 +126,12 @@ public abstract class BaseProcessor extends AbstractProcessor{ write(builder, null); } - public static void write(TypeSpec.Builder builder, Array imports) throws Exception{ + public static void write(TypeSpec.Builder builder, Seq imports) throws Exception{ JavaFile file = JavaFile.builder(packageName, builder.build()).skipJavaLangImports(true).build(); if(imports != null){ String rawSource = file.toString(); - Array result = new Array<>(); + Seq result = new Seq<>(); for (String s : rawSource.split("\n", -1)) { result.add(s); if (s.startsWith("package ")) { @@ -152,22 +152,22 @@ public abstract class BaseProcessor extends AbstractProcessor{ } } - public Array elements(Class type){ - return Array.with(env.getElementsAnnotatedWith(type)).map(Selement::new); + public Seq elements(Class type){ + return Seq.with(env.getElementsAnnotatedWith(type)).map(Selement::new); } - public Array types(Class type){ - return Array.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof TypeElement) + public Seq types(Class type){ + return Seq.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof TypeElement) .map(e -> new Stype((TypeElement)e)); } - public Array fields(Class type){ - return Array.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof VariableElement) + public Seq fields(Class type){ + return Seq.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof VariableElement) .map(e -> new Svar((VariableElement)e)); } - public Array methods(Class type){ - return Array.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof ExecutableElement) + public Seq methods(Class type){ + return Seq.with(env.getElementsAnnotatedWith(type)).select(e -> e instanceof ExecutableElement) .map(e -> new Smethod((ExecutableElement)e)); } diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java index 8472c060cc..2ec0185aef 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityIO.java @@ -19,12 +19,14 @@ public class EntityIO{ final static Json json = new Json(); //suffixes for sync fields final static String targetSuf = "_TARGET_", lastSuf = "_LAST_"; + //replacements after refactoring + final static StringMap replacements = StringMap.of("mindustry.entities.units.BuildRequest", "mindustry.entities.units.BuildPlan"); final ClassSerializer serializer; final String name; final TypeSpec.Builder type; final Fi directory; - final Array revisions = new Array<>(); + final Seq revisions = new Seq<>(); boolean write; MethodSpec.Builder method; @@ -47,7 +49,7 @@ public class EntityIO{ int nextRevision = revisions.isEmpty() ? 0 : revisions.max(r -> r.version).version + 1; //resolve preferred field order based on fields that fit - Array fields = Array.with(type.fieldSpecs).select(spec -> + Seq fields = Seq.with(type.fieldSpecs).select(spec -> !spec.hasModifier(Modifier.TRANSIENT) && !spec.hasModifier(Modifier.STATIC) && !spec.hasModifier(Modifier.FINAL)/* && @@ -110,7 +112,7 @@ public class EntityIO{ } } - void writeSync(MethodSpec.Builder method, boolean write, Array syncFields, Array allFields) throws Exception{ + void writeSync(MethodSpec.Builder method, boolean write, Seq syncFields, Seq allFields) throws Exception{ this.method = method; this.write = write; @@ -147,7 +149,7 @@ public class EntityIO{ } } - void writeSyncManual(MethodSpec.Builder method, boolean write, Array syncFields) throws Exception{ + void writeSyncManual(MethodSpec.Builder method, boolean write, Seq syncFields) throws Exception{ this.method = method; this.write = write; @@ -170,7 +172,7 @@ public class EntityIO{ } } - void writeInterpolate(MethodSpec.Builder method, Array fields) throws Exception{ + void writeInterpolate(MethodSpec.Builder method, Seq fields) throws Exception{ this.method = method; cont("if(lastUpdated != 0 && updateSpacing != 0)"); @@ -197,6 +199,9 @@ public class EntityIO{ } private void io(String type, String field) throws Exception{ + type = type.replace("mindustry.gen.", ""); + type = replacements.get(type, type); + if(BaseProcessor.isPrimitive(type)){ s(type.equals("boolean") ? "bool" : type.charAt(0) + "", field); }else if(instanceOf(type, "mindustry.ctype.Content")){ @@ -234,7 +239,7 @@ public class EntityIO{ String struct = type.substring(0, type.indexOf("<")); String generic = type.substring(type.indexOf("<") + 1, type.indexOf(">")); - if(struct.equals("arc.struct.Queue") || struct.equals("arc.struct.Array")){ + if(struct.equals("arc.struct.Queue") || struct.equals("arc.struct.Seq")){ if(write){ s("i", field + ".size"); cont("for(int INDEX = 0; INDEX < $L.size; INDEX ++)", field); @@ -289,9 +294,9 @@ public class EntityIO{ public static class Revision{ int version; - Array fields; + Seq fields; - Revision(int version, Array fields){ + Revision(int version, Seq fields){ this.version = version; this.fields = fields; } @@ -299,7 +304,7 @@ public class EntityIO{ Revision(){} /** @return whether these two revisions are compatible */ - boolean equal(Array specs){ + boolean equal(Seq specs){ if(fields.size != specs.size) return false; for(int i = 0; i < fields.size; i++){ diff --git a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java index f3fb569aff..a9ae65c448 100644 --- a/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java +++ b/annotations/src/main/java/mindustry/annotations/entity/EntityProcess.java @@ -30,18 +30,18 @@ import java.lang.annotation.*; "mindustry.annotations.Annotations.TypeIOHandler" }) public class EntityProcess extends BaseProcessor{ - Array definitions = new Array<>(); - Array groupDefs = new Array<>(); - Array baseComponents; + Seq definitions = new Seq<>(); + Seq groupDefs = new Seq<>(); + Seq baseComponents; ObjectMap componentNames = new ObjectMap<>(); - ObjectMap> componentDependencies = new ObjectMap<>(); - ObjectMap> defComponents = new ObjectMap<>(); - ObjectMap varInitializers = new ObjectMap<>(); - ObjectMap methodBlocks = new ObjectMap<>(); + ObjectMap> componentDependencies = new ObjectMap<>(); + ObjectMap> defComponents = new ObjectMap<>(); + ObjectMap varInitializers = new ObjectMap<>(); + ObjectMap methodBlocks = new ObjectMap<>(); ObjectSet imports = new ObjectSet<>(); - Array allGroups = new Array<>(); - Array allDefs = new Array<>(); - Array allInterfaces = new Array<>(); + Seq allGroups = new Seq<>(); + Seq allDefs = new Seq<>(); + Seq allInterfaces = new Seq<>(); ClassSerializer serializer; { @@ -58,7 +58,7 @@ public class EntityProcess extends BaseProcessor{ if(round == 1){ serializer = TypeIOResolver.resolve(this); baseComponents = types(BaseComponent.class); - Array allComponents = types(Component.class); + Seq allComponents = types(Component.class); //store code for(Stype component : allComponents){ @@ -68,14 +68,14 @@ public class EntityProcess extends BaseProcessor{ //add initializer if it exists if(tree.getInitializer() != null){ String init = tree.getInitializer().toString(); - varInitializers.put(f, init); + varInitializers.put(f.descString(), init); } } 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, elem.tree().getBody().toString()); + methodBlocks.put(elem.descString(), elem.tree().getBody().toString()); } } @@ -103,7 +103,7 @@ public class EntityProcess extends BaseProcessor{ } //implement super interfaces - Array depends = getDependencies(component); + Seq depends = getDependencies(component); for(Stype type : depends){ inter.addSuperinterface(ClassName.get(packageName, interfaceName(type))); } @@ -133,7 +133,7 @@ public class EntityProcess extends BaseProcessor{ //getter if(!signatures.contains(cname + "()")){ inter.addMethod(MethodSpec.methodBuilder(cname).addModifiers(Modifier.ABSTRACT, Modifier.PUBLIC) - .addAnnotations(Array.with(field.annotations()).select(a -> a.toString().contains("Null")).map(AnnotationSpec::get)) + .addAnnotations(Seq.with(field.annotations()).select(a -> a.toString().contains("Null")).map(AnnotationSpec::get)) .addJavadoc(field.doc() == null ? "" : field.doc()) .returns(field.tname()).build()); } @@ -144,7 +144,7 @@ public class EntityProcess extends BaseProcessor{ inter.addMethod(MethodSpec.methodBuilder(cname).addModifiers(Modifier.ABSTRACT, Modifier.PUBLIC) .addJavadoc(field.doc() == null ? "" : field.doc()) .addParameter(ParameterSpec.builder(field.tname(), field.name()) - .addAnnotations(Array.with(field.annotations()) + .addAnnotations(Seq.with(field.annotations()) .select(a -> a.toString().contains("Null")).map(AnnotationSpec::get)).build()).build()); } } @@ -161,7 +161,7 @@ public class EntityProcess extends BaseProcessor{ //log methods generated for(MethodSpec spec : inter.methodSpecs){ - Log.debug("&g> > &c@ @(@)", simpleName(spec.returnType.toString()), spec.name, Array.with(spec.parameters).toString(", ", p -> simpleName(p.type.toString()) + " " + p.name)); + Log.debug("&g> > &c@ @(@)", simpleName(spec.returnType.toString()), spec.name, Seq.with(spec.parameters).toString(", ", p -> simpleName(p.type.toString()) + " " + p.name)); } Log.debug(""); @@ -170,9 +170,10 @@ public class EntityProcess extends BaseProcessor{ }else if(round == 2){ //round 2: get component classes and generate interfaces for them //parse groups + //this needs to be done before the entity interfaces are generated, as the entity classes need to know which groups to add themselves to for(Selement group : allGroups){ GroupDef an = group.annotation(GroupDef.class); - Array types = types(an, GroupDef::value).map(this::interfaceToComp); + Seq types = types(an, GroupDef::value).map(this::interfaceToComp); boolean collides = an.collide(); groupDefs.add(new GroupDefinition(group.name().startsWith("g") ? group.name().substring(1) : group.name(), ClassName.bestGuess(packageName + "." + interfaceName(types.first())), types, an.spatial(), an.mapping(), collides)); @@ -183,6 +184,7 @@ public class EntityProcess extends BaseProcessor{ //look at each definition for(Selement type : allDefs){ + EntityDef ann = type.annotation(EntityDef.class); boolean isFinal = ann.isFinal(); @@ -209,9 +211,9 @@ public class EntityProcess extends BaseProcessor{ TypeSpec.Builder builder = TypeSpec.classBuilder(name).addModifiers(Modifier.PUBLIC); if(isFinal) builder.addModifiers(Modifier.FINAL); - Array components = allComponents(type); - Array groups = groupDefs.select(g -> (!g.components.isEmpty() && !g.components.contains(s -> !components.contains(s))) || g.manualInclusions.contains(type)); - ObjectMap> methods = new ObjectMap<>(); + Seq components = allComponents(type); + Seq groups = groupDefs.select(g -> (!g.components.isEmpty() && !g.components.contains(s -> !components.contains(s))) || g.manualInclusions.contains(type)); + ObjectMap> methods = new ObjectMap<>(); ObjectMap specVariables = new ObjectMap<>(); ObjectSet usedFields = new ObjectSet<>(); @@ -219,8 +221,8 @@ public class EntityProcess extends BaseProcessor{ builder.addMethod(MethodSpec.methodBuilder("serialize").addModifiers(Modifier.PUBLIC, Modifier.FINAL).returns(boolean.class).addStatement("return " + ann.serialize()).build()); //all SyncField fields - Array syncedFields = new Array<>(); - Array allFields = new Array<>(); + Seq syncedFields = new Seq<>(); + Seq allFields = new Seq<>(); boolean isSync = components.contains(s -> s.name().contains("Sync")); @@ -228,7 +230,7 @@ public class EntityProcess extends BaseProcessor{ for(Stype comp : components){ //write fields to the class; ignoring transient/imported ones - Array fields = comp.fields().select(f -> !f.has(Import.class)); + Seq fields = comp.fields().select(f -> !f.has(Import.class)); for(Svar f : fields){ if(!usedFields.add(f.name())){ err("Field '" + f.name() + "' of component '" + comp.name() + "' re-defines a field in entity '" + type.name() + "'"); @@ -247,8 +249,8 @@ public class EntityProcess extends BaseProcessor{ } //add initializer if it exists - if(varInitializers.containsKey(f)){ - fbuilder.initializer(varInitializers.get(f)); + if(varInitializers.containsKey(f.descString())){ + fbuilder.initializer(varInitializers.get(f.descString())); } fbuilder.addModifiers(f.has(ReadOnly.class) ? Modifier.PROTECTED : Modifier.PUBLIC); @@ -277,9 +279,9 @@ public class EntityProcess extends BaseProcessor{ } } - //get all utility methods from components + //get all methods from components for(Smethod elem : comp.methods()){ - methods.get(elem.toString(), Array::new).add(elem); + methods.get(elem.toString(), Seq::new).add(elem); } } @@ -297,7 +299,7 @@ public class EntityProcess extends BaseProcessor{ boolean hasIO = ann.genio() && (components.contains(s -> s.name().contains("Sync")) || ann.serialize()); //add all methods from components - for(ObjectMap.Entry> entry : methods){ + for(ObjectMap.Entry> entry : methods){ if(entry.value.contains(m -> m.has(Replace.class))){ //check replacements if(entry.value.count(m -> m.has(Replace.class)) > 1){ @@ -388,10 +390,12 @@ public class EntityProcess extends BaseProcessor{ } for(Smethod elem : entry.value){ - if(elem.is(Modifier.ABSTRACT) || elem.is(Modifier.NATIVE) || !methodBlocks.containsKey(elem)) continue; + String descStr = elem.descString(); + + if(elem.is(Modifier.ABSTRACT) || elem.is(Modifier.NATIVE) || !methodBlocks.containsKey(descStr)) continue; //get all statements in the method, copy them over - String str = methodBlocks.get(elem); + String str = methodBlocks.get(descStr); //name for code blocks in the methods String blockName = elem.up().getSimpleName().toString().toLowerCase().replace("comp", ""); @@ -434,13 +438,14 @@ public class EntityProcess extends BaseProcessor{ for(FieldSpec spec : builder.fieldSpecs){ @Nullable Svar variable = specVariables.get(spec); if(variable != null && variable.isAny(Modifier.STATIC, Modifier.FINAL)) continue; + String desc = variable.descString(); if(spec.type.isPrimitive()){ //set to primitive default - resetBuilder.addStatement("$L = $L", spec.name, variable != null && varInitializers.containsKey(variable) ? varInitializers.get(variable) : getDefault(spec.type.toString())); + resetBuilder.addStatement("$L = $L", spec.name, variable != null && varInitializers.containsKey(desc) ? varInitializers.get(desc) : getDefault(spec.type.toString())); }else{ //set to default null - if(!varInitializers.containsKey(variable)){ + if(!varInitializers.containsKey(desc)){ resetBuilder.addStatement("$L = null", spec.name); } //else... TODO reset if poolable } @@ -513,7 +518,7 @@ public class EntityProcess extends BaseProcessor{ if(!idProps.exists()) idProps.writeString(""); PropertiesUtils.load(map, idProps.reader()); //next ID to be used in generation - Integer max = map.values().toArray().map(Integer::parseInt).max(i -> i); + Integer max = map.values().toSeq().map(Integer::parseInt).max(i -> i); int maxID = max == null ? 0 : max + 1; //assign IDs @@ -591,7 +596,7 @@ public class EntityProcess extends BaseProcessor{ //generate getter/setter for each method for(Smethod method : inter.methods()){ String var = method.name(); - FieldSpec field = Array.with(def.builder.fieldSpecs).find(f -> f.name.equals(var)); + FieldSpec field = Seq.with(def.builder.fieldSpecs).find(f -> f.name.equals(var)); //make sure it's a real variable AND that the component doesn't already implement it somewhere with custom logic if(field == null || methodNames.contains(method.simpleString())) continue; @@ -601,7 +606,7 @@ public class EntityProcess extends BaseProcessor{ } //setter - if(method.isVoid() && !Array.with(field.annotations).contains(f -> f.type.toString().equals("@mindustry.annotations.Annotations.ReadOnly"))){ + if(method.isVoid() && !Seq.with(field.annotations).contains(f -> f.type.toString().equals("@mindustry.annotations.Annotations.ReadOnly"))){ def.builder.addMethod(MethodSpec.overriding(method.e).addModifiers(Modifier.FINAL).addStatement("this." + var + " = " + var).build()); } } @@ -616,8 +621,8 @@ public class EntityProcess extends BaseProcessor{ //create mock types of all components for(Stype interf : allInterfaces){ //indirect interfaces to implement methods for - Array dependencies = interf.allInterfaces().and(interf); - Array methods = dependencies.flatMap(Stype::methods); + Seq dependencies = interf.allInterfaces().and(interf); + Seq methods = dependencies.flatMap(Stype::methods); methods.sortComparing(Object::toString); //used method signatures @@ -645,10 +650,11 @@ public class EntityProcess extends BaseProcessor{ builder.addStatement("return -1"); }else{ Svar variable = compType == null || method.params().size > 0 ? null : compType.fields().find(v -> v.name().equals(method.name())); - if(variable == null || !varInitializers.containsKey(variable)){ + String desc = variable == null ? null : variable.descString(); + if(variable == null || !varInitializers.containsKey(desc)){ builder.addStatement("return " + getDefault(method.ret().toString())); }else{ - String init = varInitializers.get(variable); + String init = varInitializers.get(desc); builder.addStatement("return " + (init.equals("{}") ? "new " + variable.mirror().toString() : "") + init); } } @@ -668,8 +674,8 @@ public class EntityProcess extends BaseProcessor{ } } - Array getImports(Element elem){ - return Array.with(trees.getPath(elem).getCompilationUnit().getImports()).map(Object::toString); + Seq getImports(Element elem){ + return Seq.with(trees.getPath(elem).getCompilationUnit().getImports()).map(Object::toString); } /** @return interface for a component type */ @@ -682,11 +688,11 @@ public class EntityProcess extends BaseProcessor{ } /** @return all components that a entity def has */ - Array allComponents(Selement type){ + Seq allComponents(Selement type){ if(!defComponents.containsKey(type)){ //get base defs - Array interfaces = types(type.annotation(EntityDef.class), EntityDef::value); - Array components = new Array<>(); + Seq interfaces = types(type.annotation(EntityDef.class), EntityDef::value); + Seq components = new Seq<>(); for(Stype i : interfaces){ Stype comp = interfaceToComp(i); if(comp != null){ @@ -709,7 +715,7 @@ public class EntityProcess extends BaseProcessor{ return defComponents.get(type); } - Array getDependencies(Stype component){ + Seq getDependencies(Stype component){ if(!componentDependencies.containsKey(component)){ ObjectSet out = new ObjectSet<>(); //add base component interfaces @@ -746,7 +752,7 @@ public class EntityProcess extends BaseProcessor{ } String createName(Selement elem){ - Array comps = types(elem.annotation(EntityDef.class), EntityDef::value).map(this::interfaceToComp);; + Seq comps = types(elem.annotation(EntityDef.class), EntityDef::value).map(this::interfaceToComp);; comps.sortComparing(Selement::name); return comps.toString("", s -> s.name().replace("Comp", "")) + "Entity"; } @@ -755,11 +761,11 @@ public class EntityProcess extends BaseProcessor{ return type.annotation(Component.class) != null; } - Array types(T t, Cons consumer){ + Seq types(T t, Cons consumer){ try{ consumer.get(t); }catch(MirroredTypesException e){ - return Array.with(e.getTypeMirrors()).map(Stype::of); + return Seq.with(e.getTypeMirrors()).map(Stype::of); } throw new IllegalArgumentException("Missing types."); } @@ -767,11 +773,11 @@ public class EntityProcess extends BaseProcessor{ class GroupDefinition{ final String name; final ClassName baseType; - final Array components; + final Seq components; final boolean spatial, mapping, collides; final ObjectSet manualInclusions = new ObjectSet<>(); - public GroupDefinition(String name, ClassName bestType, Array components, boolean spatial, boolean mapping, boolean collides){ + public GroupDefinition(String name, ClassName bestType, Seq components, boolean spatial, boolean mapping, boolean collides){ this.baseType = bestType; this.components = components; this.name = name; @@ -787,14 +793,14 @@ public class EntityProcess extends BaseProcessor{ } class EntityDefinition{ - final Array groups; - final Array components; + final Seq groups; + final Seq components; final TypeSpec.Builder builder; final Selement base; final String name; int classID; - public EntityDefinition(String name, Builder builder, Selement base, Array components, Array groups){ + public EntityDefinition(String name, Builder builder, Selement base, Seq components, Seq groups){ this.builder = builder; this.name = name; this.base = base; diff --git a/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java b/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java index fc83ce3e3b..e3e70e8ddd 100644 --- a/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java +++ b/annotations/src/main/java/mindustry/annotations/impl/AssetsProcess.java @@ -69,7 +69,7 @@ public class AssetsProcess extends BaseProcessor{ }); for(Element elem : elements){ - Array.with(((TypeElement)elem).getEnclosedElements()).each(e -> e.getKind() == ElementKind.FIELD, field -> { + Seq.with(((TypeElement)elem).getEnclosedElements()).each(e -> e.getKind() == ElementKind.FIELD, field -> { String fname = field.getSimpleName().toString(); if(fname.startsWith("default")){ loadStyles.addStatement("arc.Core.scene.addStyle(" + field.asType().toString() + ".class, mindustry.ui.Styles." + fname + ")"); diff --git a/annotations/src/main/java/mindustry/annotations/misc/LoadRegionProcessor.java b/annotations/src/main/java/mindustry/annotations/misc/LoadRegionProcessor.java index 6923dc2149..8138fe398f 100644 --- a/annotations/src/main/java/mindustry/annotations/misc/LoadRegionProcessor.java +++ b/annotations/src/main/java/mindustry/annotations/misc/LoadRegionProcessor.java @@ -23,17 +23,17 @@ public class LoadRegionProcessor extends BaseProcessor{ .addParameter(tname("mindustry.ctype.MappableContent"), "content") .addModifiers(Modifier.STATIC, Modifier.PUBLIC); - ObjectMap> fieldMap = new ObjectMap<>(); + ObjectMap> fieldMap = new ObjectMap<>(); for(Svar field : fields(Load.class)){ if(!field.is(Modifier.PUBLIC)){ err("@LoadRegion field must be public", field); } - fieldMap.get(field.enclosingType(), Array::new).add(field); + fieldMap.get(field.enclosingType(), Seq::new).add(field); } - for(Entry> entry : fieldMap){ + for(Entry> entry : fieldMap){ method.beginControlFlow("if(content instanceof $T)", entry.key.tname()); for(Svar field : entry.value){ diff --git a/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java b/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java index 2c228e5a9e..23fa4e5376 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java +++ b/annotations/src/main/java/mindustry/annotations/remote/RemoteReadGenerator.java @@ -83,7 +83,7 @@ public class RemoteReadGenerator{ readBlock.addStatement("$L $L = read.$L()", typeName, varName, pname); }else{ //else, try and find a serializer - String ser = serializers.readers.get(typeName, SerializerResolver.locate(entry.element, var.asType(), false)); + String ser = serializers.readers.get(typeName.replace("mindustry.gen.", ""), SerializerResolver.locate(entry.element, var.asType(), false)); if(ser == null){ //make sure a serializer exists! BaseProcessor.err("No read method to read class type '" + typeName + "' in method " + entry.targetMethod + "; " + serializers.readers, var); diff --git a/annotations/src/main/java/mindustry/annotations/remote/RemoteWriteGenerator.java b/annotations/src/main/java/mindustry/annotations/remote/RemoteWriteGenerator.java index 813bf0381f..066ee9b6d9 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/RemoteWriteGenerator.java +++ b/annotations/src/main/java/mindustry/annotations/remote/RemoteWriteGenerator.java @@ -139,7 +139,7 @@ public class RemoteWriteGenerator{ //reset stream method.addStatement("OUT.reset()"); - method.addTypeVariables(Array.with(elem.getTypeParameters()).map(BaseProcessor::getTVN)); + method.addTypeVariables(Seq.with(elem.getTypeParameters()).map(BaseProcessor::getTVN)); for(int i = 0; i < elem.getParameters().size(); i++){ //first argument is skipped as it is always the player caller @@ -174,7 +174,7 @@ public class RemoteWriteGenerator{ method.addStatement("WRITE.$L($L)", typeName.equals("boolean") ? "bool" : typeName.charAt(0) + "", varName); }else{ //else, try and find a serializer - String ser = serializers.writers.get(typeName, SerializerResolver.locate(elem, var.asType(), true)); + String ser = serializers.writers.get(typeName.replace("mindustry.gen.", ""), SerializerResolver.locate(elem, var.asType(), true)); if(ser == null){ //make sure a serializer exists! BaseProcessor.err("No @WriteClass method to write class type: '" + typeName + "'", var); diff --git a/annotations/src/main/java/mindustry/annotations/remote/SerializerResolver.java b/annotations/src/main/java/mindustry/annotations/remote/SerializerResolver.java index 6431bfea49..b41674ffab 100644 --- a/annotations/src/main/java/mindustry/annotations/remote/SerializerResolver.java +++ b/annotations/src/main/java/mindustry/annotations/remote/SerializerResolver.java @@ -9,7 +9,7 @@ public class SerializerResolver{ public static String locate(ExecutableElement elem, TypeMirror mirror, boolean write){ //generic type - if((mirror.toString().equals("T") && Array.with(elem.getTypeParameters().get(0).getBounds()).contains(SerializerResolver::isEntity)) || + if((mirror.toString().equals("T") && Seq.with(elem.getTypeParameters().get(0).getBounds()).contains(SerializerResolver::isEntity)) || isEntity(mirror)){ return write ? "mindustry.io.TypeIO.writeEntity" : "mindustry.io.TypeIO.readEntity"; } diff --git a/annotations/src/main/java/mindustry/annotations/util/AnnotationProxyMaker.java b/annotations/src/main/java/mindustry/annotations/util/AnnotationProxyMaker.java index 352c684e74..c3398f3ae8 100644 --- a/annotations/src/main/java/mindustry/annotations/util/AnnotationProxyMaker.java +++ b/annotations/src/main/java/mindustry/annotations/util/AnnotationProxyMaker.java @@ -1,5 +1,6 @@ package mindustry.annotations.util; +import arc.func.*; import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Attribute.Array; import com.sun.tools.javac.code.Attribute.Enum; @@ -10,16 +11,17 @@ import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.util.List; +import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.*; import sun.reflect.annotation.*; +import javax.lang.model.element.*; import javax.lang.model.type.*; -import java.io.*; +import java.lang.Class; import java.lang.annotation.*; import java.lang.reflect.*; import java.util.*; import java.util.Map.*; -import java.lang.Class; //replaces the standard Java AnnotationProxyMaker with one that doesn't crash //thanks, oracle. @@ -59,27 +61,58 @@ public class AnnotationProxyMaker{ } private Map getAllValues(){ - LinkedHashMap var1 = new LinkedHashMap(); - ClassSymbol var2 = (ClassSymbol)this.anno.type.tsym; + LinkedHashMap map = new LinkedHashMap(); + ClassSymbol cl = (ClassSymbol)this.anno.type.tsym; - for(com.sun.tools.javac.code.Scope.Entry var3 = var2.members().elems; var3 != null; var3 = var3.sibling){ - if(var3.sym.kind == 16){ - MethodSymbol var4 = (MethodSymbol)var3.sym; - Attribute var5 = var4.getDefaultValue(); - if(var5 != null){ - var1.put(var4, var5); + //try to use Java 8 API for this if possible + try{ + Class entryClass = Class.forName("com.sun.tools.javac.code.Scope$Entry"); + Object members = cl.members(); + Field field = members.getClass().getField("elems"); + Object elems = field.get(members); + Field siblingField = entryClass.getField("sibling"); + Field symField = entryClass.getField("sym"); + for(Object currEntry = elems; currEntry != null; currEntry = siblingField.get(currEntry)){ + handleSymbol((Symbol)symField.get(currEntry), map); + } + + }catch(Throwable e){ + //otherwise try other API + + try{ + Class lookupClass = Class.forName("com.sun.tools.javac.code.Scope$LookupKind"); + Field nonRecField = lookupClass.getField("NON_RECURSIVE"); + Object nonRec = nonRecField.get(null); + Scope scope = cl.members(); + Method getSyms = scope.getClass().getMethod("getSymbols", lookupClass); + Iterable it = (Iterable)getSyms.invoke(scope, nonRec); + Iterator i = it.iterator(); + while(i.hasNext()){ + handleSymbol(i.next(), map); } + + }catch(Throwable death){ + //I tried + throw new RuntimeException(death); } } - Iterator var6 = this.anno.values.iterator(); - - while(var6.hasNext()){ - Pair var7 = (Pair)var6.next(); - var1.put(var7.fst, var7.snd); + for(Pair var7 : this.anno.values){ + map.put(var7.fst, var7.snd); } - return var1; + return map; + } + + private void handleSymbol(Symbol sym, LinkedHashMap map){ + + if(sym.getKind() == ElementKind.METHOD){ + MethodSymbol var4 = (MethodSymbol)sym; + Attribute var5 = var4.getDefaultValue(); + if(var5 != null){ + map.put(var4, var5); + } + } } private Object generateValue(MethodSymbol var1, Attribute var2){ @@ -87,70 +120,6 @@ public class AnnotationProxyMaker{ return var3.getValue(var2); } - private static final class MirroredTypesExceptionProxy extends ExceptionProxy{ - static final long serialVersionUID = 269L; - private transient List types; - private final String typeStrings; - - MirroredTypesExceptionProxy(List var1){ - this.types = var1; - this.typeStrings = var1.toString(); - } - - public String toString(){ - return this.typeStrings; - } - - public int hashCode(){ - return (this.types != null ? this.types : this.typeStrings).hashCode(); - } - - public boolean equals(Object var1){ - return this.types != null && var1 instanceof AnnotationProxyMaker.MirroredTypesExceptionProxy && this.types.equals(((AnnotationProxyMaker.MirroredTypesExceptionProxy)var1).types); - } - - protected RuntimeException generateException(){ - return new MirroredTypesException(this.types); - } - - private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException{ - var1.defaultReadObject(); - this.types = null; - } - } - - private static final class MirroredTypeExceptionProxy extends ExceptionProxy{ - static final long serialVersionUID = 269L; - private transient TypeMirror type; - private final String typeString; - - MirroredTypeExceptionProxy(TypeMirror var1){ - this.type = var1; - this.typeString = var1.toString(); - } - - public String toString(){ - return this.typeString; - } - - public int hashCode(){ - return (this.type != null ? this.type : this.typeString).hashCode(); - } - - public boolean equals(Object var1){ - return this.type != null && var1 instanceof AnnotationProxyMaker.MirroredTypeExceptionProxy && this.type.equals(((AnnotationProxyMaker.MirroredTypeExceptionProxy)var1).type); - } - - protected RuntimeException generateException(){ - return new MirroredTypeException(this.type); - } - - private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException{ - var1.defaultReadObject(); - this.type = null; - } - } - private class ValueVisitor implements Visitor{ private MethodSymbol meth; private Class returnClass; @@ -182,7 +151,7 @@ public class AnnotationProxyMaker{ } public void visitClass(com.sun.tools.javac.code.Attribute.Class var1){ - this.value = new AnnotationProxyMaker.MirroredTypeExceptionProxy(var1.classType); + this.value = mirrorProxy(var1.classType); } public void visitArray(Array var1){ @@ -199,7 +168,7 @@ public class AnnotationProxyMaker{ var14.append(var8); } - this.value = new AnnotationProxyMaker.MirroredTypesExceptionProxy(var14.toList()); + this.value = mirrorProxy(var14.toList()); }else{ int var3 = var1.values.length; Class var4 = this.returnClass; @@ -236,7 +205,7 @@ public class AnnotationProxyMaker{ try{ this.value = java.lang.Enum.valueOf((Class)this.returnClass, var2); }catch(IllegalArgumentException var4){ - this.value = new EnumConstantNotPresentExceptionProxy((Class)this.returnClass, var2); + this.value = proxify(() -> new EnumConstantNotPresentException((Class)this.returnClass, var2)); } }else{ this.value = null; @@ -256,7 +225,7 @@ public class AnnotationProxyMaker{ public void visitError(Error var1){ if(var1 instanceof UnresolvedClass){ - this.value = new AnnotationProxyMaker.MirroredTypeExceptionProxy(((UnresolvedClass)var1).classType); + this.value = mirrorProxy(((UnresolvedClass)var1).classType); }else{ this.value = null; } @@ -264,24 +233,30 @@ public class AnnotationProxyMaker{ } private void typeMismatch(Method var1, final Attribute var2){ - class AnnotationTypeMismatchExceptionProxy extends ExceptionProxy{ - static final long serialVersionUID = 269L; - final transient Method method; - - AnnotationTypeMismatchExceptionProxy(Method var2x){ - this.method = var2x; - } - - public String toString(){ - return ""; - } - - protected RuntimeException generateException(){ - return new AnnotationTypeMismatchException(this.method, var2.type.toString()); - } - } - - this.value = new AnnotationTypeMismatchExceptionProxy(var1); + this.value = proxify(() -> new AnnotationTypeMismatchException(var1, var2.type.toString())); } } + + private static Object mirrorProxy(Type t){ + return proxify(() -> new MirroredTypeException(t)); + } + + private static Object mirrorProxy(List t){ + return proxify(() -> new MirroredTypesException(t)); + } + + private static Object proxify(Prov prov){ + try{ + + return new ExceptionProxy(){ + @Override + protected RuntimeException generateException(){ + return (RuntimeException)prov.get(); + } + }; + }catch(Throwable t){ + throw new RuntimeException(t); + } + + } } diff --git a/annotations/src/main/java/mindustry/annotations/util/Selement.java b/annotations/src/main/java/mindustry/annotations/util/Selement.java index 0bd4b81ed5..1a4c6b784a 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Selement.java +++ b/annotations/src/main/java/mindustry/annotations/util/Selement.java @@ -1,6 +1,6 @@ package mindustry.annotations.util; -import arc.struct.Array; +import arc.struct.*; import arc.util.ArcAnnotate.*; import com.squareup.javapoet.*; import com.sun.tools.javac.code.Attribute.*; @@ -23,8 +23,8 @@ public class Selement{ return BaseProcessor.elementu.getDocComment(e); } - public Array> enclosed(){ - return Array.with(e.getEnclosedElements()).map(Selement::new); + public Seq> enclosed(){ + return Seq.with(e.getEnclosedElements()).map(Selement::new); } public String fullName(){ @@ -55,8 +55,8 @@ public class Selement{ return e instanceof ExecutableElement; } - public Array annotations(){ - return Array.with(e.getAnnotationMirrors()); + public Seq annotations(){ + return Seq.with(e.getAnnotationMirrors()); } public A annotation(Class annotation){ @@ -106,6 +106,6 @@ public class Selement{ @Override public boolean equals(Object o){ - return o != null && o.getClass() == getClass() && e == ((Selement)o).e; + return o != null && o.getClass() == getClass() && e.equals(((Selement)o).e); } } diff --git a/annotations/src/main/java/mindustry/annotations/util/Smethod.java b/annotations/src/main/java/mindustry/annotations/util/Smethod.java index 892d28e4a2..c674a1d011 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Smethod.java +++ b/annotations/src/main/java/mindustry/annotations/util/Smethod.java @@ -21,6 +21,10 @@ public class Smethod extends Selement{ return false; } + public String descString(){ + return up().asType().toString() + "#" + super.toString().replace("mindustry.gen.", ""); + } + public boolean is(Modifier mod){ return e.getModifiers().contains(mod); } @@ -29,20 +33,20 @@ public class Smethod extends Selement{ return new Stype((TypeElement)up()); } - public Array thrown(){ - return Array.with(e.getThrownTypes()).as(); + public Seq thrown(){ + return Seq.with(e.getThrownTypes()).as(); } - public Array thrownt(){ - return Array.with(e.getThrownTypes()).map(TypeName::get); + public Seq thrownt(){ + return Seq.with(e.getThrownTypes()).map(TypeName::get); } - public Array typeVariables(){ - return Array.with(e.getTypeParameters()).as(); + public Seq typeVariables(){ + return Seq.with(e.getTypeParameters()).as(); } - public Array params(){ - return Array.with(e.getParameters()).map(Svar::new); + public Seq params(){ + return Seq.with(e.getParameters()).map(Svar::new); } public boolean isVoid(){ diff --git a/annotations/src/main/java/mindustry/annotations/util/Stype.java b/annotations/src/main/java/mindustry/annotations/util/Stype.java index 2582ae2fbb..58d08631dd 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Stype.java +++ b/annotations/src/main/java/mindustry/annotations/util/Stype.java @@ -20,19 +20,19 @@ public class Stype extends Selement{ return mirror().toString(); } - public Array interfaces(){ - return Array.with(e.getInterfaces()).map(Stype::of); + public Seq interfaces(){ + return Seq.with(e.getInterfaces()).map(Stype::of); } - public Array allInterfaces(){ + public Seq allInterfaces(){ return interfaces().flatMap(s -> s.allInterfaces().and(s)).distinct(); } - public Array superclasses(){ - return Array.with(BaseProcessor.typeu.directSupertypes(mirror())).map(Stype::of); + public Seq superclasses(){ + return Seq.with(BaseProcessor.typeu.directSupertypes(mirror())).map(Stype::of); } - public Array allSuperclasses(){ + public Seq allSuperclasses(){ return superclasses().flatMap(s -> s.allSuperclasses().and(s)).distinct(); } @@ -40,17 +40,17 @@ public class Stype extends Selement{ return new Stype((TypeElement)BaseProcessor.typeu.asElement(BaseProcessor.typeu.directSupertypes(mirror()).get(0))); } - public Array fields(){ - return Array.with(e.getEnclosedElements()).select(e -> e instanceof VariableElement).map(e -> new Svar((VariableElement)e)); + public Seq fields(){ + return Seq.with(e.getEnclosedElements()).select(e -> e instanceof VariableElement).map(e -> new Svar((VariableElement)e)); } - public Array methods(){ - return Array.with(e.getEnclosedElements()).select(e -> e instanceof ExecutableElement + public Seq methods(){ + return Seq.with(e.getEnclosedElements()).select(e -> e instanceof ExecutableElement && !e.getSimpleName().toString().contains("<")).map(e -> new Smethod((ExecutableElement)e)); } - public Array constructors(){ - return Array.with(e.getEnclosedElements()).select(e -> e instanceof ExecutableElement + public Seq constructors(){ + return Seq.with(e.getEnclosedElements()).select(e -> e instanceof ExecutableElement && e.getSimpleName().toString().contains("<")).map(e -> new Smethod((ExecutableElement)e)); } diff --git a/annotations/src/main/java/mindustry/annotations/util/Svar.java b/annotations/src/main/java/mindustry/annotations/util/Svar.java index 3a20776a7f..2b74ced930 100644 --- a/annotations/src/main/java/mindustry/annotations/util/Svar.java +++ b/annotations/src/main/java/mindustry/annotations/util/Svar.java @@ -12,6 +12,10 @@ public class Svar extends Selement{ super(e); } + public String descString(){ + return up().asType().toString() + "#" + super.toString().replace("mindustry.gen.", ""); + } + public JCVariableDecl jtree(){ return (JCVariableDecl)BaseProcessor.elementu.getTree(e); } diff --git a/annotations/src/main/java/mindustry/annotations/util/TypeIOResolver.java b/annotations/src/main/java/mindustry/annotations/util/TypeIOResolver.java index 9c4d0e9139..88f8d79522 100644 --- a/annotations/src/main/java/mindustry/annotations/util/TypeIOResolver.java +++ b/annotations/src/main/java/mindustry/annotations/util/TypeIOResolver.java @@ -19,19 +19,19 @@ public class TypeIOResolver{ ClassSerializer out = new ClassSerializer(new ObjectMap<>(), new ObjectMap<>(), new ObjectMap<>()); for(Stype type : processor.types(TypeIOHandler.class)){ //look at all TypeIOHandler methods - Array methods = type.methods(); + Seq methods = type.methods(); for(Smethod meth : methods){ if(meth.is(Modifier.PUBLIC) && meth.is(Modifier.STATIC)){ - Array params = meth.params(); + Seq params = meth.params(); //2 params, second one is type, first is writer if(params.size == 2 && params.first().tname().toString().equals("arc.util.io.Writes")){ - out.writers.put(params.get(1).tname().toString(), type.fullName() + "." + meth.name()); + out.writers.put(fix(params.get(1).tname().toString()), type.fullName() + "." + meth.name()); }else if(params.size == 1 && params.first().tname().toString().equals("arc.util.io.Reads") && !meth.isVoid()){ //1 param, one is reader, returns type - out.readers.put(meth.retn().toString(), type.fullName() + "." + meth.name()); + out.readers.put(fix(meth.retn().toString()), type.fullName() + "." + meth.name()); }else if(params.size == 2 && params.first().tname().toString().equals("arc.util.io.Reads") && !meth.isVoid() && meth.ret() == meth.params().get(1).mirror()){ //2 params, one is reader, other is type, returns type - these are made to reduce garbage allocated - out.mutatorReaders.put(meth.retn().toString(), type.fullName() + "." + meth.name()); + out.mutatorReaders.put(fix(meth.retn().toString()), type.fullName() + "." + meth.name()); } } } @@ -40,6 +40,11 @@ public class TypeIOResolver{ return out; } + /** makes sure type names don't contain 'gen' */ + private static String fix(String str){ + return str.replace("mindustry.gen", ""); + } + /** Information about read/write methods for class types. */ public static class ClassSerializer{ public final ObjectMap writers, readers, mutatorReaders; diff --git a/annotations/src/main/resources/classids.properties b/annotations/src/main/resources/classids.properties index 35bd0b348c..85e912ce07 100644 --- a/annotations/src/main/resources/classids.properties +++ b/annotations/src/main/resources/classids.properties @@ -4,20 +4,21 @@ alpha=0 block=1 cix=2 draug=3 -mindustry.entities.comp.BulletComp=4 -mindustry.entities.comp.DecalComp=5 -mindustry.entities.comp.EffectComp=6 -mindustry.entities.comp.FireComp=7 -mindustry.entities.comp.PlayerComp=8 -mindustry.entities.comp.PuddleComp=9 -mindustry.entities.comp.TileComp=10 -mindustry.type.Weather.WeatherComp=11 -mindustry.world.blocks.campaign.CoreLauncher.LaunchCoreComp=20 -mindustry.world.blocks.campaign.LaunchPad.LaunchPayloadComp=12 -oculon=13 -phantom=14 -tau=19 -titan=15 +mace=4 +mindustry.entities.comp.BulletComp=5 +mindustry.entities.comp.DecalComp=6 +mindustry.entities.comp.EffectComp=7 +mindustry.entities.comp.FireComp=8 +mindustry.entities.comp.LaunchCoreComp=21 +mindustry.entities.comp.PlayerComp=9 +mindustry.entities.comp.PuddleComp=10 +mindustry.entities.comp.TileComp=11 +mindustry.type.Weather.WeatherComp=12 +mindustry.world.blocks.campaign.CoreLauncher.LaunchCoreComp=13 +mindustry.world.blocks.campaign.LaunchPad.LaunchPayloadComp=14 +oculon=15 +phantom=16 +tau=17 trident=18 -vanguard=16 -wraith=17 \ No newline at end of file +vanguard=19 +wraith=20 \ No newline at end of file diff --git a/annotations/src/main/resources/revisions/BlockUnitUnitEntity/0.json b/annotations/src/main/resources/revisions/BlockUnitUnitEntity/0.json index ea9b0f0abe..a558d32e9c 100644 --- a/annotations/src/main/resources/revisions/BlockUnitUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/BlockUnitUnitEntity/0.json @@ -1 +1 @@ -{fields:[{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: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.Array,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 +{fields:[{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: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/BlockUnitUnitEntity/1.json b/annotations/src/main/resources/revisions/BlockUnitUnitEntity/1.json new file mode 100644 index 0000000000..054f8ae7c5 --- /dev/null +++ b/annotations/src/main/resources/revisions/BlockUnitUnitEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:int,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: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/BuilderCommanderMechMinerUnitEntity/0.json b/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnitEntity/0.json index dcf10887d1..5f0c82df0c 100644 --- a/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnitEntity/0.json @@ -1 +1 @@ -{fields:[{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:requests,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.Array,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 +{fields:[{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:requests,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/BuilderCommanderMechMinerUnitEntity/1.json b/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnitEntity/1.json new file mode 100644 index 0000000000..127433266b --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnitEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{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: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/BuilderCommanderMechMinerUnitEntity/2.json b/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnitEntity/2.json new file mode 100644 index 0000000000..fa486b2486 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderCommanderMechMinerUnitEntity/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:int,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: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/BuilderMechUnitEntity/0.json b/annotations/src/main/resources/revisions/BuilderMechUnitEntity/0.json index 53a405df99..507ab66b2a 100644 --- a/annotations/src/main/resources/revisions/BuilderMechUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/BuilderMechUnitEntity/0.json @@ -1 +1 @@ -{fields:[{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:requests,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.Array,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 +{fields:[{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:requests,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/BuilderMechUnitEntity/1.json b/annotations/src/main/resources/revisions/BuilderMechUnitEntity/1.json new file mode 100644 index 0000000000..61c5d89424 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderMechUnitEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{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: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/BuilderMechUnitEntity/2.json b/annotations/src/main/resources/revisions/BuilderMechUnitEntity/2.json new file mode 100644 index 0000000000..b0e880bc6c --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderMechUnitEntity/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:int,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: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/BuilderMinerPayloadUnitEntity/0.json b/annotations/src/main/resources/revisions/BuilderMinerPayloadUnitEntity/0.json index 093aff894e..e3ede883ad 100644 --- a/annotations/src/main/resources/revisions/BuilderMinerPayloadUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/BuilderMinerPayloadUnitEntity/0.json @@ -1 +1 @@ -{fields:[{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:payloads,type:arc.struct.Array,size:-1},{name:requests,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.Array,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 +{fields:[{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:payloads,type:arc.struct.Seq,size:-1},{name:requests,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/BuilderMinerPayloadUnitEntity/1.json b/annotations/src/main/resources/revisions/BuilderMinerPayloadUnitEntity/1.json new file mode 100644 index 0000000000..eb4c072449 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderMinerPayloadUnitEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{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: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/BuilderMinerPayloadUnitEntity/2.json b/annotations/src/main/resources/revisions/BuilderMinerPayloadUnitEntity/2.json new file mode 100644 index 0000000000..de78f53532 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderMinerPayloadUnitEntity/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:int,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: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/BuilderMinerUnitEntity/0.json b/annotations/src/main/resources/revisions/BuilderMinerUnitEntity/0.json index 5746932e54..718245019c 100644 --- a/annotations/src/main/resources/revisions/BuilderMinerUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/BuilderMinerUnitEntity/0.json @@ -1 +1 @@ -{fields:[{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:requests,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.Array,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 +{fields:[{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:requests,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/BuilderMinerUnitEntity/1.json b/annotations/src/main/resources/revisions/BuilderMinerUnitEntity/1.json new file mode 100644 index 0000000000..ebaf0c0c21 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderMinerUnitEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{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: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/BuilderMinerUnitEntity/2.json b/annotations/src/main/resources/revisions/BuilderMinerUnitEntity/2.json new file mode 100644 index 0000000000..d333a5f20f --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderMinerUnitEntity/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:int,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: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/BuilderUnitEntity/0.json b/annotations/src/main/resources/revisions/BuilderUnitEntity/0.json index 941ae5465e..61b59221fa 100644 --- a/annotations/src/main/resources/revisions/BuilderUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/BuilderUnitEntity/0.json @@ -1 +1 @@ -{fields:[{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:requests,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.Array,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 +{fields:[{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:requests,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/BuilderUnitEntity/1.json b/annotations/src/main/resources/revisions/BuilderUnitEntity/1.json new file mode 100644 index 0000000000..170f6b7766 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderUnitEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{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: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/BuilderUnitEntity/2.json b/annotations/src/main/resources/revisions/BuilderUnitEntity/2.json new file mode 100644 index 0000000000..7d1820ed91 --- /dev/null +++ b/annotations/src/main/resources/revisions/BuilderUnitEntity/2.json @@ -0,0 +1 @@ +{version:2,fields:[{name:ammo,type:int,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: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/BulletEntity/0.json b/annotations/src/main/resources/revisions/BulletEntity/0.json index 4bc5456a6b..4904375b03 100644 --- a/annotations/src/main/resources/revisions/BulletEntity/0.json +++ b/annotations/src/main/resources/revisions/BulletEntity/0.json @@ -1 +1 @@ -{fields:[{name:collided,type:arc.struct.IntArray,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 +{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/CommanderUnitWaterMoveEntity/0.json b/annotations/src/main/resources/revisions/CommanderUnitWaterMoveEntity/0.json index ea9b0f0abe..a558d32e9c 100644 --- a/annotations/src/main/resources/revisions/CommanderUnitWaterMoveEntity/0.json +++ b/annotations/src/main/resources/revisions/CommanderUnitWaterMoveEntity/0.json @@ -1 +1 @@ -{fields:[{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: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.Array,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 +{fields:[{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: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/CommanderUnitWaterMoveEntity/1.json b/annotations/src/main/resources/revisions/CommanderUnitWaterMoveEntity/1.json new file mode 100644 index 0000000000..054f8ae7c5 --- /dev/null +++ b/annotations/src/main/resources/revisions/CommanderUnitWaterMoveEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:int,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: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/LaunchCoreEntity/0.json b/annotations/src/main/resources/revisions/LaunchCoreEntity/0.json index 6fed0fac7f..86b499e433 100644 --- a/annotations/src/main/resources/revisions/LaunchCoreEntity/0.json +++ b/annotations/src/main/resources/revisions/LaunchCoreEntity/0.json @@ -1 +1 @@ -{fields:[{name:lifetime,type:float,size:4},{name:team,type:mindustry.game.Team,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 +{fields:[{name:block,type:mindustry.world.Block,size:-1},{name:lifetime,type:float,size:4},{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/LaunchCoreEntity/1.json b/annotations/src/main/resources/revisions/LaunchCoreEntity/1.json deleted file mode 100644 index 4575c931f1..0000000000 --- a/annotations/src/main/resources/revisions/LaunchCoreEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:block,type:mindustry.world.Block,size:-1},{name:lifetime,type:float,size:4},{name:team,type:mindustry.game.Team,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/LaunchCoreEntity/2.json b/annotations/src/main/resources/revisions/LaunchCoreEntity/2.json deleted file mode 100644 index 0030ee7afd..0000000000 --- a/annotations/src/main/resources/revisions/LaunchCoreEntity/2.json +++ /dev/null @@ -1 +0,0 @@ -{version:2,fields:[{name:block,type:mindustry.world.Block,size:-1},{name:lifetime,type:float,size:4},{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/LaunchPayloadEntity/0.json b/annotations/src/main/resources/revisions/LaunchPayloadEntity/0.json index 13ca6b7f49..feba28804f 100644 --- a/annotations/src/main/resources/revisions/LaunchPayloadEntity/0.json +++ b/annotations/src/main/resources/revisions/LaunchPayloadEntity/0.json @@ -1 +1 @@ -{fields:[{name:lifetime,type:float,size:4},{name:stacks,type:arc.struct.Array,size:-1},{name:team,type:mindustry.game.Team,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 +{fields:[{name:lifetime,type:float,size:4},{name:stacks,type:arc.struct.Seq,size:-1},{name:team,type:mindustry.game.Team,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/LegsUnitEntity/0.json b/annotations/src/main/resources/revisions/LegsUnitEntity/0.json index ea9b0f0abe..a558d32e9c 100644 --- a/annotations/src/main/resources/revisions/LegsUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/LegsUnitEntity/0.json @@ -1 +1 @@ -{fields:[{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: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.Array,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 +{fields:[{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: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/LegsUnitEntity/1.json b/annotations/src/main/resources/revisions/LegsUnitEntity/1.json new file mode 100644 index 0000000000..054f8ae7c5 --- /dev/null +++ b/annotations/src/main/resources/revisions/LegsUnitEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:int,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: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/MechUnitEntity/0.json b/annotations/src/main/resources/revisions/MechUnitEntity/0.json index 5250c9eaa5..400bcb4975 100644 --- a/annotations/src/main/resources/revisions/MechUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/MechUnitEntity/0.json @@ -1 +1 @@ -{fields:[{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: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.Array,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 +{fields:[{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: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/MechUnitEntity/1.json b/annotations/src/main/resources/revisions/MechUnitEntity/1.json new file mode 100644 index 0000000000..d622b81d98 --- /dev/null +++ b/annotations/src/main/resources/revisions/MechUnitEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:int,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: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/MinerUnitEntity/0.json b/annotations/src/main/resources/revisions/MinerUnitEntity/0.json index 340e16cad4..438047ff42 100644 --- a/annotations/src/main/resources/revisions/MinerUnitEntity/0.json +++ b/annotations/src/main/resources/revisions/MinerUnitEntity/0.json @@ -1 +1 @@ -{fields:[{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: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.Array,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 +{fields:[{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: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/MinerUnitEntity/1.json b/annotations/src/main/resources/revisions/MinerUnitEntity/1.json new file mode 100644 index 0000000000..1770a9c04a --- /dev/null +++ b/annotations/src/main/resources/revisions/MinerUnitEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:int,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: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/PuddleEntity/0.json b/annotations/src/main/resources/revisions/PuddleEntity/0.json index 09114ed8ea..3c4c644549 100644 --- a/annotations/src/main/resources/revisions/PuddleEntity/0.json +++ b/annotations/src/main/resources/revisions/PuddleEntity/0.json @@ -1 +1 @@ -{fields:[{name:accepting,type:float,size:4},{name:amount,type:float,size:4},{name:generation,type:int,size:4},{name:lastRipple,type:float,size:4},{name:liquid,type:mindustry.type.Liquid,size:-1},{name:tile,type:mindustry.world.Tile,size:-1},{name:updateTime,type:float,size:4},{name:x,type:float,size:4},{name:y,type:float,size:4}]} \ No newline at end of file +{fields:[{name:amount,type:float,size:4},{name:generation,type:int,size:4},{name:liquid,type:mindustry.type.Liquid,size:-1},{name:tile,type:mindustry.world.Tile,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/PuddleEntity/1.json b/annotations/src/main/resources/revisions/PuddleEntity/1.json deleted file mode 100644 index c7b6265b14..0000000000 --- a/annotations/src/main/resources/revisions/PuddleEntity/1.json +++ /dev/null @@ -1 +0,0 @@ -{version:1,fields:[{name:amount,type:float,size:4},{name:generation,type:int,size:4},{name:liquid,type:mindustry.type.Liquid,size:-1},{name:tile,type:mindustry.world.Tile,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/TrailUnitEntity/0.json b/annotations/src/main/resources/revisions/TrailUnitEntity/0.json deleted file mode 100644 index ea9b0f0abe..0000000000 --- a/annotations/src/main/resources/revisions/TrailUnitEntity/0.json +++ /dev/null @@ -1 +0,0 @@ -{fields:[{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: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.Array,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/0.json b/annotations/src/main/resources/revisions/UnitEntity/0.json index ea9b0f0abe..a558d32e9c 100644 --- a/annotations/src/main/resources/revisions/UnitEntity/0.json +++ b/annotations/src/main/resources/revisions/UnitEntity/0.json @@ -1 +1 @@ -{fields:[{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: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.Array,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 +{fields:[{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: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..054f8ae7c5 --- /dev/null +++ b/annotations/src/main/resources/revisions/UnitEntity/1.json @@ -0,0 +1 @@ +{version:1,fields:[{name:ammo,type:int,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: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 2e66aff6e0..ce1b985c77 100644 --- a/build.gradle +++ b/build.gradle @@ -36,6 +36,7 @@ allprojects{ if(!project.hasProperty("versionType")) versionType = 'official' appName = 'Mindustry' steamworksVersion = '891ed912791e01fe9ee6237a6497e5212b85c256' + rhinoVersion = 'eeb327d141146663ff3924bd20d2a5da8a6439cc' loadVersionProps = { return new Properties().with{p -> p.load(file('../core/assets/version.properties').newReader()); return p } @@ -171,7 +172,11 @@ allprojects{ jcenter() } - tasks.withType(Javadoc).all{ enabled = false } + tasks.withType(JavaCompile){ + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + options.encoding = "UTF-8" + } } project(":desktop"){ @@ -185,13 +190,13 @@ project(":desktop"){ 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' if(debugged()) implementation project(":debug") implementation "com.github.Anuken:steamworks4j:$steamworksVersion" implementation arcModule("backends:backend-sdl") - implementation 'com.github.MinnDevelopment:java-discord-rpc:v2.0.1' } } @@ -270,7 +275,7 @@ project(":core"){ api arcModule("extensions:g3d") api arcModule("extensions:fx") api arcModule("extensions:arcnet") - api "org.mozilla:rhino-runtime:1.7.12" + api "com.github.Anuken:rhino:$rhinoVersion" if(localArc() && debugged()) api arcModule("extensions:recorder") compileOnly project(":annotations") diff --git a/core/assets-raw/sprites/blocks/campaign/data-processor-2.png b/core/assets-raw/sprites/blocks/campaign/data-processor-2.png new file mode 100644 index 0000000000..7071b2b02c Binary files /dev/null and b/core/assets-raw/sprites/blocks/campaign/data-processor-2.png differ diff --git a/core/assets-raw/sprites/blocks/campaign/data-processor-top.png b/core/assets-raw/sprites/blocks/campaign/data-processor-top.png new file mode 100644 index 0000000000..2596221950 Binary files /dev/null and b/core/assets-raw/sprites/blocks/campaign/data-processor-top.png differ diff --git a/core/assets-raw/sprites/blocks/campaign/data-processor.png b/core/assets-raw/sprites/blocks/campaign/data-processor.png index 6383dcfbe2..92bbec2528 100644 Binary files a/core/assets-raw/sprites/blocks/campaign/data-processor.png and b/core/assets-raw/sprites/blocks/campaign/data-processor.png differ diff --git a/core/assets-raw/sprites/blocks/distribution/block-unloader.png b/core/assets-raw/sprites/blocks/distribution/block-unloader.png index 123ba4c0c6..2ee0b89d9b 100644 Binary files a/core/assets-raw/sprites/blocks/distribution/block-unloader.png and b/core/assets-raw/sprites/blocks/distribution/block-unloader.png differ diff --git a/core/assets-raw/sprites/blocks/environment/pack.json b/core/assets-raw/sprites/blocks/environment/pack.json index 2612f17acc..fcd452dd9f 100644 --- a/core/assets-raw/sprites/blocks/environment/pack.json +++ b/core/assets-raw/sprites/blocks/environment/pack.json @@ -2,7 +2,7 @@ duplicatePadding: true, combineSubdirectories: true, flattenPaths: true, - maxWidth: 2048, - maxHeight: 2048, + maxWidth: 4096, + maxHeight: 4096, fast: true } diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-cap.png b/core/assets-raw/sprites/blocks/power/turbine-generator-cap.png new file mode 100644 index 0000000000..72c818dd29 Binary files /dev/null and b/core/assets-raw/sprites/blocks/power/turbine-generator-cap.png differ diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-turbine0.png b/core/assets-raw/sprites/blocks/power/turbine-generator-turbine0.png new file mode 100644 index 0000000000..27d0b9354c Binary files /dev/null and b/core/assets-raw/sprites/blocks/power/turbine-generator-turbine0.png differ diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator-turbine1.png b/core/assets-raw/sprites/blocks/power/turbine-generator-turbine1.png new file mode 100644 index 0000000000..0f066690c1 Binary files /dev/null and b/core/assets-raw/sprites/blocks/power/turbine-generator-turbine1.png differ diff --git a/core/assets-raw/sprites/blocks/power/turbine-generator.png b/core/assets-raw/sprites/blocks/power/turbine-generator.png index b81cc0b306..958247f0d2 100644 Binary files a/core/assets-raw/sprites/blocks/power/turbine-generator.png and b/core/assets-raw/sprites/blocks/power/turbine-generator.png differ diff --git a/core/assets-raw/sprites/blocks/production/graphite-press.png b/core/assets-raw/sprites/blocks/production/graphite-press.png index c72febdb35..fd5a8e7118 100644 Binary files a/core/assets-raw/sprites/blocks/production/graphite-press.png and b/core/assets-raw/sprites/blocks/production/graphite-press.png differ diff --git a/core/assets-raw/sprites/blocks/production/multi-press.png b/core/assets-raw/sprites/blocks/production/multi-press.png index e0a57702e0..fac4209d6b 100644 Binary files a/core/assets-raw/sprites/blocks/production/multi-press.png and b/core/assets-raw/sprites/blocks/production/multi-press.png differ diff --git a/core/assets-raw/sprites/blocks/production/phase-weaver-bottom.png b/core/assets-raw/sprites/blocks/production/phase-weaver-bottom.png index 17518b9014..e05f72e92c 100644 Binary files a/core/assets-raw/sprites/blocks/production/phase-weaver-bottom.png and b/core/assets-raw/sprites/blocks/production/phase-weaver-bottom.png differ diff --git a/core/assets-raw/sprites/blocks/production/phase-weaver-weave.png b/core/assets-raw/sprites/blocks/production/phase-weaver-weave.png index 7dee200cf6..b6dd7d29f4 100644 Binary files a/core/assets-raw/sprites/blocks/production/phase-weaver-weave.png and b/core/assets-raw/sprites/blocks/production/phase-weaver-weave.png differ diff --git a/core/assets-raw/sprites/blocks/production/silicon-smelter.png b/core/assets-raw/sprites/blocks/production/silicon-smelter.png index 510deee463..a101a35605 100644 Binary files a/core/assets-raw/sprites/blocks/production/silicon-smelter.png and b/core/assets-raw/sprites/blocks/production/silicon-smelter.png differ diff --git a/core/assets-raw/sprites/blocks/production/spore-press-frame0.png b/core/assets-raw/sprites/blocks/production/spore-press-frame0.png index 73ed9f86a9..84f6b39c9f 100644 Binary files a/core/assets-raw/sprites/blocks/production/spore-press-frame0.png and b/core/assets-raw/sprites/blocks/production/spore-press-frame0.png differ diff --git a/core/assets-raw/sprites/blocks/production/spore-press-frame1.png b/core/assets-raw/sprites/blocks/production/spore-press-frame1.png index ef61bd309c..d025f1c00a 100644 Binary files a/core/assets-raw/sprites/blocks/production/spore-press-frame1.png and b/core/assets-raw/sprites/blocks/production/spore-press-frame1.png differ diff --git a/core/assets-raw/sprites/blocks/production/spore-press-frame2.png b/core/assets-raw/sprites/blocks/production/spore-press-frame2.png index f527f3146c..3491c2887f 100644 Binary files a/core/assets-raw/sprites/blocks/production/spore-press-frame2.png and b/core/assets-raw/sprites/blocks/production/spore-press-frame2.png differ diff --git a/core/assets-raw/sprites/blocks/production/spore-press.png b/core/assets-raw/sprites/blocks/production/spore-press.png index cae8fbc65a..3400f9d034 100644 Binary files a/core/assets-raw/sprites/blocks/production/spore-press.png and b/core/assets-raw/sprites/blocks/production/spore-press.png differ diff --git a/core/assets-raw/sprites/blocks/storage/core-foundation-team.png b/core/assets-raw/sprites/blocks/storage/core-foundation-team.png new file mode 100644 index 0000000000..ba7a7045a8 Binary files /dev/null and b/core/assets-raw/sprites/blocks/storage/core-foundation-team.png differ diff --git a/core/assets-raw/sprites/blocks/storage/core-foundation.png b/core/assets-raw/sprites/blocks/storage/core-foundation.png index 36569d588d..0a042c760c 100644 Binary files a/core/assets-raw/sprites/blocks/storage/core-foundation.png and b/core/assets-raw/sprites/blocks/storage/core-foundation.png differ diff --git a/core/assets-raw/sprites/blocks/storage/core-nucleus-team.png b/core/assets-raw/sprites/blocks/storage/core-nucleus-team.png new file mode 100644 index 0000000000..53b494bb6a Binary files /dev/null and b/core/assets-raw/sprites/blocks/storage/core-nucleus-team.png differ diff --git a/core/assets-raw/sprites/blocks/storage/core-nucleus.png b/core/assets-raw/sprites/blocks/storage/core-nucleus.png index 8b35a0834f..b744dd024c 100644 Binary files a/core/assets-raw/sprites/blocks/storage/core-nucleus.png and b/core/assets-raw/sprites/blocks/storage/core-nucleus.png differ diff --git a/core/assets-raw/sprites/blocks/storage/core-shard-team.png b/core/assets-raw/sprites/blocks/storage/core-shard-team.png new file mode 100644 index 0000000000..f319ebbe2c Binary files /dev/null and b/core/assets-raw/sprites/blocks/storage/core-shard-team.png differ diff --git a/core/assets-raw/sprites/blocks/storage/core-shard.png b/core/assets-raw/sprites/blocks/storage/core-shard.png index eeff019491..4b4a92fab1 100644 Binary files a/core/assets-raw/sprites/blocks/storage/core-shard.png and b/core/assets-raw/sprites/blocks/storage/core-shard.png differ diff --git a/core/assets-raw/sprites/blocks/units/additive-reconstructor-top.png b/core/assets-raw/sprites/blocks/units/additive-reconstructor-top.png new file mode 100644 index 0000000000..ad9a908f26 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/additive-reconstructor-top.png differ diff --git a/core/assets-raw/sprites/blocks/units/additive-reconstructor.png b/core/assets-raw/sprites/blocks/units/additive-reconstructor.png new file mode 100644 index 0000000000..7534cc4f15 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/additive-reconstructor.png differ diff --git a/core/assets-raw/sprites/blocks/units/basic-reconstructor.png b/core/assets-raw/sprites/blocks/units/basic-reconstructor.png deleted file mode 100644 index 6d37c59675..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/basic-reconstructor.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/dagger-factory-top.png b/core/assets-raw/sprites/blocks/units/dagger-factory-top.png deleted file mode 100644 index 98623023ae..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/dagger-factory-top.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/dagger-factory.png b/core/assets-raw/sprites/blocks/units/dagger-factory.png deleted file mode 100644 index c421ec3d41..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/dagger-factory.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/exponential-reconstructor-top.png b/core/assets-raw/sprites/blocks/units/exponential-reconstructor-top.png new file mode 100644 index 0000000000..1bd16c4cde Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/exponential-reconstructor-top.png differ diff --git a/core/assets-raw/sprites/blocks/units/exponential-reconstructor.png b/core/assets-raw/sprites/blocks/units/exponential-reconstructor.png new file mode 100644 index 0000000000..729bd4459b Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/exponential-reconstructor.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-in.png b/core/assets-raw/sprites/blocks/units/factory-in-3.png similarity index 100% rename from core/assets-raw/sprites/blocks/units/factory-in.png rename to core/assets-raw/sprites/blocks/units/factory-in-3.png diff --git a/core/assets-raw/sprites/blocks/units/factory-in-5.png b/core/assets-raw/sprites/blocks/units/factory-in-5.png new file mode 100644 index 0000000000..f158423ff6 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/factory-in-5.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-in-7.png b/core/assets-raw/sprites/blocks/units/factory-in-7.png new file mode 100644 index 0000000000..39477c61cd Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/factory-in-7.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-in-9.png b/core/assets-raw/sprites/blocks/units/factory-in-9.png new file mode 100644 index 0000000000..6a3b324f1b Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/factory-in-9.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-out.png b/core/assets-raw/sprites/blocks/units/factory-out-3.png similarity index 100% rename from core/assets-raw/sprites/blocks/units/factory-out.png rename to core/assets-raw/sprites/blocks/units/factory-out-3.png diff --git a/core/assets-raw/sprites/blocks/units/factory-out-5.png b/core/assets-raw/sprites/blocks/units/factory-out-5.png new file mode 100644 index 0000000000..801f1ce6f9 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/factory-out-5.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-out-7.png b/core/assets-raw/sprites/blocks/units/factory-out-7.png new file mode 100644 index 0000000000..0822c340c5 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/factory-out-7.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-out-9.png b/core/assets-raw/sprites/blocks/units/factory-out-9.png new file mode 100644 index 0000000000..84409c2c69 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/factory-out-9.png differ diff --git a/core/assets-raw/sprites/blocks/units/factory-top.png b/core/assets-raw/sprites/blocks/units/factory-top-3.png similarity index 100% rename from core/assets-raw/sprites/blocks/units/factory-top.png rename to core/assets-raw/sprites/blocks/units/factory-top-3.png diff --git a/core/assets-raw/sprites/blocks/units/multiplicative-reconstructor-top.png b/core/assets-raw/sprites/blocks/units/multiplicative-reconstructor-top.png new file mode 100644 index 0000000000..d48314ce89 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/multiplicative-reconstructor-top.png differ diff --git a/core/assets-raw/sprites/blocks/units/multiplicative-reconstructor.png b/core/assets-raw/sprites/blocks/units/multiplicative-reconstructor.png new file mode 100644 index 0000000000..e019505024 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/multiplicative-reconstructor.png differ diff --git a/core/assets-raw/sprites/blocks/units/resupply-point.png b/core/assets-raw/sprites/blocks/units/resupply-point.png new file mode 100644 index 0000000000..d6d9d52572 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/resupply-point.png differ diff --git a/core/assets-raw/sprites/blocks/units/revenant-factory-top.png b/core/assets-raw/sprites/blocks/units/revenant-factory-top.png deleted file mode 100644 index ff912d5fb5..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/revenant-factory-top.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/revenant-factory.png b/core/assets-raw/sprites/blocks/units/revenant-factory.png deleted file mode 100644 index 44582b5716..0000000000 Binary files a/core/assets-raw/sprites/blocks/units/revenant-factory.png and /dev/null differ diff --git a/core/assets-raw/sprites/blocks/units/tetrative-reconstructor-top.png b/core/assets-raw/sprites/blocks/units/tetrative-reconstructor-top.png new file mode 100644 index 0000000000..bf92d01f2a Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/tetrative-reconstructor-top.png differ diff --git a/core/assets-raw/sprites/blocks/units/tetrative-reconstructor.png b/core/assets-raw/sprites/blocks/units/tetrative-reconstructor.png new file mode 100644 index 0000000000..deba4e9988 Binary files /dev/null and b/core/assets-raw/sprites/blocks/units/tetrative-reconstructor.png differ diff --git a/core/assets-raw/sprites/blocks/walls/door-large.png b/core/assets-raw/sprites/blocks/walls/door-large.png index 84d035c251..d667bd7029 100644 Binary files a/core/assets-raw/sprites/blocks/walls/door-large.png and b/core/assets-raw/sprites/blocks/walls/door-large.png differ diff --git a/core/assets-raw/sprites/blocks/walls/door.png b/core/assets-raw/sprites/blocks/walls/door.png index 17b214671a..92ac126a1c 100644 Binary files a/core/assets-raw/sprites/blocks/walls/door.png and b/core/assets-raw/sprites/blocks/walls/door.png differ diff --git a/core/assets-raw/sprites/editor/pack.json b/core/assets-raw/sprites/editor/pack.json index 2612f17acc..fcd452dd9f 100644 --- a/core/assets-raw/sprites/editor/pack.json +++ b/core/assets-raw/sprites/editor/pack.json @@ -2,7 +2,7 @@ duplicatePadding: true, combineSubdirectories: true, flattenPaths: true, - maxWidth: 2048, - maxHeight: 2048, + maxWidth: 4096, + maxHeight: 4096, fast: true } diff --git a/core/assets-raw/sprites/pack.json b/core/assets-raw/sprites/pack.json index 20fcb26963..fcd452dd9f 100644 --- a/core/assets-raw/sprites/pack.json +++ b/core/assets-raw/sprites/pack.json @@ -2,8 +2,7 @@ duplicatePadding: true, combineSubdirectories: true, flattenPaths: true, - maxWidth: 2048, - maxHeight: 2048, - fast: true, - bleedIterations: 4 + maxWidth: 4096, + maxHeight: 4096, + fast: true } diff --git a/core/assets-raw/sprites/rubble/pack.json b/core/assets-raw/sprites/rubble/pack.json index 2612f17acc..fcd452dd9f 100644 --- a/core/assets-raw/sprites/rubble/pack.json +++ b/core/assets-raw/sprites/rubble/pack.json @@ -2,7 +2,7 @@ duplicatePadding: true, combineSubdirectories: true, flattenPaths: true, - maxWidth: 2048, - maxHeight: 2048, + maxWidth: 4096, + maxHeight: 4096, fast: true } diff --git a/core/assets-raw/sprites/ui/pack.json b/core/assets-raw/sprites/ui/pack.json index 2612f17acc..fcd452dd9f 100644 --- a/core/assets-raw/sprites/ui/pack.json +++ b/core/assets-raw/sprites/ui/pack.json @@ -2,7 +2,7 @@ duplicatePadding: true, combineSubdirectories: true, flattenPaths: true, - maxWidth: 2048, - maxHeight: 2048, + maxWidth: 4096, + maxHeight: 4096, fast: true } diff --git a/core/assets-raw/sprites/units/chaos-array-base.png b/core/assets-raw/sprites/units/chaos-array-base.png index eaff7f46ad..1ec4aac230 100644 Binary files a/core/assets-raw/sprites/units/chaos-array-base.png and b/core/assets-raw/sprites/units/chaos-array-base.png differ diff --git a/core/assets-raw/sprites/units/chaos-array-cell.png b/core/assets-raw/sprites/units/chaos-array-cell.png index 5910638032..2b55fff00e 100644 Binary files a/core/assets-raw/sprites/units/chaos-array-cell.png and b/core/assets-raw/sprites/units/chaos-array-cell.png differ diff --git a/core/assets-raw/sprites/units/chaos-array-leg.png b/core/assets-raw/sprites/units/chaos-array-leg.png index 62ba2d8b78..a7df74e158 100644 Binary files a/core/assets-raw/sprites/units/chaos-array-leg.png and b/core/assets-raw/sprites/units/chaos-array-leg.png differ diff --git a/core/assets-raw/sprites/units/chaos-array.png b/core/assets-raw/sprites/units/chaos-array.png index 5500e743df..78c84e44c6 100644 Binary files a/core/assets-raw/sprites/units/chaos-array.png and b/core/assets-raw/sprites/units/chaos-array.png differ diff --git a/core/assets-raw/sprites/units/cix-foot.png b/core/assets-raw/sprites/units/cix-foot.png index 1e0d2bfcb7..0919d7ae30 100644 Binary files a/core/assets-raw/sprites/units/cix-foot.png and b/core/assets-raw/sprites/units/cix-foot.png differ diff --git a/core/assets-raw/sprites/units/cix-joint-base.png b/core/assets-raw/sprites/units/cix-joint-base.png index eb11ec2914..7b6a569259 100644 Binary files a/core/assets-raw/sprites/units/cix-joint-base.png and b/core/assets-raw/sprites/units/cix-joint-base.png differ diff --git a/core/assets-raw/sprites/units/cix-leg-base.png b/core/assets-raw/sprites/units/cix-leg-base.png index 6401faf7ee..5586043b4a 100644 Binary files a/core/assets-raw/sprites/units/cix-leg-base.png and b/core/assets-raw/sprites/units/cix-leg-base.png differ diff --git a/core/assets-raw/sprites/units/cix-leg.png b/core/assets-raw/sprites/units/cix-leg.png index 3855a7a3b1..8def9d5889 100644 Binary files a/core/assets-raw/sprites/units/cix-leg.png and b/core/assets-raw/sprites/units/cix-leg.png differ diff --git a/core/assets-raw/sprites/units/cix.png b/core/assets-raw/sprites/units/cix.png index 5500e743df..78c84e44c6 100644 Binary files a/core/assets-raw/sprites/units/cix.png and b/core/assets-raw/sprites/units/cix.png differ diff --git a/core/assets-raw/sprites/units/delta-base.png b/core/assets-raw/sprites/units/delta-base.png deleted file mode 100644 index 1e954dfd87..0000000000 Binary files a/core/assets-raw/sprites/units/delta-base.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/delta-leg.png b/core/assets-raw/sprites/units/delta-leg.png deleted file mode 100644 index 39a650e4b0..0000000000 Binary files a/core/assets-raw/sprites/units/delta-leg.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/eradicator-base.png b/core/assets-raw/sprites/units/eradicator-base.png index 2c143879ef..57b1c796ba 100644 Binary files a/core/assets-raw/sprites/units/eradicator-base.png and b/core/assets-raw/sprites/units/eradicator-base.png differ diff --git a/core/assets-raw/sprites/units/eradicator-cell.png b/core/assets-raw/sprites/units/eradicator-cell.png index 556a59d736..c527cdd01a 100644 Binary files a/core/assets-raw/sprites/units/eradicator-cell.png and b/core/assets-raw/sprites/units/eradicator-cell.png differ diff --git a/core/assets-raw/sprites/units/eradicator-leg.png b/core/assets-raw/sprites/units/eradicator-leg.png index 3b822e3b46..aeeaaf98f3 100644 Binary files a/core/assets-raw/sprites/units/eradicator-leg.png and b/core/assets-raw/sprites/units/eradicator-leg.png differ diff --git a/core/assets-raw/sprites/units/eradicator.png b/core/assets-raw/sprites/units/eradicator.png index 0554a3e349..1203ed33b3 100644 Binary files a/core/assets-raw/sprites/units/eradicator.png and b/core/assets-raw/sprites/units/eradicator.png differ diff --git a/core/assets-raw/sprites/units/javelin-cell.png b/core/assets-raw/sprites/units/javelin-cell.png deleted file mode 100644 index 3066db2262..0000000000 Binary files a/core/assets-raw/sprites/units/javelin-cell.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/javelin-shield.png b/core/assets-raw/sprites/units/javelin-shield.png deleted file mode 100644 index b7bc640522..0000000000 Binary files a/core/assets-raw/sprites/units/javelin-shield.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/javelin.png b/core/assets-raw/sprites/units/javelin.png deleted file mode 100644 index ed8ac66ec3..0000000000 Binary files a/core/assets-raw/sprites/units/javelin.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/titan-base.png b/core/assets-raw/sprites/units/mace-base.png similarity index 100% rename from core/assets-raw/sprites/units/titan-base.png rename to core/assets-raw/sprites/units/mace-base.png diff --git a/core/assets-raw/sprites/units/titan-cell.png b/core/assets-raw/sprites/units/mace-cell.png similarity index 100% rename from core/assets-raw/sprites/units/titan-cell.png rename to core/assets-raw/sprites/units/mace-cell.png diff --git a/core/assets-raw/sprites/units/titan-leg.png b/core/assets-raw/sprites/units/mace-leg.png similarity index 100% rename from core/assets-raw/sprites/units/titan-leg.png rename to core/assets-raw/sprites/units/mace-leg.png diff --git a/core/assets-raw/sprites/units/titan.png b/core/assets-raw/sprites/units/mace.png similarity index 100% rename from core/assets-raw/sprites/units/titan.png rename to core/assets-raw/sprites/units/mace.png diff --git a/core/assets-raw/sprites/units/omega-armor.png b/core/assets-raw/sprites/units/oculon-armor.png similarity index 100% rename from core/assets-raw/sprites/units/omega-armor.png rename to core/assets-raw/sprites/units/oculon-armor.png diff --git a/core/assets-raw/sprites/units/oculon-base-old.png b/core/assets-raw/sprites/units/oculon-base-old.png new file mode 100644 index 0000000000..61fb31cf47 Binary files /dev/null and b/core/assets-raw/sprites/units/oculon-base-old.png differ diff --git a/core/assets-raw/sprites/units/oculon-base.png b/core/assets-raw/sprites/units/oculon-base.png index 61fb31cf47..ba43ef6406 100644 Binary files a/core/assets-raw/sprites/units/oculon-base.png and b/core/assets-raw/sprites/units/oculon-base.png differ diff --git a/core/assets-raw/sprites/units/oculon-cell-old.png b/core/assets-raw/sprites/units/oculon-cell-old.png new file mode 100644 index 0000000000..8930e79cf5 Binary files /dev/null and b/core/assets-raw/sprites/units/oculon-cell-old.png differ diff --git a/core/assets-raw/sprites/units/oculon-cell.png b/core/assets-raw/sprites/units/oculon-cell.png index 8930e79cf5..1ee9c9c5fc 100644 Binary files a/core/assets-raw/sprites/units/oculon-cell.png and b/core/assets-raw/sprites/units/oculon-cell.png differ diff --git a/core/assets-raw/sprites/units/oculon-leg-old.png b/core/assets-raw/sprites/units/oculon-leg-old.png new file mode 100644 index 0000000000..d1f2fae6d6 Binary files /dev/null and b/core/assets-raw/sprites/units/oculon-leg-old.png differ diff --git a/core/assets-raw/sprites/units/oculon-leg.png b/core/assets-raw/sprites/units/oculon-leg.png index d1f2fae6d6..5c2650440c 100644 Binary files a/core/assets-raw/sprites/units/oculon-leg.png and b/core/assets-raw/sprites/units/oculon-leg.png differ diff --git a/core/assets-raw/sprites/units/oculon-old.png b/core/assets-raw/sprites/units/oculon-old.png new file mode 100644 index 0000000000..7e1d6cddd2 Binary files /dev/null and b/core/assets-raw/sprites/units/oculon-old.png differ diff --git a/core/assets-raw/sprites/units/oculon.png b/core/assets-raw/sprites/units/oculon.png index 7e1d6cddd2..d68ed772a3 100644 Binary files a/core/assets-raw/sprites/units/oculon.png and b/core/assets-raw/sprites/units/oculon.png differ diff --git a/core/assets-raw/sprites/units/omega-base.png b/core/assets-raw/sprites/units/omega-base.png deleted file mode 100644 index 659de584d9..0000000000 Binary files a/core/assets-raw/sprites/units/omega-base.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/omega-cell.png b/core/assets-raw/sprites/units/omega-cell.png deleted file mode 100644 index 1213a6bd39..0000000000 Binary files a/core/assets-raw/sprites/units/omega-cell.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/omega-leg.png b/core/assets-raw/sprites/units/omega-leg.png deleted file mode 100644 index 870875a6d4..0000000000 Binary files a/core/assets-raw/sprites/units/omega-leg.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/omega.png b/core/assets-raw/sprites/units/omega.png deleted file mode 100644 index 01ce5ebe35..0000000000 Binary files a/core/assets-raw/sprites/units/omega.png and /dev/null differ diff --git a/core/assets-raw/sprites/units/reaper.aseprite b/core/assets-raw/sprites/units/reaper.aseprite index cae9a5c2ec..51eb8f345b 100644 Binary files a/core/assets-raw/sprites/units/reaper.aseprite and b/core/assets-raw/sprites/units/reaper.aseprite differ diff --git a/core/assets-raw/sprites/units/reaper.png b/core/assets-raw/sprites/units/reaper.png index a85075830f..649d19545a 100644 Binary files a/core/assets-raw/sprites/units/reaper.png and b/core/assets-raw/sprites/units/reaper.png differ diff --git a/core/assets-raw/sprites/weapons/artillery.png b/core/assets-raw/sprites/units/weapons/artillery.png similarity index 100% rename from core/assets-raw/sprites/weapons/artillery.png rename to core/assets-raw/sprites/units/weapons/artillery.png diff --git a/core/assets-raw/sprites/units/weapons/beam-weapon.png b/core/assets-raw/sprites/units/weapons/beam-weapon.png new file mode 100644 index 0000000000..0e802877f7 Binary files /dev/null and b/core/assets-raw/sprites/units/weapons/beam-weapon.png differ diff --git a/core/assets-raw/sprites/weapons/chaos.png b/core/assets-raw/sprites/units/weapons/chaos.png similarity index 100% rename from core/assets-raw/sprites/weapons/chaos.png rename to core/assets-raw/sprites/units/weapons/chaos.png diff --git a/core/assets-raw/sprites/weapons/eradication.png b/core/assets-raw/sprites/units/weapons/eradication.png similarity index 100% rename from core/assets-raw/sprites/weapons/eradication.png rename to core/assets-raw/sprites/units/weapons/eradication.png diff --git a/core/assets-raw/sprites/weapons/eruption.png b/core/assets-raw/sprites/units/weapons/eruption.png similarity index 100% rename from core/assets-raw/sprites/weapons/eruption.png rename to core/assets-raw/sprites/units/weapons/eruption.png diff --git a/core/assets-raw/sprites/weapons/flakgun.png b/core/assets-raw/sprites/units/weapons/flakgun.png similarity index 100% rename from core/assets-raw/sprites/weapons/flakgun.png rename to core/assets-raw/sprites/units/weapons/flakgun.png diff --git a/core/assets-raw/sprites/weapons/flamethrower.png b/core/assets-raw/sprites/units/weapons/flamethrower.png similarity index 100% rename from core/assets-raw/sprites/weapons/flamethrower.png rename to core/assets-raw/sprites/units/weapons/flamethrower.png diff --git a/core/assets-raw/sprites/weapons/heal-weapon-mount.png b/core/assets-raw/sprites/units/weapons/heal-weapon-mount.png similarity index 100% rename from core/assets-raw/sprites/weapons/heal-weapon-mount.png rename to core/assets-raw/sprites/units/weapons/heal-weapon-mount.png diff --git a/core/assets-raw/sprites/weapons/heal-weapon.png b/core/assets-raw/sprites/units/weapons/heal-weapon.png similarity index 100% rename from core/assets-raw/sprites/weapons/heal-weapon.png rename to core/assets-raw/sprites/units/weapons/heal-weapon.png diff --git a/core/assets-raw/sprites/weapons/large-weapon.png b/core/assets-raw/sprites/units/weapons/large-weapon.png similarity index 100% rename from core/assets-raw/sprites/weapons/large-weapon.png rename to core/assets-raw/sprites/units/weapons/large-weapon.png diff --git a/core/assets-raw/sprites/weapons/lich-missiles.png b/core/assets-raw/sprites/units/weapons/lich-missiles.png similarity index 100% rename from core/assets-raw/sprites/weapons/lich-missiles.png rename to core/assets-raw/sprites/units/weapons/lich-missiles.png diff --git a/core/assets-raw/sprites/weapons/missiles-mount.png b/core/assets-raw/sprites/units/weapons/missiles-mount.png similarity index 100% rename from core/assets-raw/sprites/weapons/missiles-mount.png rename to core/assets-raw/sprites/units/weapons/missiles-mount.png diff --git a/core/assets-raw/sprites/weapons/missiles.png b/core/assets-raw/sprites/units/weapons/missiles.png similarity index 100% rename from core/assets-raw/sprites/weapons/missiles.png rename to core/assets-raw/sprites/units/weapons/missiles.png diff --git a/core/assets-raw/sprites/weapons/mount-weapon.png b/core/assets-raw/sprites/units/weapons/mount-weapon.png similarity index 100% rename from core/assets-raw/sprites/weapons/mount-weapon.png rename to core/assets-raw/sprites/units/weapons/mount-weapon.png diff --git a/core/assets-raw/sprites/weapons/reaper-weapon.png b/core/assets-raw/sprites/units/weapons/reaper-weapon.png similarity index 100% rename from core/assets-raw/sprites/weapons/reaper-weapon.png rename to core/assets-raw/sprites/units/weapons/reaper-weapon.png diff --git a/core/assets-raw/sprites/weapons/revenant-missiles.png b/core/assets-raw/sprites/units/weapons/revenant-missiles.png similarity index 100% rename from core/assets-raw/sprites/weapons/revenant-missiles.png rename to core/assets-raw/sprites/units/weapons/revenant-missiles.png diff --git a/core/assets-raw/sprites/weapons/small-basic-weapon.png b/core/assets-raw/sprites/units/weapons/small-basic-weapon.png similarity index 100% rename from core/assets-raw/sprites/weapons/small-basic-weapon.png rename to core/assets-raw/sprites/units/weapons/small-basic-weapon.png diff --git a/core/assets-raw/sprites/weapons/small-weapon.png b/core/assets-raw/sprites/units/weapons/small-weapon.png similarity index 100% rename from core/assets-raw/sprites/weapons/small-weapon.png rename to core/assets-raw/sprites/units/weapons/small-weapon.png diff --git a/core/assets-raw/sprites/weapons/weapon.png b/core/assets-raw/sprites/units/weapons/weapon.png similarity index 100% rename from core/assets-raw/sprites/weapons/weapon.png rename to core/assets-raw/sprites/units/weapons/weapon.png diff --git a/core/assets-raw/sprites/weapons/beam-weapon.png b/core/assets-raw/sprites/weapons/beam-weapon.png index 6e1993212b..0e802877f7 100644 Binary files a/core/assets-raw/sprites/weapons/beam-weapon.png and b/core/assets-raw/sprites/weapons/beam-weapon.png differ diff --git a/core/assets/bloomshaders/alpha_bloom.frag b/core/assets/bloomshaders/alpha_bloom.frag index ce16d33162..a48233ded0 100644 --- a/core/assets/bloomshaders/alpha_bloom.frag +++ b/core/assets/bloomshaders/alpha_bloom.frag @@ -1,17 +1,9 @@ -#ifdef GL_ES -#define LOWP lowp -#define MED mediump -precision lowp float; -#else -#define LOWP -#define MED -#endif -uniform sampler2D u_texture0; -uniform sampler2D u_texture1; -uniform float BloomIntensity; -uniform float OriginalIntensity; +uniform lowp sampler2D u_texture0; +uniform lowp sampler2D u_texture1; +uniform lowp float BloomIntensity; +uniform lowp float OriginalIntensity; -varying MED vec2 v_texCoords; +varying vec2 v_texCoords; void main(){ vec4 original = texture2D(u_texture0, v_texCoords) * OriginalIntensity; diff --git a/core/assets/bloomshaders/alpha_gaussian.frag b/core/assets/bloomshaders/alpha_gaussian.frag index 1e502bc60d..4d762bd5b4 100644 --- a/core/assets/bloomshaders/alpha_gaussian.frag +++ b/core/assets/bloomshaders/alpha_gaussian.frag @@ -1,21 +1,14 @@ -#ifdef GL_ES -#define LOWP lowp -#define MED mediump -precision lowp float; -#else -#define LOWP -#define MED -#endif -uniform sampler2D u_texture; -varying MED vec2 v_texCoords0; -varying MED vec2 v_texCoords1; -varying MED vec2 v_texCoords2; -varying MED vec2 v_texCoords3; -varying MED vec2 v_texCoords4; +uniform lowp sampler2D u_texture; +varying vec2 v_texCoords0; +varying vec2 v_texCoords1; +varying vec2 v_texCoords2; +varying vec2 v_texCoords3; +varying vec2 v_texCoords4; const float center = 0.2270270270; const float close = 0.3162162162; const float far = 0.0702702703; + void main(){ gl_FragColor = far * texture2D(u_texture, v_texCoords0) + close * texture2D(u_texture, v_texCoords1) diff --git a/core/assets/bloomshaders/alpha_threshold.frag b/core/assets/bloomshaders/alpha_threshold.frag index a99a9e2efc..b2ffe580a6 100644 --- a/core/assets/bloomshaders/alpha_threshold.frag +++ b/core/assets/bloomshaders/alpha_threshold.frag @@ -1,14 +1,8 @@ -#ifdef GL_ES -#define LOWP lowp -#define MED mediump -precision lowp float; -#else -#define LOWP -#define MED -#endif -uniform sampler2D u_texture0; -uniform vec2 threshold; -varying MED vec2 v_texCoords; + +uniform lowp sampler2D u_texture0; +uniform lowp vec2 threshold; +varying vec2 v_texCoords; + void main(){ vec4 color = texture2D(u_texture0, v_texCoords); if(color.r + color.g + color.b > 0.5 * 3.0){ diff --git a/core/assets/bloomshaders/bloom.frag b/core/assets/bloomshaders/bloom.frag index 9b7ac8aa51..65abbe56d1 100644 --- a/core/assets/bloomshaders/bloom.frag +++ b/core/assets/bloomshaders/bloom.frag @@ -1,17 +1,9 @@ -#ifdef GL_ES -#define LOWP lowp -#define MED mediump -precision lowp float; -#else -#define LOWP -#define MED -#endif -uniform sampler2D u_texture0; -uniform sampler2D u_texture1; -uniform float BloomIntensity; -uniform float OriginalIntensity; +uniform lowp sampler2D u_texture0; +uniform lowp sampler2D u_texture1; +uniform lowp float BloomIntensity; +uniform lowp float OriginalIntensity; -varying MED vec2 v_texCoords; +varying vec2 v_texCoords; void main(){ vec4 original = texture2D(u_texture0, v_texCoords) * OriginalIntensity; diff --git a/core/assets/bloomshaders/blurspace.vert b/core/assets/bloomshaders/blurspace.vert index 6c73f70f52..bc16d0b2a7 100644 --- a/core/assets/bloomshaders/blurspace.vert +++ b/core/assets/bloomshaders/blurspace.vert @@ -1,18 +1,13 @@ -#ifdef GL_ES -#define MED mediump -#else -#define MED -#endif -attribute vec4 a_position; +attribute vec4 a_position; attribute vec2 a_texCoord0; uniform vec2 dir; uniform vec2 size; -varying MED vec2 v_texCoords0; -varying MED vec2 v_texCoords1; -varying MED vec2 v_texCoords2; -varying MED vec2 v_texCoords3; -varying MED vec2 v_texCoords4; +varying vec2 v_texCoords0; +varying vec2 v_texCoords1; +varying vec2 v_texCoords2; +varying vec2 v_texCoords3; +varying vec2 v_texCoords4; const vec2 futher = vec2(3.2307692308, 3.2307692308); const vec2 closer = vec2(1.3846153846, 1.3846153846); diff --git a/core/assets/bloomshaders/gaussian.frag b/core/assets/bloomshaders/gaussian.frag index b09606648d..dedadf12f7 100644 --- a/core/assets/bloomshaders/gaussian.frag +++ b/core/assets/bloomshaders/gaussian.frag @@ -1,21 +1,14 @@ -#ifdef GL_ES -#define LOWP lowp -#define MED mediump -precision lowp float; -#else -#define LOWP -#define MED -#endif -uniform sampler2D u_texture; -varying MED vec2 v_texCoords0; -varying MED vec2 v_texCoords1; -varying MED vec2 v_texCoords2; -varying MED vec2 v_texCoords3; -varying MED vec2 v_texCoords4; +uniform lowp sampler2D u_texture; +varying vec2 v_texCoords0; +varying vec2 v_texCoords1; +varying vec2 v_texCoords2; +varying vec2 v_texCoords3; +varying vec2 v_texCoords4; const float center = 0.2270270270; const float close = 0.3162162162; const float far = 0.0702702703; + void main(){ gl_FragColor.rgb = far * texture2D(u_texture, v_texCoords0).rgb + close * texture2D(u_texture, v_texCoords1).rgb diff --git a/core/assets/bloomshaders/maskedtreshold.frag b/core/assets/bloomshaders/maskedtreshold.frag index f02fb1d132..ec09b4435a 100644 --- a/core/assets/bloomshaders/maskedtreshold.frag +++ b/core/assets/bloomshaders/maskedtreshold.frag @@ -1,14 +1,6 @@ -#ifdef GL_ES -#define LOWP lowp -#define MED mediump -precision lowp float; -#else -#define LOWP -#define MED -#endif -uniform sampler2D u_texture0; -uniform vec2 threshold; -varying MED vec2 v_texCoords; +uniform lowp sampler2D u_texture0; +uniform lowp vec2 threshold; +varying vec2 v_texCoords; void main(){ vec4 tex = texture2D(u_texture0, v_texCoords); diff --git a/core/assets/bloomshaders/screenspace.vert b/core/assets/bloomshaders/screenspace.vert index 7fdb2ec21f..1c57ff8852 100644 --- a/core/assets/bloomshaders/screenspace.vert +++ b/core/assets/bloomshaders/screenspace.vert @@ -1,11 +1,6 @@ -#ifdef GL_ES -#define MED mediump -#else -#define MED -#endif -attribute vec4 a_position; +attribute vec4 a_position; attribute vec2 a_texCoord0; -varying MED vec2 v_texCoords; +varying vec2 v_texCoords; void main(){ v_texCoords = a_texCoord0; diff --git a/core/assets/bloomshaders/threshold.frag b/core/assets/bloomshaders/threshold.frag index 3747e91fe8..932bf77c5d 100644 --- a/core/assets/bloomshaders/threshold.frag +++ b/core/assets/bloomshaders/threshold.frag @@ -1,14 +1,6 @@ -#ifdef GL_ES -#define LOWP lowp -#define MED mediump -precision lowp float; -#else -#define LOWP -#define MED -#endif -uniform sampler2D u_texture0; -uniform vec2 threshold; -varying MED vec2 v_texCoords; +uniform lowp sampler2D u_texture0; +uniform lowp vec2 threshold; +varying mediump vec2 v_texCoords; void main(){ gl_FragColor.rgb = (texture2D(u_texture0, v_texCoords).rgb - vec3(threshold.x)) * threshold.y; diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index d50a74c04f..49db2f8b0a 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -224,7 +224,6 @@ save.new = New Save save.overwrite = Are you sure you want to overwrite\nthis save slot? overwrite = Overwrite save.none = No saves found! -saveload = Saving... savefail = Failed to save game! save.delete.confirm = Are you sure you want to delete this save? save.delete = Delete @@ -674,6 +673,7 @@ setting.milliseconds = {0} milliseconds setting.fullscreen.name = Fullscreen setting.borderlesswindow.name = Borderless Window[lightgray] (restart may be required) setting.fps.name = Show FPS & Ping +setting.smoothcamera.name = Smooth Camera setting.blockselectkeys.name = Show Block Select Keys setting.vsync.name = VSync setting.pixelate.name = Pixelate @@ -780,10 +780,10 @@ rules.wavetimer = Wave Timer rules.waves = Waves rules.attack = Attack Mode rules.enemyCheat = Infinite AI (Red Team) Resources -rules.unitdrops = Unit Drops +rules.blockhealthmultiplier = Block Health Multiplier +rules.blockdamagemultiplier = Block Damage Multiplier rules.unitbuildspeedmultiplier = Unit Production Speed Multiplier rules.unithealthmultiplier = Unit Health Multiplier -rules.blockhealthmultiplier = Block Health Multiplier rules.unitdamagemultiplier = Unit Damage Multiplier rules.enemycorebuildradius = Enemy Core No-Build Radius:[lightgray] (tiles) rules.wavespacing = Wave Spacing:[lightgray] (sec) @@ -792,6 +792,7 @@ rules.buildspeedmultiplier = Build Speed Multiplier rules.deconstructrefundmultiplier = Deconstruct Refund Multiplier rules.waitForWaveToEnd = Waves Wait for Enemies rules.dropzoneradius = Drop Zone Radius:[lightgray] (tiles) +rules.unitammo = Units Require Ammo rules.title.waves = Waves rules.title.resourcesbuilding = Resources & Building rules.title.enemy = Enemies @@ -1025,6 +1026,19 @@ block.meltdown.name = Meltdown block.container.name = Container block.launch-pad.name = Launch Pad block.launch-pad-large.name = Large Launch Pad +block.segment.name = Segment +block.ground-factory.name = Ground Factory +block.air-factory.name = Air Factory +block.naval-factory.name = Naval Factory +block.additive-reconstructor.name = Additive Reconstructor +block.multiplicative-reconstructor.name = Multiplicative Reconstructor +block.exponential-reconstructor.name = Exponential Reconstructor +block.tetrative-reconstructor.name = Tetrative Reconstructor +block.mass-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 team.blue.name = blue team.crux.name = red team.sharded.name = orange @@ -1205,11 +1219,12 @@ block.lancer.description = A medium-sized anti-ground laser turret. Charges and block.arc.description = A small close-range electric turret. Fires arcs of electricity at enemies. block.swarmer.description = A medium-sized missile turret. Attacks both air and ground enemies. Fires homing missiles. block.salvo.description = A larger, more advanced version of the Duo turret. Fires quick salvos of bullets at the enemy. -block.fuse.description = A large, close-range energy turret. Fires three piercing beams at nearby enemies. +block.fuse.description = A large, close-range shrapnel turret. Fires three piercing blasts at nearby enemies. block.ripple.description = An extremely powerful artillery turret. Shoots clusters of shells at enemies over long distances. block.cyclone.description = A large anti-air and anti-ground turret. Fires explosive clumps of flak at nearby units. block.spectre.description = A massive dual-barreled cannon. Shoots large armor-piercing bullets at air and ground targets. block.meltdown.description = A massive laser cannon. Charges and fires a persistent laser beam at nearby enemies. Requires coolant to operate. block.command-center.description = Issues movement commands to allied units across the map.\nCauses units to rally, attack an enemy core or retreat to the core/factory. When no enemy core is present, units will default to patrolling under the attack command. block.repair-point.description = Continuously heals the closest damaged unit in its vicinity. +block.segment.description = Damages and destroys incoming projectiles. Laser projectiles are not targeted. diff --git a/core/assets/bundles/bundle_it.properties b/core/assets/bundles/bundle_it.properties index b93df31df1..98a3bfacfc 100644 --- a/core/assets/bundles/bundle_it.properties +++ b/core/assets/bundles/bundle_it.properties @@ -7,7 +7,7 @@ link.reddit.description = Il subreddit di Mindustry! link.github.description = Codice sorgente del gioco link.changelog.description = Elenco delle modifiche del gioco link.dev-builds.description = Build di sviluppo versioni instabili -link.trello.description = Scheda ufficiale trello per funzionalità pianificate +link.trello.description = Scheda ufficiale Trello per funzionalità pianificate link.itch.io.description = Pagina di itch.io con download per PC e versione web link.google-play.description = Elenco di Google Play Store link.f-droid.description = Catalogo F-Droid diff --git a/core/assets/contributors b/core/assets/contributors index 60cc9cc286..ee8b77ddb9 100644 --- a/core/assets/contributors +++ b/core/assets/contributors @@ -88,4 +88,4 @@ Alicila Daniel Dusek DeltaNedas GioIacca9 -SnakkiZXZ \ No newline at end of file +SnakkiZXZ diff --git a/core/assets/icons/icons.properties b/core/assets/icons/icons.properties index 5a569f86d6..93b81a045e 100755 --- a/core/assets/icons/icons.properties +++ b/core/assets/icons/icons.properties @@ -242,3 +242,13 @@ 63502=segment|block-segment-medium 63501=large-overdrive-projector|block-large-overdrive-projector-medium 63500=disassembler|block-disassembler-medium +63499=advanced-reconstructor|block-advanced-reconstructor-medium +63498=reconstructor-basis|block-reconstructor-basis-medium +63497=reconstructor-morphism|block-reconstructor-morphism-medium +63496=reconstructor-functor|block-reconstructor-functor-medium +63495=reconstructor-prime|block-reconstructor-prime-medium +63494=additive-reconstructor|block-additive-reconstructor-medium +63493=multiplicative-reconstructor|block-multiplicative-reconstructor-medium +63492=exponential-reconstructor|block-exponential-reconstructor-medium +63491=tetrative-reconstructor|block-tetrative-reconstructor-medium +63490=resupply-point|block-resupply-point-medium diff --git a/core/assets/maps/groundZero.msav b/core/assets/maps/groundZero.msav index 4e6900b4c3..628ab59ece 100644 Binary files a/core/assets/maps/groundZero.msav and b/core/assets/maps/groundZero.msav differ diff --git a/core/assets/maps/tarFields.msav b/core/assets/maps/tarFields.msav index 41e30e2a61..e4a99d71bf 100644 Binary files a/core/assets/maps/tarFields.msav and b/core/assets/maps/tarFields.msav differ diff --git a/core/assets/planets/TODO.dat b/core/assets/planets/TODO.dat index d2d0e1b30a..e8220fa481 100644 Binary files a/core/assets/planets/TODO.dat and b/core/assets/planets/TODO.dat differ diff --git a/core/assets/scripts/global.js b/core/assets/scripts/global.js index b8acc336b9..11ced98b60 100755 --- a/core/assets/scripts/global.js +++ b/core/assets/scripts/global.js @@ -24,72 +24,72 @@ const extend = function(classType, params){ const newEffect = (lifetime, renderer) => new Effects.Effect(lifetime, new Effects.EffectRenderer({render: renderer})) Call = Packages.mindustry.gen.Call -importPackage(Packages.mindustry.graphics.g3d) -importPackage(Packages.mindustry.ctype) -importPackage(Packages.mindustry.gen) -importPackage(Packages.arc.scene.actions) -importPackage(Packages.mindustry.editor) -importPackage(Packages.mindustry.type) importPackage(Packages.arc.scene.ui) -importPackage(Packages.arc.math.geom) -importPackage(Packages.mindustry.game) -importPackage(Packages.mindustry.maps.filters) -importPackage(Packages.arc.struct) -importPackage(Packages.arc.scene.style) -importPackage(Packages.mindustry.ui.dialogs) +importPackage(Packages.mindustry.editor) importPackage(Packages.mindustry.entities.comp) -importPackage(Packages.mindustry.world.blocks.defense.turrets) -importPackage(Packages.mindustry.async) -importPackage(Packages.mindustry.world.blocks.distribution) -importPackage(Packages.mindustry.world.blocks.environment) -importPackage(Packages.mindustry.world.blocks.campaign) -importPackage(Packages.mindustry.world.blocks.liquid) -importPackage(Packages.mindustry.ui) -importPackage(Packages.mindustry.world.blocks.production) -importPackage(Packages.mindustry.ai) -importPackage(Packages.mindustry.world.blocks.defense) -importPackage(Packages.mindustry.world.meta) -importPackage(Packages.mindustry.world.blocks.legacy) -importPackage(Packages.mindustry.world.blocks.units) -importPackage(Packages.arc.graphics) -importPackage(Packages.arc.func) -importPackage(Packages.mindustry.content) -importPackage(Packages.mindustry.world.blocks.power) -importPackage(Packages.mindustry.world.blocks) -importPackage(Packages.arc.scene.event) -importPackage(Packages.mindustry.logic) -importPackage(Packages.arc.math) -importPackage(Packages.mindustry.world) -importPackage(Packages.mindustry.maps) -importPackage(Packages.mindustry.maps.generators) -importPackage(Packages.mindustry.world.meta.values) -importPackage(Packages.mindustry.entities) -importPackage(Packages.arc.util) -importPackage(Packages.mindustry.graphics) -importPackage(Packages.mindustry.world.modules) +importPackage(Packages.mindustry.graphics.g3d) importPackage(Packages.mindustry.world.blocks.sandbox) -importPackage(Packages.mindustry.input) -importPackage(Packages.mindustry.entities.units) -importPackage(Packages.arc.scene.ui.layout) -importPackage(Packages.mindustry.ai.types) -importPackage(Packages.mindustry.ai.formations.patterns) -importPackage(Packages.arc.scene.utils) -importPackage(Packages.mindustry.ai.formations) +importPackage(Packages.mindustry.game) +importPackage(Packages.mindustry.ui.dialogs) importPackage(Packages.mindustry.ui.fragments) -importPackage(Packages.mindustry.world.blocks.experimental) -importPackage(Packages.mindustry.world.blocks.storage) -importPackage(Packages.mindustry.audio) -importPackage(Packages.mindustry.ui.layout) -importPackage(Packages.mindustry.entities.bullet) -importPackage(Packages.mindustry.world.consumers) +importPackage(Packages.mindustry.world.blocks.environment) +importPackage(Packages.arc.math) +importPackage(Packages.mindustry.world.blocks.power) importPackage(Packages.mindustry.core) -importPackage(Packages.arc.scene) -importPackage(Packages.mindustry) -importPackage(Packages.arc) -importPackage(Packages.mindustry.world.blocks.payloads) -importPackage(Packages.mindustry.world.producers) +importPackage(Packages.arc.struct) +importPackage(Packages.mindustry.maps) +importPackage(Packages.arc.scene.actions) +importPackage(Packages.mindustry.ctype) +importPackage(Packages.mindustry.ai.formations) +importPackage(Packages.arc.scene.utils) +importPackage(Packages.mindustry.world.blocks.defense) +importPackage(Packages.mindustry.ai.types) +importPackage(Packages.mindustry.gen) +importPackage(Packages.mindustry.world.blocks.distribution) +importPackage(Packages.mindustry.world.meta) +importPackage(Packages.mindustry.maps.filters) +importPackage(Packages.mindustry.logic) +importPackage(Packages.arc.math.geom) +importPackage(Packages.mindustry.graphics) +importPackage(Packages.mindustry.entities.bullet) +importPackage(Packages.mindustry.world.meta.values) +importPackage(Packages.mindustry.input) +importPackage(Packages.mindustry.entities) +importPackage(Packages.arc.func) +importPackage(Packages.mindustry.world.blocks.experimental) +importPackage(Packages.mindustry.world.consumers) +importPackage(Packages.mindustry.ai) +importPackage(Packages.mindustry.world.blocks.legacy) +importPackage(Packages.mindustry.world.modules) +importPackage(Packages.mindustry.async) +importPackage(Packages.mindustry.content) importPackage(Packages.arc.graphics.g2d) +importPackage(Packages.mindustry.ui) +importPackage(Packages.mindustry.ui.layout) +importPackage(Packages.mindustry.entities.units) +importPackage(Packages.mindustry.type) +importPackage(Packages.arc.scene) +importPackage(Packages.mindustry.world.blocks.production) +importPackage(Packages.mindustry) +importPackage(Packages.mindustry.world.blocks.storage) +importPackage(Packages.mindustry.world) +importPackage(Packages.mindustry.world.blocks.units) +importPackage(Packages.arc.scene.event) +importPackage(Packages.arc.scene.ui.layout) +importPackage(Packages.mindustry.world.blocks.defense.turrets) +importPackage(Packages.arc.scene.style) +importPackage(Packages.arc.graphics) +importPackage(Packages.mindustry.world.blocks.liquid) +importPackage(Packages.mindustry.world.blocks) +importPackage(Packages.mindustry.audio) +importPackage(Packages.mindustry.ai.formations.patterns) +importPackage(Packages.mindustry.world.blocks.payloads) importPackage(Packages.mindustry.maps.planet) +importPackage(Packages.arc.util) +importPackage(Packages.mindustry.world.producers) +importPackage(Packages.arc) +importPackage(Packages.mindustry.maps.generators) +importPackage(Packages.mindustry.world.blocks.campaign) const PlayerIpUnbanEvent = Packages.mindustry.game.EventType.PlayerIpUnbanEvent const PlayerIpBanEvent = Packages.mindustry.game.EventType.PlayerIpBanEvent const PlayerUnbanEvent = Packages.mindustry.game.EventType.PlayerUnbanEvent diff --git a/core/assets/shaders/atmosphere.frag b/core/assets/shaders/atmosphere.frag index fee422e5b6..cbb7c4ea21 100644 --- a/core/assets/shaders/atmosphere.frag +++ b/core/assets/shaders/atmosphere.frag @@ -1,8 +1,3 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - const float PI = 3.14159265359; const float MAX = 10000.0; diff --git a/core/assets/shaders/blockbuild.frag b/core/assets/shaders/blockbuild.frag index 858018291f..c2fb1b4044 100644 --- a/core/assets/shaders/blockbuild.frag +++ b/core/assets/shaders/blockbuild.frag @@ -1,8 +1,3 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - uniform sampler2D u_texture; uniform vec4 u_color; @@ -13,7 +8,7 @@ uniform float u_progress; uniform float u_time; varying vec4 v_color; -varying vec2 v_texCoord; +varying vec2 v_texCoords; bool id(vec2 coords, vec4 base){ @@ -31,10 +26,10 @@ bool cont(vec2 T, vec2 v){ void main() { - vec2 t = v_texCoord.xy; + vec2 t = v_texCoords.xy; vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); - vec2 coords = (v_texCoord-u_uv) / v; + vec2 coords = (v_texCoords-u_uv) / v; float value = coords.x + coords.y; vec4 color = texture2D(u_texture, t); diff --git a/core/assets/shaders/cubemap.frag b/core/assets/shaders/cubemap.frag index 893384f120..3f9a760e94 100644 --- a/core/assets/shaders/cubemap.frag +++ b/core/assets/shaders/cubemap.frag @@ -1,6 +1,3 @@ -#ifdef GL_ES -precision mediump float; -#endif varying vec3 v_texCoords; diff --git a/core/assets/shaders/darkness.frag b/core/assets/shaders/darkness.frag new file mode 100644 index 0000000000..f09a7adb38 --- /dev/null +++ b/core/assets/shaders/darkness.frag @@ -0,0 +1,11 @@ +#define HIGHP + +uniform sampler2D u_texture; + +varying vec4 v_color; +varying vec2 v_texCoords; + +void main(){ + vec4 color = texture2D(u_texture, v_texCoords.xy); + gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0 - color.r); +} diff --git a/core/assets/shaders/default.vert b/core/assets/shaders/default.vert index 681aba4818..aa712bca7a 100644 --- a/core/assets/shaders/default.vert +++ b/core/assets/shaders/default.vert @@ -5,12 +5,12 @@ attribute vec2 a_texCoord0; attribute vec4 a_color; varying vec4 v_color; -varying vec2 v_texCoord; +varying vec2 v_texCoords; uniform vec2 u_viewportInverse; void main(){ gl_Position = u_projTrans * a_position; - v_texCoord = a_texCoord0; + v_texCoords = a_texCoord0; v_color = a_color; } diff --git a/core/assets/shaders/fog.frag b/core/assets/shaders/fog.frag deleted file mode 100644 index 5c07ae1e02..0000000000 --- a/core/assets/shaders/fog.frag +++ /dev/null @@ -1,14 +0,0 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - -uniform sampler2D u_texture; - -varying vec4 v_color; -varying vec2 v_texCoord; - -void main(){ - vec4 color = texture2D(u_texture, v_texCoord.xy); - gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0 - color.r); -} diff --git a/core/assets/shaders/light.frag b/core/assets/shaders/light.frag index ba35623dab..4047854fb4 100644 --- a/core/assets/shaders/light.frag +++ b/core/assets/shaders/light.frag @@ -1,17 +1,10 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - -#define steprad 0.13 uniform sampler2D u_texture; uniform vec4 u_ambient; -varying vec4 v_color; -varying vec2 v_texCoord; +varying vec2 v_texCoords; void main(){ - vec4 color = texture2D(u_texture, v_texCoord.xy); + vec4 color = texture2D(u_texture, v_texCoords); gl_FragColor = clamp(vec4(mix(u_ambient.rgb, color.rgb, color.a), u_ambient.a - color.a), 0.0, 1.0); } diff --git a/core/assets/shaders/planet.frag b/core/assets/shaders/planet.frag index fbd1548992..996091bdd4 100755 --- a/core/assets/shaders/planet.frag +++ b/core/assets/shaders/planet.frag @@ -1,7 +1,3 @@ -#ifdef GL_ES -precision mediump float; -#endif - varying vec4 v_col; void main(){ diff --git a/core/assets/shaders/planetgrid.frag b/core/assets/shaders/planetgrid.frag index ccdf82998a..d21d29027e 100644 --- a/core/assets/shaders/planetgrid.frag +++ b/core/assets/shaders/planetgrid.frag @@ -1,6 +1,3 @@ -#ifdef GL_ES -precision mediump float; -#endif varying vec4 v_col; varying vec4 v_position; diff --git a/core/assets/shaders/screenspace.frag b/core/assets/shaders/screenspace.frag new file mode 100644 index 0000000000..493c608d6f --- /dev/null +++ b/core/assets/shaders/screenspace.frag @@ -0,0 +1,8 @@ + +uniform sampler2D u_texture; + +varying vec2 v_texCoords; + +void main(){ + gl_FragColor = texture2D(u_texture, v_texCoords); +} diff --git a/core/assets/shaders/screenspace.vert b/core/assets/shaders/screenspace.vert new file mode 100644 index 0000000000..b0d7d3c995 --- /dev/null +++ b/core/assets/shaders/screenspace.vert @@ -0,0 +1,9 @@ +attribute vec4 a_position; +attribute vec2 a_texCoord0; + +varying vec2 v_texCoords; + +void main(){ + v_texCoords = a_texCoord0; + gl_Position = a_position; +} diff --git a/core/assets/shaders/shield.frag b/core/assets/shaders/shield.frag index ae3831e5fb..bc953f1dcf 100644 --- a/core/assets/shaders/shield.frag +++ b/core/assets/shaders/shield.frag @@ -1,7 +1,4 @@ -#ifdef GL_ES -precision highp float; -precision highp int; -#endif +#define HIGHP #define MAX_HITS 64 #define HIT_RADIUS 12.0 @@ -14,12 +11,12 @@ uniform vec2 u_texsize; uniform float u_time; uniform float u_dp; uniform vec2 u_offset; +uniform vec4 u_shieldcolor; -varying vec4 v_color; -varying vec2 v_texCoord; +varying vec2 v_texCoords; void main(){ - vec2 T = v_texCoord.xy; + vec2 T = v_texCoords.xy; vec2 coords = (T * u_texsize) + u_offset; T += vec2(sin(coords.y / 3.0 + u_time / 20.0), sin(coords.x / 3.0 + u_time / 20.0)) / u_texsize; @@ -32,7 +29,7 @@ void main(){ (texture2D(u_texture, T + vec2(0, step) * v).a > 0.0 || texture2D(u_texture, T + vec2(0, -step) * v).a > 0.0 || texture2D(u_texture, T + vec2(step, 0) * v).a > 0.0 || texture2D(u_texture, T + vec2(-step, 0) * v).a > 0.0)){ - gl_FragColor = mix(v_color, vec4(1.0), si); + gl_FragColor = mix(u_shieldcolor, vec4(1.0), si); }else{ if(color.a > 0.0){ diff --git a/core/assets/shaders/slag.frag b/core/assets/shaders/slag.frag index 5b87b982ab..2dae9dc45c 100755 --- a/core/assets/shaders/slag.frag +++ b/core/assets/shaders/slag.frag @@ -1,7 +1,4 @@ -#ifdef GL_ES -precision highp float; -precision mediump int; -#endif +#define HIGHP //shades of slag #define S2 vec3(100.0, 93.0, 49.0) / 100.0 @@ -15,11 +12,10 @@ uniform vec2 u_campos; uniform vec2 u_resolution; uniform float u_time; -varying vec4 v_color; -varying vec2 v_texCoord; +varying vec2 v_texCoords; void main(){ - vec2 c = v_texCoord.xy; + 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 / 4000.0; diff --git a/core/assets/shaders/tar.frag b/core/assets/shaders/tar.frag index 4ca0e7be97..39b0c27492 100644 --- a/core/assets/shaders/tar.frag +++ b/core/assets/shaders/tar.frag @@ -1,7 +1,4 @@ -#ifdef GL_ES -precision highp float; -precision mediump int; -#endif +#define HIGHP #define NSCALE 180.0 / 2.0 @@ -12,11 +9,10 @@ uniform vec2 u_campos; uniform vec2 u_resolution; uniform float u_time; -varying vec4 v_color; -varying vec2 v_texCoord; +varying vec2 v_texCoords; void main(){ - vec2 c = v_texCoord.xy; + 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 / 8000.0; diff --git a/core/assets/shaders/unitbuild.frag b/core/assets/shaders/unitbuild.frag index 572168a49b..147b27106f 100644 --- a/core/assets/shaders/unitbuild.frag +++ b/core/assets/shaders/unitbuild.frag @@ -1,8 +1,3 @@ -#ifdef GL_ES -precision mediump float; -precision mediump int; -#endif - #define step 3.0 uniform sampler2D u_texture; @@ -15,7 +10,7 @@ uniform vec2 u_uv2; uniform vec2 u_texsize; varying vec4 v_color; -varying vec2 v_texCoord; +varying vec2 v_texCoords; bool id(vec4 v){ return v.a > 0.1; @@ -36,11 +31,11 @@ bool cont(vec2 T, vec2 v){ } void main() { - vec2 coords = (v_texCoord.xy - u_uv) / (u_uv2 - u_uv); - vec2 t = v_texCoord.xy; + vec2 coords = (v_texCoords.xy - u_uv) / (u_uv2 - u_uv); + vec2 t = v_texCoords.xy; vec2 v = vec2(1.0/u_texsize.x, 1.0/u_texsize.y); - vec4 c = texture2D(u_texture, v_texCoord.xy); + vec4 c = texture2D(u_texture, v_texCoords.xy); float alpha = c.a; c.a *= u_progress; diff --git a/core/assets/shaders/water.frag b/core/assets/shaders/water.frag index 1d2b67f889..18a4258852 100644 --- a/core/assets/shaders/water.frag +++ b/core/assets/shaders/water.frag @@ -1,7 +1,4 @@ -#ifdef GL_ES -precision highp float; -precision mediump int; -#endif +#define HIGHP uniform sampler2D u_texture; @@ -9,15 +6,14 @@ uniform vec2 u_campos; uniform vec2 u_resolution; uniform float u_time; -varying vec4 v_color; -varying vec2 v_texCoord; +varying vec2 v_texCoords; const float mscl = 40.0; const float mth = 7.0; void main(){ - vec2 c = v_texCoord.xy; + vec2 c = v_texCoords.xy; vec2 v = vec2(1.0/u_resolution.x, 1.0/u_resolution.y); vec2 coords = vec2(c.x / v.x + u_campos.x, c.y / v.y + u_campos.y); diff --git a/core/assets/sprites/block_colors.png b/core/assets/sprites/block_colors.png index 43a89d0603..4a55acf109 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 new file mode 100644 index 0000000000..1eee5d2200 --- /dev/null +++ b/core/assets/sprites/fallback/sprites.atlas @@ -0,0 +1,17245 @@ + +sprites.png +size: 2048,2048 +format: rgba8888 +filter: nearest,nearest +repeat: none +core-silo + rotate: false + xy: 1884, 613 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +blast-drill + rotate: false + xy: 1843, 159 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +white-tree + rotate: false + xy: 1, 1083 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +white-tree-dead + rotate: false + xy: 323, 1405 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +core-nucleus + rotate: false + xy: 1722, 613 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-nucleus-team + rotate: false + xy: 1195, 419 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +exponential-reconstructor + rotate: false + xy: 775, 501 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +exponential-reconstructor-top + rotate: false + xy: 775, 275 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +factory-in-5 + rotate: false + xy: 1681, 289 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +factory-in-7 + rotate: false + xy: 775, 49 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +factory-in-9 + rotate: false + xy: 1225, 1469 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +factory-out-5 + rotate: false + xy: 1843, 451 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +factory-out-7 + rotate: false + xy: 1065, 985 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +factory-out-9 + rotate: false + xy: 1515, 1759 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +multiplicative-reconstructor + rotate: false + xy: 1681, 127 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +multiplicative-reconstructor-top + rotate: false + xy: 1843, 289 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +tetrative-reconstructor + rotate: false + xy: 1515, 1469 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +tetrative-reconstructor-top + rotate: false + xy: 645, 1179 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +circle-shadow + rotate: false + xy: 1001, 750 + size: 201, 201 + orig: 201, 201 + offset: 0, 0 + index: -1 +block-core-nucleus-full + rotate: false + xy: 1398, 613 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-full + rotate: false + xy: 1805, 1823 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-full + rotate: false + xy: 1560, 613 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-full + rotate: false + xy: 645, 1759 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +core-nucleus-team-crux + rotate: false + xy: 1195, 257 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-nucleus-team-sharded + rotate: false + xy: 1001, 6 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-0 + rotate: false + xy: 1195, 95 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-1 + rotate: false + xy: 1357, 419 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-2 + rotate: false + xy: 1357, 257 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-3 + rotate: false + xy: 1357, 95 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-4 + rotate: false + xy: 1519, 451 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-5 + rotate: false + xy: 1519, 289 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-6 + rotate: false + xy: 1681, 451 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-5-7 + rotate: false + xy: 1519, 127 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +cracks-6-0 + rotate: false + xy: 1001, 556 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-1 + rotate: false + xy: 1001, 362 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-2 + rotate: false + xy: 1001, 168 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-3 + rotate: false + xy: 1204, 775 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-4 + rotate: false + xy: 1398, 775 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-5 + rotate: false + xy: 1592, 775 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-6 + rotate: false + xy: 1786, 775 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-7 + rotate: false + xy: 1204, 581 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-7-0 + rotate: false + xy: 1805, 1597 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-1 + rotate: false + xy: 613, 953 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-2 + rotate: false + xy: 549, 727 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-3 + rotate: false + xy: 549, 501 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-4 + rotate: false + xy: 549, 275 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-5 + rotate: false + xy: 549, 49 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-6 + rotate: false + xy: 839, 953 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-7 + rotate: false + xy: 775, 727 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-8-0 + rotate: false + xy: 935, 1211 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-1 + rotate: false + xy: 1193, 1211 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-2 + rotate: false + xy: 1451, 1211 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-3 + rotate: false + xy: 1709, 1211 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-4 + rotate: false + xy: 291, 825 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-5 + rotate: false + xy: 291, 567 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-6 + rotate: false + xy: 291, 309 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-7 + rotate: false + xy: 291, 51 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-9-0 + rotate: false + xy: 1, 793 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-1 + rotate: false + xy: 323, 1115 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-2 + rotate: false + xy: 645, 1469 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-3 + rotate: false + xy: 935, 1759 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-4 + rotate: false + xy: 1, 503 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-5 + rotate: false + xy: 935, 1469 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-6 + rotate: false + xy: 1225, 1759 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-7 + rotate: false + xy: 1, 213 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +unit-lich-full + rotate: false + xy: 1727, 969 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +unit-reaper-full + rotate: false + xy: 323, 1727 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +circle + rotate: false + xy: 1, 10 + size: 201, 201 + orig: 201, 201 + offset: 0, 0 + index: -1 +eradicator + rotate: false + xy: 1519, 1 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +eradicator-base + rotate: false + xy: 1673, 1 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +eradicator-cell + rotate: false + xy: 1827, 1 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +eradicator-leg + rotate: false + xy: 1805, 1471 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +lich + rotate: false + xy: 1291, 969 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +lich-cell + rotate: false + xy: 1509, 969 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +reaper + rotate: false + xy: 1, 1727 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +reaper-cell + rotate: false + xy: 1, 1405 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 + +sprites2.png +size: 2048,2048 +format: rgba8888 +filter: nearest,nearest +repeat: none +data-processor + rotate: false + xy: 397, 763 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +data-processor-2 + rotate: false + xy: 1075, 1591 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +data-processor-top + rotate: false + xy: 397, 665 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +launch-pad + rotate: false + xy: 393, 371 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +launch-pad-large + rotate: false + xy: 521, 1529 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +launch-pad-light + rotate: false + xy: 491, 469 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +launchpod + rotate: false + xy: 1527, 1689 + size: 66, 64 + orig: 66, 64 + offset: 0, 0 + index: -1 +force-projector + rotate: false + xy: 397, 567 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +force-projector-top + rotate: false + xy: 495, 567 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +large-overdrive-projector + rotate: false + xy: 295, 469 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +large-overdrive-projector-top + rotate: false + xy: 197, 273 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mend-projector + rotate: false + xy: 659, 739 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mend-projector-top + rotate: false + xy: 659, 673 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mender + rotate: false + xy: 953, 3 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mender-top + rotate: false + xy: 1233, 1191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +overdrive-projector + rotate: false + xy: 659, 541 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +overdrive-projector-top + rotate: false + xy: 655, 475 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +shock-mine + rotate: false + xy: 1321, 1127 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-loader + rotate: false + xy: 911, 1739 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-unloader + rotate: false + xy: 1629, 1853 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +bridge-arrow + rotate: false + xy: 879, 513 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor + rotate: false + xy: 845, 377 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-bridge + rotate: false + xy: 879, 411 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-end + rotate: false + xy: 845, 343 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +center + rotate: false + xy: 879, 377 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-0 + rotate: false + xy: 821, 79 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-armored-conveyor-full + rotate: false + xy: 821, 79 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-1 + rotate: false + xy: 817, 45 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-2 + rotate: false + xy: 817, 11 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-0-3 + rotate: false + xy: 1735, 1360 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-0 + rotate: false + xy: 1731, 1326 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-1 + rotate: false + xy: 1731, 1292 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-2 + rotate: false + xy: 1751, 1474 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-1-3 + rotate: false + xy: 1785, 1481 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-0 + rotate: false + xy: 1819, 1481 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-1 + rotate: false + xy: 1525, 1275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-2 + rotate: false + xy: 1559, 1275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-2-3 + rotate: false + xy: 803, 1057 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-0 + rotate: false + xy: 837, 1057 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-1 + rotate: false + xy: 871, 1057 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-2 + rotate: false + xy: 905, 1057 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-3-3 + rotate: false + xy: 787, 1023 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-0 + rotate: false + xy: 821, 1023 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-1 + rotate: false + xy: 855, 1023 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-2 + rotate: false + xy: 889, 1023 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-4-3 + rotate: false + xy: 791, 989 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-1 + rotate: false + xy: 879, 139 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-2 + rotate: false + xy: 913, 513 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-3 + rotate: false + xy: 913, 479 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-0 + rotate: false + xy: 913, 445 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-1 + rotate: false + xy: 913, 411 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-2 + rotate: false + xy: 913, 377 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-1-3 + rotate: false + xy: 913, 343 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-0 + rotate: false + xy: 913, 309 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-1 + rotate: false + xy: 913, 275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-2 + rotate: false + xy: 913, 241 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-2-3 + rotate: false + xy: 913, 207 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-3-0 + rotate: false + xy: 913, 173 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-3-1 + rotate: false + xy: 913, 139 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-3-2 + rotate: false + xy: 1153, 965 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-3-3 + rotate: false + xy: 1187, 965 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-4-0 + rotate: false + xy: 1221, 965 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-4-1 + rotate: false + xy: 1693, 1271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-4-2 + rotate: false + xy: 1727, 1258 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-4-3 + rotate: false + xy: 855, 105 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor + rotate: false + xy: 927, 829 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor-0 + rotate: false + xy: 927, 795 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor-1 + rotate: false + xy: 927, 761 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor-2 + rotate: false + xy: 927, 727 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor-edge + rotate: false + xy: 927, 693 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-conveyor-stack + rotate: false + xy: 927, 659 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-1 + rotate: false + xy: 1369, 1161 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-2 + rotate: false + xy: 1389, 1127 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-3 + rotate: false + xy: 1389, 1093 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-1-0 + rotate: false + xy: 1389, 1059 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-1-1 + rotate: false + xy: 1389, 1025 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-1-2 + rotate: false + xy: 1391, 991 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-1-3 + rotate: false + xy: 1391, 957 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-2-0 + rotate: false + xy: 1397, 1229 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-2-1 + rotate: false + xy: 1403, 1195 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-2-2 + rotate: false + xy: 1403, 1161 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-2-3 + rotate: false + xy: 1423, 1127 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-3-0 + rotate: false + xy: 1423, 1093 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-3-1 + rotate: false + xy: 1423, 1059 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-3-2 + rotate: false + xy: 1423, 1025 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-3-3 + rotate: false + xy: 1425, 991 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-4-0 + rotate: false + xy: 1425, 957 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-4-1 + rotate: false + xy: 1431, 1229 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-4-2 + rotate: false + xy: 1437, 1195 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-4-3 + rotate: false + xy: 1437, 1161 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cross + rotate: false + xy: 919, 37 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +distributor + rotate: false + xy: 1565, 1593 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +inverted-sorter + rotate: false + xy: 1887, 1439 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +junction + rotate: false + xy: 1969, 1303 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mass-conveyor + rotate: false + xy: 393, 175 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mass-conveyor-edge + rotate: false + xy: 491, 273 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mass-conveyor-top + rotate: false + xy: 491, 175 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-top + rotate: false + xy: 491, 175 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mass-driver-base + rotate: false + xy: 295, 77 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +overflow-gate + rotate: false + xy: 1253, 1123 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +payload-router + rotate: false + xy: 879, 1625 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-edge + rotate: false + xy: 929, 1429 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-over + rotate: false + xy: 961, 1527 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +phase-conveyor + rotate: false + xy: 1255, 953 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conveyor-arrow + rotate: false + xy: 927, 965 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conveyor-bridge + rotate: false + xy: 927, 931 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conveyor-end + rotate: false + xy: 927, 897 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +router + rotate: false + xy: 1267, 1195 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sorter + rotate: false + xy: 1321, 1059 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +underflow-gate + rotate: false + xy: 1457, 1059 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +blast-drill-rim + rotate: false + xy: 1, 1919 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +blast-drill-rotator + rotate: false + xy: 1, 1789 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +blast-drill-top + rotate: false + xy: 131, 1919 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +drill-top + rotate: false + xy: 1763, 1573 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +turbine-generator-liquid + rotate: false + xy: 1763, 1573 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +laser-drill + rotate: false + xy: 295, 371 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +laser-drill-rim + rotate: false + xy: 393, 469 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +laser-drill-rotator + rotate: false + xy: 197, 175 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +laser-drill-top + rotate: false + xy: 295, 273 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mechanical-drill + rotate: false + xy: 659, 937 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mechanical-drill-rotator + rotate: false + xy: 659, 871 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mechanical-drill-top + rotate: false + xy: 659, 805 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +oil-extractor + rotate: false + xy: 635, 1431 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor-liquid + rotate: false + xy: 733, 1429 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor-rotator + rotate: false + xy: 831, 1429 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor-top + rotate: false + xy: 863, 1527 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +pneumatic-drill + rotate: false + xy: 721, 1003 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pneumatic-drill-rotator + rotate: false + xy: 725, 937 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pneumatic-drill-top + rotate: false + xy: 725, 871 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor + rotate: false + xy: 1301, 1549 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-liquid + rotate: false + xy: 1367, 1549 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-rotator + rotate: false + xy: 1433, 1549 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +water-extractor-top + rotate: false + xy: 1499, 1549 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-border + rotate: false + xy: 825, 955 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-middle + rotate: false + xy: 825, 717 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-select + rotate: false + xy: 893, 853 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-liquid + rotate: false + xy: 845, 207 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +message + rotate: false + xy: 1233, 1157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +place-arrow + rotate: false + xy: 1027, 1429 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +bridge-conduit + rotate: false + xy: 845, 445 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-arrow + rotate: false + xy: 879, 479 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-arrow + rotate: false + xy: 879, 479 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-bridge + rotate: false + xy: 845, 411 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conduit-end + rotate: false + xy: 879, 445 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom + rotate: false + xy: 845, 275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-0 + rotate: false + xy: 879, 309 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-1 + rotate: false + xy: 845, 241 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-2 + rotate: false + xy: 879, 275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-3 + rotate: false + xy: 879, 275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-bottom-4 + rotate: false + xy: 879, 275 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-0 + rotate: false + xy: 879, 241 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-1 + rotate: false + xy: 845, 173 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-2 + rotate: false + xy: 879, 207 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-3 + rotate: false + xy: 845, 139 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-3 + rotate: false + xy: 845, 139 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-top-4 + rotate: false + xy: 879, 173 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-junction + rotate: false + xy: 1901, 1269 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-overflow-gate + rotate: false + xy: 1829, 1235 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-overflow-gate-top + rotate: false + xy: 1863, 1235 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-router-bottom + rotate: false + xy: 1897, 1235 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-router-liquid + rotate: false + xy: 1931, 1235 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-router-top + rotate: false + xy: 1965, 1235 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-tank-bottom + rotate: false + xy: 295, 175 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +liquid-tank-liquid + rotate: false + xy: 393, 273 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +liquid-tank-top + rotate: false + xy: 491, 371 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mechanical-pump + rotate: false + xy: 1593, 1263 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mechanical-pump-liquid + rotate: false + xy: 1627, 1263 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rotary-pump-liquid + rotate: false + xy: 1627, 1263 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thermal-pump-liquid + rotate: false + xy: 1627, 1263 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conduit + rotate: false + xy: 1253, 1089 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conduit-arrow + rotate: false + xy: 1253, 1055 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conduit-bridge + rotate: false + xy: 1253, 1021 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conduit-end + rotate: false + xy: 1255, 987 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-cap + rotate: false + xy: 927, 591 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-0 + rotate: false + xy: 927, 557 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-1 + rotate: false + xy: 947, 523 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-2 + rotate: false + xy: 947, 489 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-3 + rotate: false + xy: 947, 455 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plated-conduit-top-4 + rotate: false + xy: 947, 421 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-0 + rotate: false + xy: 947, 285 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-1 + rotate: false + xy: 947, 251 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-2 + rotate: false + xy: 947, 217 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-top-4 + rotate: false + xy: 947, 183 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rotary-pump + rotate: false + xy: 725, 541 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thermal-pump + rotate: false + xy: 1107, 1755 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +battery + rotate: false + xy: 791, 955 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +battery-large + rotate: false + xy: 1, 90 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +battery-large-top + rotate: false + xy: 1143, 1951 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +battery-top + rotate: false + xy: 825, 989 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +combustion-generator + rotate: false + xy: 845, 309 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +combustion-generator-top + rotate: false + xy: 879, 343 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +differential-generator + rotate: false + xy: 429, 861 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +differential-generator-liquid + rotate: false + xy: 495, 763 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +differential-generator-top + rotate: false + xy: 495, 665 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +diode + rotate: false + xy: 919, 3 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +diode-arrow + rotate: false + xy: 1785, 1447 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +illuminator + rotate: false + xy: 1955, 1473 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +illuminator-top + rotate: false + xy: 1989, 1473 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +impact-reactor + rotate: false + xy: 521, 1659 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-bottom + rotate: false + xy: 651, 1789 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-light + rotate: false + xy: 781, 1919 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-0 + rotate: false + xy: 1, 1009 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-1 + rotate: false + xy: 131, 1139 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-2 + rotate: false + xy: 261, 1269 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +impact-reactor-plasma-3 + rotate: false + xy: 391, 1399 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +power-node + rotate: false + xy: 947, 387 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +power-node-large + rotate: false + xy: 725, 805 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +power-source + rotate: false + xy: 947, 353 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +power-void + rotate: false + xy: 947, 319 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rtg-generator + rotate: false + xy: 721, 475 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +rtg-generator-top + rotate: false + xy: 1267, 1161 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +solar-panel + rotate: false + xy: 1321, 1093 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +solar-panel-large + rotate: false + xy: 1009, 1739 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +surge-tower + rotate: false + xy: 1153, 1199 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thermal-generator + rotate: false + xy: 223, 11 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thorium-reactor + rotate: false + xy: 1205, 1755 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thorium-reactor-lights + rotate: false + xy: 1303, 1755 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thorium-reactor-top + rotate: false + xy: 1401, 1755 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +turbine-generator + rotate: false + xy: 421, 11 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +turbine-generator-cap + rotate: false + xy: 487, 11 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +turbine-generator-top + rotate: false + xy: 553, 11 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +turbine-generator-turbine0 + rotate: false + xy: 619, 13 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +turbine-generator-turbine1 + rotate: false + xy: 685, 13 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +alloy-smelter + rotate: false + xy: 1, 286 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +alloy-smelter-top + rotate: false + xy: 1, 188 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +blast-mixer + rotate: false + xy: 1301, 1615 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-forge + rotate: false + xy: 1731, 1951 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +coal-centrifuge + rotate: false + xy: 555, 1069 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cryofluidmixer-bottom + rotate: false + xy: 589, 409 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cryofluidmixer-liquid + rotate: false + xy: 589, 343 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cryofluidmixer-top + rotate: false + xy: 589, 277 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cultivator + rotate: false + xy: 589, 211 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cultivator-middle + rotate: false + xy: 589, 145 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cultivator-top + rotate: false + xy: 589, 79 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +disassembler + rotate: false + xy: 103, 585 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +disassembler-liquid + rotate: false + xy: 99, 487 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +disassembler-spinner + rotate: false + xy: 99, 389 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +graphite-press + rotate: false + xy: 1961, 1557 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +incinerator + rotate: false + xy: 1853, 1439 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-source + rotate: false + xy: 1973, 1371 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-void + rotate: false + xy: 1935, 1303 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +kiln + rotate: false + xy: 559, 1201 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +kiln-top + rotate: false + xy: 559, 1135 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +silicon-smelter-top + rotate: false + xy: 559, 1135 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +liquid-source + rotate: false + xy: 2007, 1337 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-void + rotate: false + xy: 2003, 1303 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +melter + rotate: false + xy: 953, 37 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +multi-press + rotate: false + xy: 393, 77 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +phase-weaver + rotate: false + xy: 655, 343 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +phase-weaver-bottom + rotate: false + xy: 655, 277 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +phase-weaver-weave + rotate: false + xy: 655, 211 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plastanium-compressor + rotate: false + xy: 655, 145 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plastanium-compressor-top + rotate: false + xy: 655, 79 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pulverizer + rotate: false + xy: 947, 149 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulverizer-rotator + rotate: false + xy: 957, 115 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pyratite-mixer + rotate: false + xy: 725, 739 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +separator + rotate: false + xy: 967, 1265 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +separator-liquid + rotate: false + xy: 1033, 1265 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +separator-spinner + rotate: false + xy: 691, 1199 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +silicon-crucible + rotate: false + xy: 1027, 1331 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +silicon-crucible-top + rotate: false + xy: 977, 1641 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +silicon-smelter + rotate: false + xy: 757, 1199 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press + rotate: false + xy: 823, 1199 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame0 + rotate: false + xy: 889, 1199 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame1 + rotate: false + xy: 955, 1199 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-frame2 + rotate: false + xy: 1021, 1199 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-liquid + rotate: false + xy: 1099, 1265 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spore-press-top + rotate: false + xy: 1087, 1199 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +rock1 + rotate: false + xy: 1425, 1349 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +rock2 + rotate: false + xy: 1475, 1349 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +sand-boulder1 + rotate: false + xy: 1287, 1127 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-boulder2 + rotate: false + xy: 1287, 1093 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-boulder1 + rotate: false + xy: 1301, 1195 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-boulder2 + rotate: false + xy: 1301, 1161 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snowrock1 + rotate: false + xy: 1153, 1049 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +snowrock2 + rotate: false + xy: 1203, 1049 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spore-cluster1 + rotate: false + xy: 1651, 1297 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +spore-cluster2 + rotate: false + xy: 1693, 1423 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +spore-cluster3 + rotate: false + xy: 1693, 1381 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +container + rotate: false + xy: 527, 937 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +core-foundation + rotate: false + xy: 391, 1789 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-foundation-team + rotate: false + xy: 521, 1919 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-shard + rotate: false + xy: 1727, 1853 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-shard-team + rotate: false + xy: 1825, 1853 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +unloader + rotate: false + xy: 1457, 1025 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unloader-center + rotate: false + xy: 1459, 991 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +vault + rotate: false + xy: 1499, 1755 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +arc-heat + rotate: false + xy: 1735, 1394 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-1 + rotate: false + xy: 791, 921 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-2 + rotate: false + xy: 1367, 1615 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-3 + rotate: false + xy: 1241, 1951 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-4 + rotate: false + xy: 1, 1659 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +hail-heat + rotate: false + xy: 457, 961 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +lancer-heat + rotate: false + xy: 637, 1267 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +meltdown-heat + rotate: false + xy: 781, 1789 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +ripple-heat + rotate: false + xy: 733, 1331 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +salvo-heat + rotate: false + xy: 721, 343 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +salvo-panel-left + rotate: false + xy: 721, 277 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +salvo-panel-right + rotate: false + xy: 721, 211 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scorch-heat + rotate: false + xy: 1287, 1025 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +wave-liquid + rotate: false + xy: 1631, 1507 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +additive-reconstructor + rotate: false + xy: 1, 580 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +additive-reconstructor-top + rotate: false + xy: 1, 482 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +air-factory + rotate: false + xy: 1, 384 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +command-center + rotate: false + xy: 589, 1003 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +factory-in-3 + rotate: false + xy: 99, 97 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +factory-out-3 + rotate: false + xy: 201, 567 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +factory-top-3 + rotate: false + xy: 299, 567 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +ground-factory + rotate: false + xy: 197, 371 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +naval-factory + rotate: false + xy: 491, 77 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +rally-point + rotate: false + xy: 725, 673 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +repair-point-base + rotate: false + xy: 1261, 1229 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +resupply-point + rotate: false + xy: 725, 607 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +copper-wall + rotate: false + xy: 889, 105 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper-wall-large + rotate: false + xy: 527, 871 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +door + rotate: false + xy: 1819, 1447 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +door-large + rotate: false + xy: 1631, 1573 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +door-large-open + rotate: false + xy: 1697, 1573 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +door-open + rotate: false + xy: 1853, 1473 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-wall + rotate: false + xy: 927, 863 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-wall-large + rotate: false + xy: 655, 409 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plastanium-wall + rotate: false + xy: 927, 625 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-wall-large + rotate: false + xy: 687, 1069 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-gigantic + rotate: false + xy: 911, 1919 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scrap-wall-huge2 + rotate: false + xy: 831, 1331 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-huge3 + rotate: false + xy: 929, 1331 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-large1 + rotate: false + xy: 721, 79 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-large2 + rotate: false + xy: 703, 1265 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-large3 + rotate: false + xy: 769, 1265 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall-large4 + rotate: false + xy: 835, 1265 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scrap-wall2 + rotate: false + xy: 1289, 991 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall3 + rotate: false + xy: 1289, 957 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall4 + rotate: false + xy: 1295, 1229 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall5 + rotate: false + xy: 1295, 1229 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +surge-wall + rotate: false + xy: 1363, 1229 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +surge-wall-large + rotate: false + xy: 91, 24 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thorium-wall + rotate: false + xy: 1369, 1195 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thorium-wall-large + rotate: false + xy: 289, 11 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thruster + rotate: false + xy: 131, 1009 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +titanium-wall + rotate: false + xy: 1457, 1127 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-wall-large + rotate: false + xy: 355, 11 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +bullet + rotate: false + xy: 925, 1145 + size: 52, 52 + orig: 52, 52 + offset: 0, 0 + index: -1 +bullet-back + rotate: false + xy: 979, 1145 + size: 52, 52 + orig: 52, 52 + offset: 0, 0 + index: -1 +casing + rotate: false + xy: 517, 959 + size: 8, 16 + orig: 8, 16 + offset: 0, 0 + index: -1 +circle-end + rotate: false + xy: 1, 678 + size: 100, 199 + orig: 100, 199 + offset: 0, 0 + index: -1 +circle-mid + rotate: false + xy: 961, 798 + size: 1, 199 + orig: 1, 199 + offset: 0, 0 + index: -1 +error + rotate: false + xy: 953, 1095 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +laser + rotate: false + xy: 905, 1739 + size: 4, 48 + orig: 4, 48 + offset: 0, 0 + index: -1 +laser-end + rotate: false + xy: 1305, 1681 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +minelaser + rotate: false + xy: 2043, 1999 + size: 4, 48 + orig: 4, 48 + offset: 0, 0 + index: -1 +minelaser-end + rotate: false + xy: 1379, 1681 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +missile + rotate: false + xy: 2007, 1691 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +missile-back + rotate: false + xy: 1693, 1343 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +particle + rotate: false + xy: 1609, 1297 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +scale_marker + rotate: false + xy: 1625, 1521 + size: 4, 4 + orig: 4, 4 + offset: 0, 0 + index: -1 +shell + rotate: false + xy: 1693, 1305 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +shell-back + rotate: false + xy: 1735, 1428 + size: 36, 36 + orig: 36, 36 + offset: 0, 0 + index: -1 +transfer + rotate: false + xy: 2043, 1949 + size: 4, 48 + orig: 4, 48 + offset: 0, 0 + index: -1 +transfer-arrow + rotate: false + xy: 1457, 1093 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +white + rotate: false + xy: 1, 1 + size: 3, 3 + orig: 3, 3 + offset: 0, 0 + index: -1 +arc + rotate: false + xy: 787, 79 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-additive-reconstructor-full + rotate: false + xy: 1339, 1951 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-air-factory-full + rotate: false + xy: 1437, 1951 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-arc-full + rotate: false + xy: 859, 989 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-blast-drill-full + rotate: false + xy: 131, 1789 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-char-full + rotate: false + xy: 791, 887 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cliffs-full + rotate: false + xy: 859, 955 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conduit-full + rotate: false + xy: 825, 921 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conveyor-full + rotate: false + xy: 791, 853 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-0 + rotate: false + xy: 791, 853 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-foundation-full + rotate: false + xy: 261, 1919 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-core-shard-full + rotate: false + xy: 1535, 1951 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-craters-full + rotate: false + xy: 859, 921 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cryofluidmixer-full + rotate: false + xy: 1433, 1615 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cultivator-full + rotate: false + xy: 1595, 1659 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cyclone-full + rotate: false + xy: 1633, 1951 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-dark-metal-full + rotate: false + xy: 825, 887 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-full + rotate: false + xy: 791, 819 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dunerocks-full + rotate: false + xy: 859, 887 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-duo-full + rotate: false + xy: 825, 853 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-fuse-full + rotate: false + xy: 1829, 1951 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-grass-full + rotate: false + xy: 791, 785 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ground-factory-full + rotate: false + xy: 1927, 1951 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-hail-full + rotate: false + xy: 859, 853 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-holostone-full + rotate: false + xy: 825, 819 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hotrock-full + rotate: false + xy: 791, 751 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-full + rotate: false + xy: 859, 819 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-full + rotate: false + xy: 825, 785 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-icerocks-full + rotate: false + xy: 791, 717 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ignarock-full + rotate: false + xy: 859, 785 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-impact-reactor-full + rotate: false + xy: 1, 1529 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-lancer-full + rotate: false + xy: 1661, 1639 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-laser-drill-full + rotate: false + xy: 781, 1625 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-liquid-router-full + rotate: false + xy: 825, 751 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-tank-full + rotate: false + xy: 765, 1527 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-magmarock-full + rotate: false + xy: 791, 683 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mass-conveyor-full + rotate: false + xy: 261, 959 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mass-conveyor-icon + rotate: false + xy: 261, 959 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-mass-driver-full + rotate: false + xy: 1041, 1869 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-mechanical-drill-full + rotate: false + xy: 1727, 1639 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-meltdown-full + rotate: false + xy: 131, 1659 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-full + rotate: false + xy: 859, 751 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-moss-full + rotate: false + xy: 791, 649 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-naval-factory-full + rotate: false + xy: 1139, 1853 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-oil-extractor-full + rotate: false + xy: 1237, 1853 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-ore-coal-full + rotate: false + xy: 859, 717 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-copper-full + rotate: false + xy: 825, 683 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-lead-full + rotate: false + xy: 791, 615 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-scrap-full + rotate: false + xy: 859, 683 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-thorium-full + rotate: false + xy: 825, 649 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-titanium-full + rotate: false + xy: 791, 581 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-payload-router-full + rotate: false + xy: 1335, 1853 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +payload-router-icon + rotate: false + xy: 1335, 1853 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-pebbles-full + rotate: false + xy: 859, 649 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-weaver-full + rotate: false + xy: 1793, 1639 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-plated-conduit-full + rotate: false + xy: 825, 615 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pneumatic-drill-full + rotate: false + xy: 1859, 1639 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-pulse-conduit-full + rotate: false + xy: 791, 547 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-full + rotate: false + xy: 859, 615 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-repair-point-full + rotate: false + xy: 825, 581 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ripple-full + rotate: false + xy: 1433, 1853 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-rock-full + rotate: false + xy: 1133, 1149 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rocks-full + rotate: false + xy: 859, 581 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-saltrocks-full + rotate: false + xy: 825, 547 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-full + rotate: false + xy: 1925, 1623 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-sand-boulder-full + rotate: false + xy: 859, 547 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-full + rotate: false + xy: 893, 989 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sandrocks-full + rotate: false + xy: 893, 955 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scatter-full + rotate: false + xy: 1499, 1615 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-scorch-full + rotate: false + xy: 893, 921 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-full + rotate: false + xy: 893, 887 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall1 + rotate: false + xy: 893, 887 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-full + rotate: false + xy: 1531, 1853 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-huge1 + rotate: false + xy: 1531, 1853 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-scrap-wall-large-full + rotate: false + xy: 505, 1333 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-segment-full + rotate: false + xy: 505, 1267 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-shale-boulder-full + rotate: false + xy: 893, 819 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-full + rotate: false + xy: 893, 785 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shalerocks-full + rotate: false + xy: 893, 751 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-full + rotate: false + xy: 893, 717 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-full + rotate: false + xy: 893, 683 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snowrock-full + rotate: false + xy: 803, 1091 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snowrocks-full + rotate: false + xy: 893, 649 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spectre-full + rotate: false + xy: 261, 1789 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-spore-cluster-full + rotate: false + xy: 1259, 1567 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-full + rotate: false + xy: 893, 615 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-press-full + rotate: false + xy: 493, 1201 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-sporerocks-full + rotate: false + xy: 893, 581 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-full + rotate: false + xy: 893, 547 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-swarmer-full + rotate: false + xy: 493, 1135 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-tendrils-full + rotate: false + xy: 845, 513 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-conveyor-full + rotate: false + xy: 845, 479 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-0 + rotate: false + xy: 845, 479 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-turbine-generator-full + rotate: false + xy: 489, 1069 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-water-extractor-full + rotate: false + xy: 457, 1003 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-wave-full + rotate: false + xy: 523, 1003 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +core-foundation-team-crux + rotate: false + xy: 1, 1269 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-foundation-team-sharded + rotate: false + xy: 131, 1399 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-shard-team-crux + rotate: false + xy: 1923, 1853 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-shard-team-sharded + rotate: false + xy: 391, 1085 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-1-0 + rotate: false + xy: 855, 71 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-1 + rotate: false + xy: 889, 71 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-2 + rotate: false + xy: 851, 37 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-3 + rotate: false + xy: 885, 37 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-4 + rotate: false + xy: 851, 3 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-5 + rotate: false + xy: 885, 3 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-6 + rotate: false + xy: 923, 105 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-7 + rotate: false + xy: 923, 71 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-2-0 + rotate: false + xy: 593, 937 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-1 + rotate: false + xy: 593, 871 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-2 + rotate: false + xy: 593, 805 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-3 + rotate: false + xy: 593, 739 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-4 + rotate: false + xy: 593, 673 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-5 + rotate: false + xy: 593, 607 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-6 + rotate: false + xy: 593, 541 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-7 + rotate: false + xy: 589, 475 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-3-0 + rotate: false + xy: 103, 781 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-1 + rotate: false + xy: 103, 683 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-2 + rotate: false + xy: 233, 861 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-3 + rotate: false + xy: 201, 763 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-4 + rotate: false + xy: 201, 665 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-5 + rotate: false + xy: 299, 763 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-6 + rotate: false + xy: 299, 665 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-7 + rotate: false + xy: 331, 861 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-4-0 + rotate: false + xy: 261, 1529 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-1 + rotate: false + xy: 391, 1659 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-2 + rotate: false + xy: 521, 1789 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-3 + rotate: false + xy: 651, 1919 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-4 + rotate: false + xy: 1, 1139 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-5 + rotate: false + xy: 131, 1269 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-6 + rotate: false + xy: 261, 1399 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-7 + rotate: false + xy: 391, 1529 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cyclone + rotate: false + xy: 359, 959 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +duo + rotate: false + xy: 1887, 1473 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +fuse + rotate: false + xy: 197, 469 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +hail + rotate: false + xy: 1921, 1473 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-blast-compound-large + rotate: false + xy: 1525, 1435 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-blast-compound-medium + rotate: false + xy: 1955, 1439 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-blast-compound-small + rotate: false + xy: 207, 881 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-blast-compound-tiny + rotate: false + xy: 1141, 1591 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-blast-compound-xlarge + rotate: false + xy: 1125, 1491 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-coal-large + rotate: false + xy: 1525, 1393 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-coal-medium + rotate: false + xy: 1773, 1413 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-coal-small + rotate: false + xy: 1249, 1283 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-coal-tiny + rotate: false + xy: 1661, 1707 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-coal-xlarge + rotate: false + xy: 1125, 1441 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-copper-large + rotate: false + xy: 1567, 1435 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-copper-medium + rotate: false + xy: 1769, 1379 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-copper-small + rotate: false + xy: 2023, 1481 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-copper-tiny + rotate: false + xy: 499, 959 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-copper-xlarge + rotate: false + xy: 1125, 1391 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-graphite-large + rotate: false + xy: 1525, 1351 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-graphite-medium + rotate: false + xy: 1769, 1345 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-graphite-small + rotate: false + xy: 2023, 1455 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-graphite-tiny + rotate: false + xy: 1275, 1549 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-graphite-xlarge + rotate: false + xy: 1125, 1341 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-lead-large + rotate: false + xy: 1567, 1393 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-lead-medium + rotate: false + xy: 1765, 1311 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-lead-small + rotate: false + xy: 363, 1113 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-lead-tiny + rotate: false + xy: 201, 861 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-lead-xlarge + rotate: false + xy: 1175, 1509 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-metaglass-large + rotate: false + xy: 1525, 1309 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-metaglass-medium + rotate: false + xy: 1765, 1277 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-metaglass-small + rotate: false + xy: 1013, 1893 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-metaglass-tiny + rotate: false + xy: 733, 1527 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-metaglass-xlarge + rotate: false + xy: 1175, 1459 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-phase-fabric-large + rotate: false + xy: 1567, 1351 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-phase-fabric-medium + rotate: false + xy: 1761, 1243 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-phase-fabric-small + rotate: false + xy: 571, 1339 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-phase-fabric-tiny + rotate: false + xy: 887, 1771 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-phase-fabric-xlarge + rotate: false + xy: 1175, 1409 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-plastanium-large + rotate: false + xy: 1567, 1309 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-plastanium-medium + rotate: false + xy: 1841, 1405 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-plastanium-small + rotate: false + xy: 499, 977 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-plastanium-tiny + rotate: false + xy: 2025, 2031 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-plastanium-xlarge + rotate: false + xy: 1175, 1359 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-pyratite-large + rotate: false + xy: 1165, 1267 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-pyratite-medium + rotate: false + xy: 1909, 1405 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-pyratite-small + rotate: false + xy: 1661, 1271 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-pyratite-tiny + rotate: false + xy: 1631, 1641 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-pyratite-xlarge + rotate: false + xy: 1225, 1509 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-sand-large + rotate: false + xy: 1207, 1267 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-sand-medium + rotate: false + xy: 1977, 1405 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-sand-small + rotate: false + xy: 1459, 965 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-sand-tiny + rotate: false + xy: 1, 6 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-sand-xlarge + rotate: false + xy: 1225, 1459 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-scrap-large + rotate: false + xy: 1219, 1225 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-scrap-medium + rotate: false + xy: 1871, 1371 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-scrap-small + rotate: false + xy: 363, 1087 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-scrap-tiny + rotate: false + xy: 1525, 1531 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-scrap-xlarge + rotate: false + xy: 1225, 1409 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-silicon-large + rotate: false + xy: 1625, 1465 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-silicon-medium + rotate: false + xy: 1939, 1371 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-silicon-small + rotate: false + xy: 1013, 1867 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-silicon-tiny + rotate: false + xy: 233, 963 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-silicon-xlarge + rotate: false + xy: 1225, 1359 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-spore-pod-large + rotate: false + xy: 1667, 1465 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-spore-pod-medium + rotate: false + xy: 1871, 1337 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod-small + rotate: false + xy: 363, 1061 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-spore-pod-tiny + rotate: false + xy: 887, 1753 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-spore-pod-xlarge + rotate: false + xy: 1275, 1499 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-surge-alloy-large + rotate: false + xy: 1709, 1466 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-surge-alloy-medium + rotate: false + xy: 1939, 1337 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-surge-alloy-small + rotate: false + xy: 1013, 1841 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-surge-alloy-tiny + rotate: false + xy: 2025, 2013 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-surge-alloy-xlarge + rotate: false + xy: 1325, 1499 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-thorium-large + rotate: false + xy: 1609, 1423 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-thorium-medium + rotate: false + xy: 1833, 1303 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-thorium-small + rotate: false + xy: 597, 1339 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-thorium-tiny + rotate: false + xy: 19, 6 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-thorium-xlarge + rotate: false + xy: 1275, 1449 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-titanium-large + rotate: false + xy: 1609, 1381 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-titanium-medium + rotate: false + xy: 1901, 1303 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-titanium-small + rotate: false + xy: 1039, 1843 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-titanium-tiny + rotate: false + xy: 1543, 1531 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-titanium-xlarge + rotate: false + xy: 1375, 1499 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +lancer + rotate: false + xy: 571, 1267 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +liquid-cryofluid-large + rotate: false + xy: 1651, 1423 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-cryofluid-medium + rotate: false + xy: 1867, 1269 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-cryofluid-small + rotate: false + xy: 1065, 1843 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-cryofluid-tiny + rotate: false + xy: 887, 1735 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-cryofluid-xlarge + rotate: false + xy: 1425, 1499 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-oil-large + rotate: false + xy: 1609, 1339 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-oil-medium + rotate: false + xy: 1969, 1269 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-oil-small + rotate: false + xy: 389, 1059 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-oil-tiny + rotate: false + xy: 2025, 1995 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-oil-xlarge + rotate: false + xy: 1325, 1399 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-slag-large + rotate: false + xy: 1651, 1381 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-slag-medium + rotate: false + xy: 2007, 1371 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-slag-small + rotate: false + xy: 415, 1059 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-slag-tiny + rotate: false + xy: 37, 6 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-slag-xlarge + rotate: false + xy: 1375, 1449 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-water-large + rotate: false + xy: 1651, 1339 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-water-medium + rotate: false + xy: 1999, 1235 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-water-small + rotate: false + xy: 1565, 1663 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-water-tiny + rotate: false + xy: 2025, 1977 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-water-xlarge + rotate: false + xy: 1475, 1499 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mass-driver + rotate: false + xy: 197, 77 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +meltdown + rotate: false + xy: 651, 1659 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +repair-point + rotate: false + xy: 957, 81 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ripple + rotate: false + xy: 635, 1333 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +salvo + rotate: false + xy: 721, 409 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scatter + rotate: false + xy: 721, 145 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scorch + rotate: false + xy: 1287, 1059 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +segment + rotate: false + xy: 901, 1265 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +spectre + rotate: false + xy: 1, 879 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +splash-0 + rotate: false + xy: 1321, 1025 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-1 + rotate: false + xy: 1323, 991 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-10 + rotate: false + xy: 1357, 991 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-11 + rotate: false + xy: 1357, 957 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-2 + rotate: false + xy: 1323, 957 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-3 + rotate: false + xy: 1329, 1229 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-4 + rotate: false + xy: 1335, 1195 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-5 + rotate: false + xy: 1335, 1161 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-6 + rotate: false + xy: 1355, 1127 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-7 + rotate: false + xy: 1355, 1093 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-8 + rotate: false + xy: 1355, 1059 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +splash-9 + rotate: false + xy: 1355, 1025 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +swarmer + rotate: false + xy: 157, 11 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-alpha-full + rotate: false + xy: 1375, 1299 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-cix-full + rotate: false + xy: 261, 1139 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +unit-crawler-full + rotate: false + xy: 1425, 1299 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-dagger-full + rotate: false + xy: 1475, 1299 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-draug-full + rotate: false + xy: 953, 1045 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-eruptor-full + rotate: false + xy: 1867, 1787 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +unit-fortress-full + rotate: false + xy: 261, 1057 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +unit-ghoul-full + rotate: false + xy: 1453, 1681 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +unit-mace-full + rotate: false + xy: 751, 13 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-oculon-full + rotate: false + xy: 1075, 1657 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +unit-phantom-full + rotate: false + xy: 809, 1141 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-revenant-full + rotate: false + xy: 651, 1545 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +unit-spirit-full + rotate: false + xy: 1003, 1037 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-tau-full + rotate: false + xy: 867, 1141 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +unit-trident-full + rotate: false + xy: 391, 1183 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +unit-vanguard-full + rotate: false + xy: 1053, 999 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-wraith-full + rotate: false + xy: 1103, 991 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +wave + rotate: false + xy: 1565, 1527 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +item-blast-compound + rotate: false + xy: 1921, 1439 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-coal + rotate: false + xy: 1989, 1439 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-copper + rotate: false + xy: 1807, 1413 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-graphite + rotate: false + xy: 1803, 1379 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-lead + rotate: false + xy: 1803, 1345 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-metaglass + rotate: false + xy: 1799, 1311 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-phase-fabric + rotate: false + xy: 1799, 1277 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-plastanium + rotate: false + xy: 1795, 1243 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-pyratite + rotate: false + xy: 1875, 1405 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-sand + rotate: false + xy: 1943, 1405 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-scrap + rotate: false + xy: 1837, 1371 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-silicon + rotate: false + xy: 1905, 1371 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod + rotate: false + xy: 1837, 1337 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-surge-alloy + rotate: false + xy: 1905, 1337 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-thorium + rotate: false + xy: 1973, 1337 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-titanium + rotate: false + xy: 1867, 1303 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-cryofluid + rotate: false + xy: 1833, 1269 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-oil + rotate: false + xy: 1935, 1269 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-slag + rotate: false + xy: 2011, 1405 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-water + rotate: false + xy: 2003, 1269 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +blank + rotate: false + xy: 765, 1656 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +shape-3 + rotate: false + xy: 1697, 1508 + size: 63, 63 + orig: 63, 63 + offset: 0, 0 + index: -1 +alpha + rotate: false + xy: 1033, 1149 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-cell + rotate: false + xy: 1083, 1149 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +chaos-array + rotate: false + xy: 391, 1919 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cix + rotate: false + xy: 391, 1919 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +chaos-array-base + rotate: false + xy: 1, 1399 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +chaos-array-cell + rotate: false + xy: 131, 1529 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +chaos-array-leg + rotate: false + xy: 261, 1659 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cix-cell + rotate: false + xy: 1, 24 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +cix-foot + rotate: false + xy: 1157, 1609 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +cix-joint-base + rotate: false + xy: 1229, 1609 + size: 70, 70 + orig: 70, 70 + offset: 0, 0 + index: -1 +cix-leg + rotate: false + xy: 1991, 1631 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +cix-leg-base + rotate: false + xy: 781, 1723 + size: 104, 64 + orig: 104, 64 + offset: 0, 0 + index: -1 +cix-old + rotate: false + xy: 1597, 1787 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +crawler + rotate: false + xy: 853, 1091 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-base + rotate: false + xy: 1183, 1149 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-cell + rotate: false + xy: 571, 1365 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +crawler-leg + rotate: false + xy: 1059, 1541 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger + rotate: false + xy: 1109, 1541 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-base + rotate: false + xy: 1159, 1559 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dagger-leg + rotate: false + xy: 1209, 1559 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +delta + rotate: false + xy: 1878, 1507 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +delta-cell + rotate: false + xy: 1928, 1507 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +draug + rotate: false + xy: 1978, 1507 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +draug-cell + rotate: false + xy: 903, 1091 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +eruptor + rotate: false + xy: 1687, 1787 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +eruptor-base + rotate: false + xy: 1829, 1573 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +eruptor-cell + rotate: false + xy: 1777, 1787 + size: 88, 64 + orig: 88, 64 + offset: 0, 0 + index: -1 +eruptor-foot + rotate: false + xy: 2007, 1729 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +eruptor-joint + rotate: false + xy: 233, 981 + size: 26, 26 + orig: 26, 26 + offset: 0, 0 + index: -1 +eruptor-leg + rotate: false + xy: 131, 879 + size: 36, 26 + orig: 36, 26 + offset: 0, 0 + index: -1 +eruptor-leg-base + rotate: false + xy: 169, 879 + size: 36, 26 + orig: 36, 26 + offset: 0, 0 + index: -1 +fortress + rotate: false + xy: 911, 1837 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-base + rotate: false + xy: 1895, 1557 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +fortress-cell + rotate: false + xy: 1041, 1967 + size: 100, 80 + orig: 100, 80 + offset: 0, 0 + index: -1 +fortress-leg + rotate: false + xy: 1597, 1725 + size: 80, 60 + orig: 80, 60 + offset: 0, 0 + index: -1 +ghoul + rotate: false + xy: 1157, 1681 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +ghoul-cell + rotate: false + xy: 1231, 1681 + size: 72, 72 + orig: 72, 72 + offset: 0, 0 + index: -1 +glaive + rotate: false + xy: 1762, 1515 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +glaive-cell + rotate: false + xy: 787, 345 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +mace + rotate: false + xy: 625, 1201 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-base + rotate: false + xy: 625, 1135 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-cell + rotate: false + xy: 621, 1069 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-leg + rotate: false + xy: 655, 1003 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +oculon + rotate: false + xy: 1679, 1705 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +oculon-armor + rotate: false + xy: 659, 607 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +oculon-base + rotate: false + xy: 1761, 1705 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +oculon-base-old + rotate: false + xy: 1475, 1449 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +oculon-cell + rotate: false + xy: 1843, 1705 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +oculon-cell-old + rotate: false + xy: 1475, 1399 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +oculon-leg + rotate: false + xy: 1925, 1689 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +oculon-leg-old + rotate: false + xy: 1275, 1349 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +oculon-old + rotate: false + xy: 691, 1149 + size: 58, 48 + orig: 58, 48 + offset: 0, 0 + index: -1 +phantom + rotate: false + xy: 1820, 1515 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +phantom-cell + rotate: false + xy: 787, 287 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +power-cell + rotate: false + xy: 787, 229 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +revenant + rotate: false + xy: 391, 1285 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +revenant-cell + rotate: false + xy: 521, 1415 + size: 112, 112 + orig: 112, 112 + offset: 0, 0 + index: -1 +spirit + rotate: false + xy: 1175, 1309 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spirit-cell + rotate: false + xy: 1225, 1309 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +tau + rotate: false + xy: 787, 171 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +tau-base + rotate: false + xy: 1275, 1299 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +tau-cell + rotate: false + xy: 787, 113 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +tau-leg + rotate: false + xy: 1325, 1299 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +trident + rotate: false + xy: 131, 907 + size: 100, 100 + orig: 100, 100 + offset: 0, 0 + index: -1 +trident-cell + rotate: false + xy: 751, 1141 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +vanguard + rotate: false + xy: 1153, 999 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +vanguard-cell + rotate: false + xy: 1203, 999 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +artillery + rotate: false + xy: 753, 1083 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +chaos + rotate: false + xy: 787, 403 + size: 56, 136 + orig: 56, 136 + offset: 0, 0 + index: -1 +eradication + rotate: false + xy: 99, 195 + size: 96, 192 + orig: 96, 192 + offset: 0, 0 + index: -1 +eruption + rotate: false + xy: 1003, 1087 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +flakgun + rotate: false + xy: 1053, 1099 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +flamethrower + rotate: false + xy: 1103, 1091 + size: 48, 56 + orig: 48, 56 + offset: 0, 0 + index: -1 +heal-weapon + rotate: false + xy: 1153, 1099 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +heal-weapon-mount + rotate: false + xy: 1203, 1099 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +large-weapon + rotate: false + xy: 1275, 1399 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +lich-missiles + rotate: false + xy: 1325, 1449 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +missiles + rotate: false + xy: 1375, 1399 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +missiles-mount + rotate: false + xy: 1425, 1449 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mount-weapon + rotate: false + xy: 1425, 1399 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +reaper-weapon + rotate: false + xy: 1325, 1349 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +revenant-missiles + rotate: false + xy: 1375, 1349 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +small-basic-weapon + rotate: false + xy: 1053, 1049 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +small-weapon + rotate: false + xy: 1103, 1041 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +weapon + rotate: false + xy: 1525, 1477 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +wraith + rotate: false + xy: 1575, 1477 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +beam-weapon + rotate: false + xy: 1957, 1771 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +beam-weapon + rotate: false + xy: 1957, 1771 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 + +sprites3.png +size: 2048,1024 +format: rgba8888 +filter: nearest,nearest +repeat: none +rubble-1-0 + rotate: false + xy: 1933, 723 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +rubble-1-1 + rotate: false + xy: 839, 363 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +rubble-2-0 + rotate: false + xy: 1335, 191 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +rubble-2-1 + rotate: false + xy: 1401, 191 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +rubble-3-0 + rotate: false + xy: 1237, 189 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +rubble-4-0 + rotate: false + xy: 1827, 115 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +rubble-5-0 + rotate: false + xy: 1887, 387 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +rubble-6-0 + rotate: false + xy: 1043, 33 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +rubble-7-0 + rotate: false + xy: 817, 1 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +rubble-8-0 + rotate: false + xy: 1611, 463 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +scorch-0-0 + rotate: false + xy: 675, 347 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +scorch-0-1 + rotate: false + xy: 757, 347 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +scorch-0-2 + rotate: false + xy: 1957, 163 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +scorch-1-0 + rotate: false + xy: 1933, 901 + size: 110, 110 + orig: 110, 110 + offset: 0, 0 + index: -1 +scorch-1-1 + rotate: false + xy: 1933, 789 + size: 110, 110 + orig: 110, 110 + offset: 0, 0 + index: -1 +scorch-1-2 + rotate: false + xy: 1237, 33 + size: 110, 110 + orig: 110, 110 + offset: 0, 0 + index: -1 +scorch-2-0 + rotate: false + xy: 1887, 245 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +scorch-2-1 + rotate: false + xy: 1543, 145 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +scorch-2-2 + rotate: false + xy: 1685, 145 + size: 140, 140 + orig: 140, 140 + offset: 0, 0 + index: -1 +scorch-3-0 + rotate: false + xy: 1543, 287 + size: 170, 170 + orig: 170, 170 + offset: 0, 0 + index: -1 +scorch-3-1 + rotate: false + xy: 1715, 291 + size: 170, 170 + orig: 170, 170 + offset: 0, 0 + index: -1 +scorch-3-2 + rotate: false + xy: 1869, 549 + size: 170, 170 + orig: 170, 170 + offset: 0, 0 + index: -1 +scorch-4-0 + rotate: false + xy: 1139, 489 + size: 200, 200 + orig: 200, 200 + offset: 0, 0 + index: -1 +scorch-4-1 + rotate: false + xy: 1139, 287 + size: 200, 200 + orig: 200, 200 + offset: 0, 0 + index: -1 +scorch-4-2 + rotate: false + xy: 1341, 257 + size: 200, 200 + orig: 200, 200 + offset: 0, 0 + index: -1 +scorch-5-0 + rotate: false + xy: 675, 429 + size: 230, 230 + orig: 230, 230 + offset: 0, 0 + index: -1 +scorch-5-1 + rotate: false + xy: 907, 459 + size: 230, 230 + orig: 230, 230 + offset: 0, 0 + index: -1 +scorch-5-2 + rotate: false + xy: 907, 227 + size: 230, 230 + orig: 230, 230 + offset: 0, 0 + index: -1 +scorch-6-0 + rotate: false + xy: 293, 47 + size: 260, 260 + orig: 260, 260 + offset: 0, 0 + index: -1 +scorch-6-1 + rotate: false + xy: 555, 77 + size: 260, 260 + orig: 260, 260 + offset: 0, 0 + index: -1 +scorch-6-2 + rotate: false + xy: 1349, 459 + size: 260, 260 + orig: 260, 260 + offset: 0, 0 + index: -1 +scorch-7-0 + rotate: false + xy: 1, 17 + size: 290, 290 + orig: 290, 290 + offset: 0, 0 + index: -1 +scorch-7-1 + rotate: false + xy: 1349, 721 + size: 290, 290 + orig: 290, 290 + offset: 0, 0 + index: -1 +scorch-7-2 + rotate: false + xy: 1641, 721 + size: 290, 290 + orig: 290, 290 + offset: 0, 0 + index: -1 +scorch-8-0 + rotate: false + xy: 353, 339 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +scorch-8-1 + rotate: false + xy: 705, 691 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +scorch-8-2 + rotate: false + xy: 1027, 691 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +scorch-9-0 + rotate: false + xy: 1, 661 + size: 350, 350 + orig: 350, 350 + offset: 0, 0 + index: -1 +scorch-9-1 + rotate: false + xy: 1, 309 + size: 350, 350 + orig: 350, 350 + offset: 0, 0 + index: -1 +scorch-9-2 + rotate: false + xy: 353, 661 + size: 350, 350 + orig: 350, 350 + offset: 0, 0 + index: -1 + +sprites4.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 + rotate: false + xy: 1, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-2 + rotate: false + xy: 1961, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-2-edge + rotate: false + xy: 1, 297 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-3 + rotate: false + xy: 1995, 459 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-3-edge + rotate: false + xy: 99, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-4 + rotate: false + xy: 753, 361 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-4-edge + rotate: false + xy: 1, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-5 + rotate: false + xy: 753, 327 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-5-edge + rotate: false + xy: 99, 297 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-panel-6 + rotate: false + xy: 753, 293 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-6-edge + 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 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water-edge + rotate: false + xy: 99, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +darksand-tainted-water1 + rotate: false + xy: 655, 131 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water2 + rotate: false + xy: 753, 259 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water3 + rotate: false + xy: 689, 179 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water + rotate: false + xy: 689, 145 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water-edge + rotate: false + xy: 197, 297 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +darksand-water1 + rotate: false + xy: 737, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water2 + rotate: false + xy: 1181, 409 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water3 + rotate: false + xy: 1215, 409 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand1 + rotate: false + xy: 491, 1 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand2 + rotate: false + xy: 557, 67 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand3 + rotate: false + xy: 655, 165 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +deepwater + rotate: false + xy: 1249, 409 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +deepwater-edge + rotate: false + xy: 295, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dunerocks-large + rotate: false + xy: 785, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dunerocks1 + rotate: false + xy: 1283, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dunerocks2 + rotate: false + xy: 1317, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +edge + rotate: false + xy: 1351, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +edge-stencil + rotate: false + xy: 1, 3 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +edgier + rotate: false + xy: 1385, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass-edge + rotate: false + xy: 99, 101 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +grass1 + rotate: false + xy: 1419, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass2 + rotate: false + xy: 1453, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass3 + rotate: false + xy: 1487, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +holostone-edge + rotate: false + xy: 197, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +holostone1 + rotate: false + xy: 1521, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +holostone2 + rotate: false + xy: 1555, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +holostone3 + rotate: false + xy: 1589, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock1 + rotate: false + xy: 1623, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock2 + rotate: false + xy: 1657, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock3 + rotate: false + xy: 1691, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-edge + rotate: false + xy: 295, 297 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +ice-snow-edge + rotate: false + xy: 393, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +ice-snow1 + rotate: false + xy: 1827, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-snow2 + rotate: false + xy: 1861, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-snow3 + rotate: false + xy: 1895, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice1 + rotate: false + xy: 1725, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice2 + rotate: false + xy: 1759, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice3 + rotate: false + xy: 1793, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icerocks-large + rotate: false + xy: 491, 35 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +icerocks1 + rotate: false + xy: 1929, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icerocks2 + rotate: false + xy: 1963, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ignarock-edge + rotate: false + xy: 99, 3 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +ignarock1 + rotate: false + xy: 1997, 425 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ignarock2 + rotate: false + xy: 771, 225 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ignarock3 + rotate: false + xy: 1283, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead1 + rotate: false + xy: 1317, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead2 + rotate: false + xy: 1351, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +lead3 + rotate: false + xy: 1385, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock1 + rotate: false + xy: 1419, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock2 + rotate: false + xy: 1453, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock3 + rotate: false + xy: 1487, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor + rotate: false + xy: 1521, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-2 + rotate: false + xy: 1555, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-2-edge + rotate: false + xy: 197, 101 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-3 + rotate: false + xy: 1589, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-3-edge + rotate: false + xy: 295, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-5 + rotate: false + xy: 1623, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-5-edge + rotate: false + xy: 393, 297 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-damaged-edge + rotate: false + xy: 491, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +metal-floor-damaged1 + rotate: false + xy: 1657, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-damaged2 + rotate: false + xy: 1691, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-damaged3 + rotate: false + xy: 1725, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-edge + rotate: false + xy: 197, 3 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +moss-edge + rotate: false + xy: 295, 101 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +moss1 + rotate: false + xy: 1759, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +moss2 + rotate: false + xy: 1793, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +moss3 + rotate: false + xy: 1827, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-coal1 + rotate: false + xy: 1861, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-coal2 + rotate: false + xy: 1895, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-coal3 + rotate: false + xy: 1929, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper1 + rotate: false + xy: 1963, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper2 + rotate: false + xy: 1997, 391 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-copper3 + rotate: false + xy: 723, 179 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead1 + rotate: false + xy: 723, 145 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead2 + rotate: false + xy: 757, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-lead3 + rotate: false + xy: 757, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-scrap1 + rotate: false + xy: 689, 111 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-scrap2 + rotate: false + xy: 723, 111 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-scrap3 + rotate: false + xy: 757, 123 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-thorium1 + rotate: false + xy: 791, 191 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-thorium2 + rotate: false + xy: 791, 157 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-thorium3 + rotate: false + xy: 791, 123 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-titanium1 + rotate: false + xy: 757, 89 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-titanium2 + rotate: false + xy: 791, 89 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ore-titanium3 + rotate: false + xy: 591, 99 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pebbles1 + rotate: false + xy: 591, 65 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pebbles2 + rotate: false + xy: 625, 97 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pebbles3 + rotate: false + xy: 625, 63 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pine + rotate: false + xy: 687, 213 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +rocks-large + rotate: false + xy: 589, 133 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +rocks1 + rotate: false + xy: 659, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rocks2 + rotate: false + xy: 693, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +salt + rotate: false + xy: 659, 43 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +salt-edge + rotate: false + xy: 393, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +saltrocks-large + rotate: false + xy: 687, 263 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +saltrocks1 + rotate: false + xy: 693, 43 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +saltrocks2 + rotate: false + xy: 727, 55 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-edge + rotate: false + xy: 491, 297 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +sand-water + rotate: false + xy: 761, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-water-edge + rotate: false + xy: 589, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +sand-water1 + rotate: false + xy: 795, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-water2 + rotate: false + xy: 787, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-water3 + rotate: false + xy: 787, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand1 + rotate: false + xy: 761, 55 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand2 + rotate: false + xy: 795, 55 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand3 + rotate: false + xy: 727, 21 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sandrocks-large + rotate: false + xy: 851, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +sandrocks1 + rotate: false + xy: 821, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sandrocks2 + rotate: false + xy: 787, 325 + 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 + rotate: false + xy: 295, 3 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +shale1 + 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 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +shalerocks1 + rotate: false + xy: 923, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shalerocks2 + rotate: false + xy: 821, 291 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shrubs-large + rotate: false + xy: 983, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +shrubs1 + rotate: false + xy: 855, 325 + 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 + rotate: false + xy: 393, 101 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +snow-edge + rotate: false + xy: 491, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +snow-pine + rotate: false + xy: 1181, 443 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +snow1 + rotate: false + xy: 855, 291 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snow2 + rotate: false + xy: 889, 325 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snow3 + rotate: false + xy: 923, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snowrocks-large + rotate: false + xy: 1049, 427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +snowrocks1 + rotate: false + xy: 991, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snowrocks2 + rotate: false + xy: 889, 291 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spawn + rotate: false + xy: 923, 325 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spore-moss-edge + 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 + rotate: false + xy: 687, 395 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +stone1 + rotate: false + xy: 1059, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone2 + rotate: false + xy: 957, 291 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone3 + rotate: false + xy: 991, 325 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tainted-water + rotate: false + xy: 1025, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tainted-water-edge + rotate: false + xy: 393, 3 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +tar + rotate: false + xy: 1093, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tar-edge + rotate: false + xy: 491, 101 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +tendrils1 + rotate: false + xy: 991, 291 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tendrils2 + rotate: false + xy: 1025, 325 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tendrils3 + rotate: false + xy: 1059, 359 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thorium1 + rotate: false + xy: 1127, 393 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thorium2 + rotate: false + xy: 1025, 291 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thorium3 + rotate: false + xy: 1059, 325 + 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 + rotate: false + xy: 589, 199 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 + +sprites5.png +size: 2048,1024 +format: rgba8888 +filter: nearest,nearest +repeat: none +additive-reconstructor-icon-editor + rotate: false + xy: 485, 631 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +air-factory-icon-editor + rotate: false + xy: 613, 759 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +alloy-smelter-icon-editor + rotate: false + xy: 1685, 921 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +arc-icon-editor + rotate: false + xy: 763, 725 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +armored-conveyor-icon-editor + rotate: false + xy: 1929, 723 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +battery-icon-editor + rotate: false + xy: 1929, 689 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +battery-large-icon-editor + rotate: false + xy: 485, 533 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +blast-drill-icon-editor + rotate: false + xy: 1, 19 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +blast-mixer-icon-editor + rotate: false + xy: 1979, 953 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-border-editor + rotate: false + xy: 1929, 655 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-forge-icon-editor + rotate: false + xy: 1783, 921 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-loader-icon-editor + rotate: false + xy: 485, 435 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-unloader-icon-editor + rotate: false + xy: 1881, 921 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +bridge-conduit-icon-editor + rotate: false + xy: 1929, 621 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +bridge-conveyor-icon-editor + rotate: false + xy: 1963, 739 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +char-icon-editor + rotate: false + xy: 1963, 705 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-char1 + rotate: false + xy: 1963, 705 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +clear-editor + rotate: false + xy: 775, 886 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +cliff-icon-editor + rotate: false + xy: 1963, 671 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cliffs-icon-editor + rotate: false + xy: 1963, 637 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +coal-centrifuge-icon-editor + rotate: false + xy: 1005, 725 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +combustion-generator-icon-editor + rotate: false + xy: 763, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conduit-icon-editor + rotate: false + xy: 1963, 603 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +container-icon-editor + rotate: false + xy: 1071, 725 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +conveyor-icon-editor + rotate: false + xy: 1997, 739 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper-wall-icon-editor + rotate: false + xy: 1997, 705 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper-wall-large-icon-editor + rotate: false + xy: 1137, 725 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +core-foundation-icon-editor + rotate: false + xy: 775, 889 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-nucleus-icon-editor + rotate: false + xy: 323, 567 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-shard-icon-editor + rotate: false + xy: 227, 277 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-silo-icon-editor + rotate: false + xy: 613, 857 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +craters-icon-editor + rotate: false + xy: 1997, 671 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-craters1 + rotate: false + xy: 1997, 671 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cryofluidmixer-icon-editor + rotate: false + xy: 1203, 725 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cultivator-icon-editor + rotate: false + xy: 1269, 725 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cyclone-icon-editor + rotate: false + xy: 227, 179 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +dark-metal-icon-editor + rotate: false + xy: 1997, 637 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-1-icon-editor + rotate: false + xy: 1997, 603 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dark-panel-1 + rotate: false + xy: 1997, 603 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-2-icon-editor + rotate: false + xy: 361, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dark-panel-2 + rotate: false + xy: 361, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-3-icon-editor + rotate: false + xy: 361, 43 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dark-panel-3 + rotate: false + xy: 361, 43 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-4-icon-editor + rotate: false + xy: 395, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dark-panel-4 + rotate: false + xy: 395, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-5-icon-editor + rotate: false + xy: 395, 43 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dark-panel-5 + rotate: false + xy: 395, 43 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +dark-panel-6-icon-editor + rotate: false + xy: 429, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-dark-panel-6 + rotate: false + xy: 429, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-icon-editor + rotate: false + xy: 429, 43 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand1 + rotate: false + xy: 429, 43 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-tainted-water-icon-editor + rotate: false + xy: 463, 77 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +darksand-water-icon-editor + rotate: false + xy: 463, 43 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +data-processor-icon-editor + rotate: false + xy: 131, 51 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +deepwater-icon-editor + rotate: false + xy: 361, 9 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-deepwater + rotate: false + xy: 361, 9 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +differential-generator-icon-editor + rotate: false + xy: 325, 307 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +diode-icon-editor + rotate: false + xy: 395, 9 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +disassembler-icon-editor + rotate: false + xy: 325, 209 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +distributor-icon-editor + rotate: false + xy: 1335, 725 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +door-icon-editor + rotate: false + xy: 429, 9 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +door-large-icon-editor + rotate: false + xy: 1401, 725 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dunerocks-icon-editor + rotate: false + xy: 463, 9 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +duo-icon-editor + rotate: false + xy: 497, 71 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-char2 + rotate: false + xy: 497, 37 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-char3 + rotate: false + xy: 531, 71 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-craters2 + rotate: false + xy: 531, 37 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-craters3 + rotate: false + xy: 497, 3 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-tainted-water1 + rotate: false + xy: 565, 37 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-tainted-water2 + rotate: false + xy: 565, 3 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-tainted-water3 + rotate: false + xy: 583, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-water1 + rotate: false + xy: 583, 641 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-water2 + rotate: false + xy: 617, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand-water3 + rotate: false + xy: 583, 607 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand2 + rotate: false + xy: 531, 3 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-darksand3 + rotate: false + xy: 565, 71 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-grass1 + rotate: false + xy: 617, 641 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +grass-icon-editor + rotate: false + xy: 617, 641 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-grass2 + rotate: false + xy: 651, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-grass3 + rotate: false + xy: 583, 573 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-holostone1 + rotate: false + xy: 617, 607 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +holostone-icon-editor + rotate: false + xy: 617, 607 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-holostone2 + rotate: false + xy: 651, 641 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-holostone3 + rotate: false + xy: 685, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-hotrock1 + rotate: false + xy: 583, 539 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +hotrock-icon-editor + rotate: false + xy: 583, 539 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-hotrock2 + rotate: false + xy: 617, 573 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-hotrock3 + rotate: false + xy: 651, 607 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice-snow1 + rotate: false + xy: 617, 539 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-snow-icon-editor + rotate: false + xy: 617, 539 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice-snow2 + rotate: false + xy: 651, 573 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice-snow3 + rotate: false + xy: 685, 607 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice1 + rotate: false + xy: 685, 641 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ice-icon-editor + rotate: false + xy: 685, 641 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice2 + rotate: false + xy: 719, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ice3 + rotate: false + xy: 583, 505 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ignarock1 + rotate: false + xy: 719, 641 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ignarock-icon-editor + rotate: false + xy: 719, 641 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ignarock2 + rotate: false + xy: 583, 471 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ignarock3 + rotate: false + xy: 617, 505 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-magmarock1 + rotate: false + xy: 651, 539 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +magmarock-icon-editor + rotate: false + xy: 651, 539 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-magmarock2 + rotate: false + xy: 685, 573 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-magmarock3 + rotate: false + xy: 719, 607 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor + rotate: false + xy: 583, 437 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-icon-editor + rotate: false + xy: 583, 437 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-2 + rotate: false + xy: 617, 471 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-2-icon-editor + rotate: false + xy: 617, 471 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-3 + rotate: false + xy: 651, 505 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-3-icon-editor + rotate: false + xy: 651, 505 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-5 + rotate: false + xy: 685, 539 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-5-icon-editor + rotate: false + xy: 685, 539 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-damaged1 + rotate: false + xy: 719, 573 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +metal-floor-damaged-icon-editor + rotate: false + xy: 719, 573 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-damaged2 + rotate: false + xy: 617, 437 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-metal-floor-damaged3 + rotate: false + xy: 651, 471 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-moss1 + rotate: false + xy: 685, 505 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +moss-icon-editor + rotate: false + xy: 685, 505 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-moss2 + rotate: false + xy: 719, 539 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-moss3 + rotate: false + xy: 651, 437 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-coal1 + rotate: false + xy: 685, 471 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-coal2 + rotate: false + xy: 719, 505 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-coal3 + rotate: false + xy: 685, 437 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-copper1 + rotate: false + xy: 719, 471 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-copper2 + rotate: false + xy: 719, 437 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-copper3 + rotate: false + xy: 587, 403 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-lead1 + rotate: false + xy: 587, 369 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-lead2 + rotate: false + xy: 621, 403 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-lead3 + rotate: false + xy: 587, 335 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-scrap1 + rotate: false + xy: 621, 369 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-scrap2 + rotate: false + xy: 655, 403 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-scrap3 + rotate: false + xy: 587, 301 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-thorium1 + rotate: false + xy: 621, 335 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-thorium2 + rotate: false + xy: 655, 369 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-thorium3 + rotate: false + xy: 689, 403 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-titanium1 + rotate: false + xy: 587, 267 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-titanium2 + rotate: false + xy: 621, 301 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-ore-titanium3 + rotate: false + xy: 655, 335 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-pebbles1 + rotate: false + xy: 689, 369 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-pebbles2 + rotate: false + xy: 621, 267 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-pebbles3 + rotate: false + xy: 655, 301 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-salt + rotate: false + xy: 689, 335 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +salt-icon-editor + rotate: false + xy: 689, 335 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand-water1 + rotate: false + xy: 723, 403 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand-water2 + rotate: false + xy: 723, 369 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand-water3 + rotate: false + xy: 723, 335 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand1 + rotate: false + xy: 655, 267 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-icon-editor + rotate: false + xy: 655, 267 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand2 + rotate: false + xy: 689, 301 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-sand3 + rotate: false + xy: 689, 267 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-shale1 + rotate: false + xy: 723, 301 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shale-icon-editor + rotate: false + xy: 723, 301 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-shale2 + rotate: false + xy: 723, 267 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-shale3 + rotate: false + xy: 753, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-slag + rotate: false + xy: 753, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +slag-icon-editor + rotate: false + xy: 753, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-snow1 + rotate: false + xy: 753, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-snow2 + rotate: false + xy: 753, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-snow3 + rotate: false + xy: 753, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-spawn + rotate: false + xy: 753, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-spore-moss1 + rotate: false + xy: 753, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spore-moss-icon-editor + rotate: false + xy: 753, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-spore-moss2 + rotate: false + xy: 757, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-spore-moss3 + rotate: false + xy: 757, 385 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-stone1 + rotate: false + xy: 757, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +stone-icon-editor + rotate: false + xy: 757, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-stone2 + rotate: false + xy: 757, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-stone3 + rotate: false + xy: 757, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-tainted-water + rotate: false + xy: 757, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tainted-water-icon-editor + rotate: false + xy: 757, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-tar + rotate: false + xy: 787, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tar-icon-editor + rotate: false + xy: 787, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-tendrils1 + rotate: false + xy: 787, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-tendrils2 + rotate: false + xy: 787, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-tendrils3 + rotate: false + xy: 787, 555 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +editor-water + rotate: false + xy: 787, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +water-icon-editor + rotate: false + xy: 787, 521 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +exponential-reconstructor-icon-editor + rotate: false + xy: 1, 149 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +force-projector-icon-editor + rotate: false + xy: 229, 81 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +fuse-icon-editor + rotate: false + xy: 327, 111 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +graphite-press-icon-editor + rotate: false + xy: 1467, 725 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +ground-factory-icon-editor + rotate: false + xy: 711, 759 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +hail-icon-editor + rotate: false + xy: 787, 487 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +icerocks-icon-editor + rotate: false + xy: 787, 453 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +illuminator-icon-editor + rotate: false + xy: 821, 659 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +impact-reactor-icon-editor + rotate: false + xy: 905, 889 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +incinerator-icon-editor + rotate: false + xy: 821, 625 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +inverted-sorter-icon-editor + rotate: false + xy: 821, 591 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-source-icon-editor + rotate: false + xy: 855, 659 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-void-icon-editor + rotate: false + xy: 855, 625 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +junction-icon-editor + rotate: false + xy: 855, 591 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +kiln-icon-editor + rotate: false + xy: 1533, 725 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +lancer-icon-editor + rotate: false + xy: 1599, 725 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +large-overdrive-projector-icon-editor + rotate: false + xy: 809, 791 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +laser-drill-icon-editor + rotate: false + xy: 907, 791 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +launch-pad-icon-editor + rotate: false + xy: 1005, 791 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +launch-pad-large-icon-editor + rotate: false + xy: 1035, 889 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +liquid-junction-icon-editor + rotate: false + xy: 821, 557 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-router-icon-editor + rotate: false + xy: 889, 659 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-source-icon-editor + rotate: false + xy: 889, 625 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-tank-icon-editor + rotate: false + xy: 1103, 791 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +liquid-void-icon-editor + rotate: false + xy: 889, 591 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mass-conveyor-icon-editor + rotate: false + xy: 1201, 791 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mass-driver-icon-editor + rotate: false + xy: 1299, 791 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +mechanical-drill-icon-editor + rotate: false + xy: 1691, 757 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mechanical-pump-icon-editor + rotate: false + xy: 821, 523 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +meltdown-icon-editor + rotate: false + xy: 1165, 889 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +melter-icon-editor + rotate: false + xy: 855, 557 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mend-projector-icon-editor + rotate: false + xy: 1757, 757 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mender-icon-editor + rotate: false + xy: 923, 659 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +message-icon-editor + rotate: false + xy: 923, 625 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +multi-press-icon-editor + rotate: false + xy: 1397, 791 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +multiplicative-reconstructor-icon-editor + rotate: false + xy: 323, 405 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +naval-factory-icon-editor + rotate: false + xy: 1495, 791 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +oil-extractor-icon-editor + rotate: false + xy: 1593, 791 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +overdrive-projector-icon-editor + rotate: false + xy: 1823, 757 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +overflow-gate-icon-editor + rotate: false + xy: 923, 591 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +payload-router-icon-editor + rotate: false + xy: 1691, 823 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +pebbles-icon-editor + rotate: false + xy: 821, 489 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conduit-icon-editor + rotate: false + xy: 855, 523 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conveyor-icon-editor + rotate: false + xy: 889, 557 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-wall-icon-editor + rotate: false + xy: 957, 659 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-wall-large-icon-editor + rotate: false + xy: 1889, 757 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +phase-weaver-icon-editor + rotate: false + xy: 521, 369 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pine-icon-editor + rotate: false + xy: 131, 1 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +plastanium-compressor-icon-editor + rotate: false + xy: 521, 303 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plastanium-conveyor-icon-editor + rotate: false + xy: 957, 625 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-wall-icon-editor + rotate: false + xy: 957, 591 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +plastanium-wall-large-icon-editor + rotate: false + xy: 521, 237 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plated-conduit-icon-editor + rotate: false + xy: 821, 455 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pneumatic-drill-icon-editor + rotate: false + xy: 523, 171 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +power-node-icon-editor + rotate: false + xy: 855, 489 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +power-node-large-icon-editor + rotate: false + xy: 523, 105 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +power-source-icon-editor + rotate: false + xy: 889, 523 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +power-void-icon-editor + rotate: false + xy: 923, 557 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulse-conduit-icon-editor + rotate: false + xy: 855, 455 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pulverizer-icon-editor + rotate: false + xy: 889, 489 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +pyratite-mixer-icon-editor + rotate: false + xy: 1005, 659 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +repair-point-icon-editor + rotate: false + xy: 923, 523 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +resupply-point-icon-editor + rotate: false + xy: 1071, 659 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +ripple-icon-editor + rotate: false + xy: 1789, 823 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +rock-icon-editor + rotate: false + xy: 613, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +rocks-icon-editor + rotate: false + xy: 957, 557 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rotary-pump-icon-editor + rotate: false + xy: 1137, 659 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +router-icon-editor + rotate: false + xy: 889, 455 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +rtg-generator-icon-editor + rotate: false + xy: 1203, 659 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +saltrocks-icon-editor + rotate: false + xy: 923, 489 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +salvo-icon-editor + rotate: false + xy: 1269, 659 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +sand-boulder-icon-editor + rotate: false + xy: 957, 523 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sand-water-icon-editor + rotate: false + xy: 923, 455 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sandrocks-icon-editor + rotate: false + xy: 957, 489 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scatter-icon-editor + rotate: false + xy: 1335, 659 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scorch-icon-editor + rotate: false + xy: 957, 455 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall-gigantic-icon-editor + rotate: false + xy: 1295, 889 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +scrap-wall-huge-icon-editor + rotate: false + xy: 1887, 823 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-icon-editor + rotate: false + xy: 791, 419 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall-large-icon-editor + rotate: false + xy: 1401, 659 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +segment-icon-editor + rotate: false + xy: 1467, 659 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +separator-icon-editor + rotate: false + xy: 1533, 659 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +shale-boulder-icon-editor + rotate: false + xy: 791, 385 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shalerocks-icon-editor + rotate: false + xy: 791, 351 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shock-mine-icon-editor + rotate: false + xy: 791, 317 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +shrubs-icon-editor + rotate: false + xy: 791, 283 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +silicon-crucible-icon-editor + rotate: false + xy: 423, 307 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +silicon-smelter-icon-editor + rotate: false + xy: 1599, 659 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +snow-icon-editor + rotate: false + xy: 791, 249 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +snow-pine-icon-editor + rotate: false + xy: 663, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +snowrock-icon-editor + rotate: false + xy: 713, 709 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +snowrocks-icon-editor + rotate: false + xy: 825, 421 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +solar-panel-icon-editor + rotate: false + xy: 825, 387 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +solar-panel-large-icon-editor + rotate: false + xy: 423, 209 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +sorter-icon-editor + rotate: false + xy: 859, 421 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spawn-icon-editor + rotate: false + xy: 825, 353 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spectre-icon-editor + rotate: false + xy: 1425, 889 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +spore-cluster-icon-editor + rotate: false + xy: 181, 9 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +spore-pine-icon-editor + rotate: false + xy: 1955, 773 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +spore-press-icon-editor + rotate: false + xy: 1665, 691 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +sporerocks-icon-editor + rotate: false + xy: 859, 387 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +surge-tower-icon-editor + rotate: false + xy: 1731, 691 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +surge-wall-icon-editor + rotate: false + xy: 893, 421 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +surge-wall-large-icon-editor + rotate: false + xy: 1797, 691 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +swarmer-icon-editor + rotate: false + xy: 1863, 691 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +tendrils-icon-editor + rotate: false + xy: 825, 319 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +tetrative-reconstructor-icon-editor + rotate: false + xy: 323, 729 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +thermal-generator-icon-editor + rotate: false + xy: 1665, 625 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thermal-pump-icon-editor + rotate: false + xy: 425, 111 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thorium-reactor-icon-editor + rotate: false + xy: 809, 693 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thorium-wall-icon-editor + rotate: false + xy: 859, 353 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thorium-wall-large-icon-editor + rotate: false + xy: 1731, 625 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thruster-icon-editor + rotate: false + xy: 1555, 889 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +titanium-conveyor-icon-editor + rotate: false + xy: 893, 387 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-wall-icon-editor + rotate: false + xy: 927, 421 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-wall-large-icon-editor + rotate: false + xy: 1797, 625 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +turbine-generator-icon-editor + rotate: false + xy: 1863, 625 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +underflow-gate-icon-editor + rotate: false + xy: 825, 285 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unloader-icon-editor + rotate: false + xy: 859, 319 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +vault-icon-editor + rotate: false + xy: 907, 693 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +water-extractor-icon-editor + rotate: false + xy: 229, 15 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +wave-icon-editor + rotate: false + xy: 295, 15 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +white-tree-dead-icon-editor + rotate: false + xy: 1, 697 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +white-tree-icon-editor + rotate: false + xy: 1, 375 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 + +sprites6.png +size: 2048,1024 +format: rgba8888 +filter: nearest,nearest +repeat: none +alpha-bg + rotate: false + xy: 1, 528 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +bar + rotate: false + xy: 1727, 785 + size: 27, 36 + split: 9, 9, 9, 9 + orig: 27, 36 + offset: 0, 0 + index: -1 +bar-top + rotate: false + xy: 1698, 785 + size: 27, 36 + split: 9, 10, 9, 10 + orig: 27, 36 + offset: 0, 0 + index: -1 +block-additive-reconstructor-large + rotate: false + xy: 2007, 983 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-additive-reconstructor-medium + rotate: false + xy: 1601, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-additive-reconstructor-small + rotate: false + xy: 1987, 839 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-additive-reconstructor-tiny + rotate: false + xy: 301, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-additive-reconstructor-xlarge + rotate: false + xy: 1, 478 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-air-factory-large + rotate: false + xy: 2007, 941 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-air-factory-medium + rotate: false + xy: 1635, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-air-factory-small + rotate: false + xy: 939, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-air-factory-tiny + rotate: false + xy: 319, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-air-factory-xlarge + rotate: false + xy: 131, 608 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-alloy-smelter-large + rotate: false + xy: 351, 224 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-alloy-smelter-medium + rotate: false + xy: 1669, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-alloy-smelter-small + rotate: false + xy: 965, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-alloy-smelter-tiny + rotate: false + xy: 309, 698 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-alloy-smelter-xlarge + rotate: false + xy: 771, 928 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-arc-large + rotate: false + xy: 401, 274 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-arc-medium + rotate: false + xy: 1703, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-arc-small + rotate: false + xy: 991, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-arc-tiny + rotate: false + xy: 331, 598 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-arc-xlarge + rotate: false + xy: 259, 819 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-armored-conveyor-large + rotate: false + xy: 451, 324 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-armored-conveyor-medium + rotate: false + xy: 1737, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-armored-conveyor-small + rotate: false + xy: 1017, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-armored-conveyor-tiny + rotate: false + xy: 667, 20 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-armored-conveyor-xlarge + rotate: false + xy: 1, 428 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-battery-large + rotate: false + xy: 501, 374 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-large + rotate: false + xy: 551, 424 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-medium + rotate: false + xy: 1771, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-battery-large-small + rotate: false + xy: 1043, 1 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-battery-large-tiny + rotate: false + xy: 905, 315 + 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: 1805, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-battery-small + rotate: false + xy: 1069, 1 + 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: 601, 474 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-blast-drill-medium + rotate: false + xy: 1839, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-blast-drill-small + rotate: false + xy: 781, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-blast-drill-tiny + rotate: false + xy: 1535, 589 + 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: 651, 524 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-blast-mixer-medium + rotate: false + xy: 1873, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-blast-mixer-small + rotate: false + xy: 80, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-blast-mixer-tiny + rotate: false + xy: 1151, 542 + 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: 701, 574 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-block-forge-medium + rotate: false + xy: 1907, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-block-forge-small + rotate: false + xy: 769, 484 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-block-forge-tiny + rotate: false + xy: 1177, 505 + 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: 351, 182 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-block-loader-medium + rotate: false + xy: 1941, 857 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-block-loader-small + rotate: false + xy: 1785, 797 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-block-loader-tiny + rotate: false + xy: 1203, 542 + 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: 351, 140 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-block-unloader-medium + rotate: false + xy: 633, 4 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-block-unloader-small + rotate: false + xy: 106, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-block-unloader-tiny + rotate: false + xy: 309, 680 + 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: 351, 98 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-bridge-conduit-medium + rotate: false + xy: 901, 673 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-bridge-conduit-small + rotate: false + xy: 1785, 771 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-bridge-conduit-tiny + rotate: false + xy: 331, 580 + 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: 351, 56 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-bridge-conveyor-medium + rotate: false + xy: 935, 673 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-bridge-conveyor-small + rotate: false + xy: 1811, 797 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-bridge-conveyor-tiny + rotate: false + xy: 1177, 487 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-bridge-conveyor-xlarge + rotate: false + xy: 1, 328 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-char-large + rotate: false + xy: 351, 14 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-char-medium + rotate: false + xy: 1979, 899 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-char-small + rotate: false + xy: 1811, 771 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-char-tiny + rotate: false + xy: 1203, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-char-xlarge + rotate: false + xy: 51, 378 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cliff-large + rotate: false + xy: 393, 224 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cliff-medium + rotate: false + xy: 2013, 907 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cliff-small + rotate: false + xy: 1837, 797 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cliff-tiny + rotate: false + xy: 1221, 542 + 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: 393, 182 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cliffs-medium + rotate: false + xy: 881, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cliffs-small + rotate: false + xy: 1837, 771 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cliffs-tiny + rotate: false + xy: 1177, 469 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cliffs-xlarge + rotate: false + xy: 1, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-coal-centrifuge-large + rotate: false + xy: 393, 140 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-coal-centrifuge-medium + rotate: false + xy: 881, 605 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-coal-centrifuge-small + rotate: false + xy: 1863, 797 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-coal-centrifuge-tiny + rotate: false + xy: 1221, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-coal-centrifuge-xlarge + rotate: false + xy: 51, 328 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-combustion-generator-large + rotate: false + xy: 393, 98 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-combustion-generator-medium + rotate: false + xy: 915, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-combustion-generator-small + rotate: false + xy: 1863, 771 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-combustion-generator-tiny + rotate: false + xy: 1239, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-combustion-generator-xlarge + rotate: false + xy: 1, 228 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-conduit-large + rotate: false + xy: 393, 56 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-conduit-medium + rotate: false + xy: 915, 605 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conduit-small + rotate: false + xy: 1889, 797 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-conduit-tiny + rotate: false + xy: 1177, 451 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-conduit-xlarge + rotate: false + xy: 51, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-container-large + rotate: false + xy: 393, 14 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-container-medium + rotate: false + xy: 881, 571 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-container-small + rotate: false + xy: 1889, 771 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-container-tiny + rotate: false + xy: 1239, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-container-xlarge + rotate: false + xy: 1, 178 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-conveyor-large + rotate: false + xy: 443, 274 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-conveyor-medium + rotate: false + xy: 915, 571 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conveyor-small + rotate: false + xy: 1915, 797 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-conveyor-tiny + rotate: false + xy: 1257, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-conveyor-xlarge + rotate: false + xy: 51, 228 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-copper-wall-large + rotate: false + xy: 435, 232 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-large + rotate: false + xy: 435, 190 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-medium + rotate: false + xy: 949, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-copper-wall-large-small + rotate: false + xy: 1915, 771 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-copper-wall-large-tiny + rotate: false + xy: 1177, 433 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-copper-wall-large-xlarge + rotate: false + xy: 1, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-copper-wall-medium + rotate: false + xy: 949, 605 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-copper-wall-small + rotate: false + xy: 1941, 797 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-copper-wall-tiny + rotate: false + xy: 1257, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-copper-wall-xlarge + rotate: false + xy: 51, 178 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-foundation-large + rotate: false + xy: 435, 148 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-foundation-medium + rotate: false + xy: 949, 571 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-foundation-small + rotate: false + xy: 1941, 771 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-foundation-tiny + rotate: false + xy: 1275, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-foundation-xlarge + rotate: false + xy: 1, 78 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-nucleus-large + rotate: false + xy: 435, 106 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-nucleus-medium + rotate: false + xy: 969, 673 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-nucleus-small + rotate: false + xy: 1095, 4 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-nucleus-tiny + rotate: false + xy: 1177, 415 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-nucleus-xlarge + rotate: false + xy: 51, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-shard-large + rotate: false + xy: 435, 64 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-shard-medium + rotate: false + xy: 983, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-shard-small + rotate: false + xy: 1121, 4 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-shard-tiny + rotate: false + xy: 1275, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-shard-xlarge + rotate: false + xy: 1, 28 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-silo-large + rotate: false + xy: 435, 22 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-silo-medium + rotate: false + xy: 983, 605 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-silo-small + rotate: false + xy: 1147, 4 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-silo-tiny + rotate: false + xy: 1293, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-silo-xlarge + rotate: false + xy: 51, 78 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-craters-large + rotate: false + xy: 493, 324 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-craters-medium + rotate: false + xy: 983, 571 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-craters-small + rotate: false + xy: 1967, 797 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-craters-tiny + rotate: false + xy: 1177, 397 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-craters-xlarge + rotate: false + xy: 51, 28 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cryofluidmixer-large + rotate: false + xy: 485, 282 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cryofluidmixer-medium + rotate: false + xy: 743, 553 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cryofluidmixer-small + rotate: false + xy: 1967, 771 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cryofluidmixer-tiny + rotate: false + xy: 1293, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cryofluidmixer-xlarge + rotate: false + xy: 857, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cultivator-large + rotate: false + xy: 543, 374 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cultivator-medium + rotate: false + xy: 777, 544 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cultivator-small + rotate: false + xy: 735, 527 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cultivator-tiny + rotate: false + xy: 1311, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cultivator-xlarge + rotate: false + xy: 907, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cyclone-large + rotate: false + xy: 535, 332 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cyclone-medium + rotate: false + xy: 811, 544 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cyclone-small + rotate: false + xy: 1785, 745 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cyclone-tiny + rotate: false + xy: 1177, 379 + 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: 593, 424 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-metal-medium + rotate: false + xy: 845, 544 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-metal-small + rotate: false + xy: 1811, 745 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-metal-tiny + rotate: false + xy: 1311, 524 + 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: 585, 382 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-1-medium + rotate: false + xy: 879, 537 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-1-small + rotate: false + xy: 1837, 745 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-1-tiny + rotate: false + xy: 1329, 542 + 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: 643, 474 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-2-medium + rotate: false + xy: 913, 537 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-2-small + rotate: false + xy: 1863, 745 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-2-tiny + rotate: false + xy: 1177, 361 + 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 + rotate: false + xy: 635, 432 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-3-medium + rotate: false + xy: 947, 537 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-3-small + rotate: false + xy: 1889, 745 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-3-tiny + rotate: false + xy: 1329, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-3-xlarge + rotate: false + xy: 1157, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-4-large + rotate: false + xy: 693, 524 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-4-medium + rotate: false + xy: 981, 537 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-4-small + rotate: false + xy: 1915, 745 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-4-tiny + rotate: false + xy: 1347, 542 + 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 + rotate: false + xy: 685, 482 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-5-medium + rotate: false + xy: 1027, 786 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-5-small + rotate: false + xy: 1941, 745 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-5-tiny + rotate: false + xy: 1177, 343 + 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 + rotate: false + xy: 477, 232 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-6-medium + rotate: false + xy: 1069, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-6-small + rotate: false + xy: 1967, 745 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-6-tiny + rotate: false + xy: 1347, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-6-xlarge + rotate: false + xy: 1307, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-large + rotate: false + xy: 477, 190 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-medium + rotate: false + xy: 1103, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-small + rotate: false + xy: 1993, 813 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-large + rotate: false + xy: 477, 148 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-medium + rotate: false + xy: 1137, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-small + rotate: false + xy: 1993, 787 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-tiny + rotate: false + xy: 1365, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-xlarge + rotate: false + xy: 1357, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-tiny + rotate: false + xy: 1177, 325 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-large + rotate: false + xy: 477, 106 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-water-medium + rotate: false + xy: 1171, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-water-small + rotate: false + xy: 2019, 813 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-water-tiny + rotate: false + xy: 1365, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-xlarge + rotate: false + xy: 1407, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-xlarge + rotate: false + xy: 1457, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-data-processor-large + rotate: false + xy: 477, 64 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-data-processor-medium + rotate: false + xy: 1205, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-data-processor-small + rotate: false + xy: 1993, 761 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-data-processor-tiny + rotate: false + xy: 1383, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-data-processor-xlarge + rotate: false + xy: 1507, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-deepwater-large + rotate: false + xy: 477, 22 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-deepwater-medium + rotate: false + xy: 1239, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-deepwater-small + rotate: false + xy: 2019, 787 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-deepwater-tiny + rotate: false + xy: 1177, 307 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-deepwater-xlarge + rotate: false + xy: 1557, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-differential-generator-large + rotate: false + xy: 527, 282 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-differential-generator-medium + rotate: false + xy: 1273, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-differential-generator-small + rotate: false + xy: 2019, 761 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-differential-generator-tiny + rotate: false + xy: 1383, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-differential-generator-xlarge + rotate: false + xy: 1607, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-diode-large + rotate: false + xy: 519, 240 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-diode-medium + rotate: false + xy: 1307, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-diode-small + rotate: false + xy: 1993, 735 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-diode-tiny + rotate: false + xy: 1401, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-diode-xlarge + rotate: false + xy: 1657, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-disassembler-large + rotate: false + xy: 519, 198 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-disassembler-medium + rotate: false + xy: 1341, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-disassembler-small + rotate: false + xy: 2019, 735 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-disassembler-tiny + rotate: false + xy: 1177, 289 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-disassembler-xlarge + rotate: false + xy: 1707, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-distributor-large + rotate: false + xy: 519, 156 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-distributor-medium + rotate: false + xy: 1375, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-distributor-small + rotate: false + xy: 1095, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-distributor-tiny + rotate: false + xy: 1401, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-distributor-xlarge + rotate: false + xy: 1757, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-door-large + rotate: false + xy: 519, 114 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-door-large-large + rotate: false + xy: 519, 72 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-door-large-medium + rotate: false + xy: 1409, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-door-large-small + rotate: false + xy: 1121, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-door-large-tiny + rotate: false + xy: 1419, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-door-large-xlarge + rotate: false + xy: 1807, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-door-medium + rotate: false + xy: 1443, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-door-small + rotate: false + xy: 1147, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-door-tiny + rotate: false + xy: 1177, 271 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-door-xlarge + rotate: false + xy: 1857, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dunerocks-large + rotate: false + xy: 519, 30 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dunerocks-medium + rotate: false + xy: 1477, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dunerocks-small + rotate: false + xy: 1173, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dunerocks-tiny + rotate: false + xy: 1419, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dunerocks-xlarge + rotate: false + xy: 1907, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-duo-large + rotate: false + xy: 577, 332 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-duo-medium + rotate: false + xy: 1511, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-duo-small + rotate: false + xy: 1199, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-duo-tiny + rotate: false + xy: 1437, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-duo-xlarge + rotate: false + xy: 1957, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-large + rotate: false + xy: 569, 290 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-medium + rotate: false + xy: 1545, 828 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-small + rotate: false + xy: 1225, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-tiny + rotate: false + xy: 1177, 253 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-xlarge + rotate: false + xy: 345, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-force-projector-large + rotate: false + xy: 627, 382 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-force-projector-medium + rotate: false + xy: 985, 744 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-force-projector-small + rotate: false + xy: 1251, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-force-projector-tiny + rotate: false + xy: 1437, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-force-projector-xlarge + rotate: false + xy: 395, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-fuse-large + rotate: false + xy: 619, 340 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-fuse-medium + rotate: false + xy: 977, 710 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-fuse-small + rotate: false + xy: 1277, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-fuse-tiny + rotate: false + xy: 1455, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-fuse-xlarge + rotate: false + xy: 445, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-graphite-press-large + rotate: false + xy: 677, 432 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-graphite-press-medium + rotate: false + xy: 1979, 865 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-graphite-press-small + rotate: false + xy: 1303, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-graphite-press-tiny + rotate: false + xy: 1177, 235 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-graphite-press-xlarge + rotate: false + xy: 495, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-grass-large + rotate: false + xy: 669, 390 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-grass-medium + rotate: false + xy: 2013, 873 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-grass-small + rotate: false + xy: 1329, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-grass-tiny + rotate: false + xy: 1455, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-grass-xlarge + rotate: false + xy: 545, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ground-factory-large + rotate: false + xy: 727, 482 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ground-factory-medium + rotate: false + xy: 1011, 710 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ground-factory-small + rotate: false + xy: 1355, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ground-factory-tiny + rotate: false + xy: 1473, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ground-factory-xlarge + rotate: false + xy: 595, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-hail-large + rotate: false + xy: 719, 440 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-hail-medium + rotate: false + xy: 1003, 676 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hail-small + rotate: false + xy: 1381, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-hail-tiny + rotate: false + xy: 1177, 217 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-hail-xlarge + rotate: false + xy: 645, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-holostone-large + rotate: false + xy: 561, 240 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-holostone-medium + rotate: false + xy: 1019, 744 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-holostone-small + rotate: false + xy: 1407, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-holostone-tiny + rotate: false + xy: 1473, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-holostone-xlarge + rotate: false + xy: 695, 866 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-hotrock-large + rotate: false + xy: 561, 198 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-hotrock-medium + rotate: false + xy: 1017, 642 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hotrock-small + rotate: false + xy: 1433, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-hotrock-tiny + rotate: false + xy: 1491, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-hotrock-xlarge + rotate: false + xy: 101, 478 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ice-large + rotate: false + xy: 561, 156 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-medium + rotate: false + xy: 1017, 608 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-small + rotate: false + xy: 1459, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-snow-large + rotate: false + xy: 561, 114 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-snow-medium + rotate: false + xy: 1017, 574 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-small + rotate: false + xy: 1485, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-snow-tiny + rotate: false + xy: 1177, 199 + 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: 1491, 524 + 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: 561, 72 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-icerocks-medium + rotate: false + xy: 1037, 676 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-icerocks-small + rotate: false + xy: 1511, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-icerocks-tiny + rotate: false + xy: 1509, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-icerocks-xlarge + rotate: false + xy: 101, 328 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ignarock-large + rotate: false + xy: 561, 30 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ignarock-medium + rotate: false + xy: 1045, 710 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ignarock-small + rotate: false + xy: 1537, 768 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ignarock-tiny + rotate: false + xy: 1177, 181 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ignarock-xlarge + rotate: false + xy: 101, 278 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-illuminator-large + rotate: false + xy: 611, 290 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-illuminator-medium + rotate: false + xy: 1051, 642 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-illuminator-small + rotate: false + xy: 1563, 763 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-illuminator-tiny + rotate: false + xy: 1509, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-illuminator-xlarge + rotate: false + xy: 101, 228 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-impact-reactor-large + rotate: false + xy: 603, 248 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-impact-reactor-medium + rotate: false + xy: 1051, 608 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-impact-reactor-small + rotate: false + xy: 1087, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-impact-reactor-tiny + rotate: false + xy: 1177, 163 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-impact-reactor-xlarge + rotate: false + xy: 101, 178 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-incinerator-large + rotate: false + xy: 603, 206 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-incinerator-medium + rotate: false + xy: 1051, 574 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-incinerator-small + rotate: false + xy: 1113, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-incinerator-tiny + rotate: false + xy: 1177, 145 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-incinerator-xlarge + rotate: false + xy: 101, 128 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-inverted-sorter-large + rotate: false + xy: 603, 164 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-inverted-sorter-medium + rotate: false + xy: 1071, 676 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-inverted-sorter-small + rotate: false + xy: 1139, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-inverted-sorter-tiny + rotate: false + xy: 1177, 127 + 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: 603, 122 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-item-source-medium + rotate: false + xy: 1085, 642 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-source-small + rotate: false + xy: 1165, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-item-source-tiny + rotate: false + xy: 1177, 109 + 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: 603, 80 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-item-void-medium + rotate: false + xy: 1085, 608 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-void-small + rotate: false + xy: 1191, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-item-void-tiny + rotate: false + xy: 1177, 91 + 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: 603, 38 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-junction-medium + rotate: false + xy: 1085, 574 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-junction-small + rotate: false + xy: 1217, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-junction-tiny + rotate: false + xy: 1177, 73 + 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: 661, 340 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-kiln-medium + rotate: false + xy: 2013, 839 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-kiln-small + rotate: false + xy: 1243, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-kiln-tiny + rotate: false + xy: 1177, 55 + 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: 653, 298 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-lancer-medium + rotate: false + xy: 1579, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-lancer-small + rotate: false + xy: 1269, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-lancer-tiny + rotate: false + xy: 1177, 37 + 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-large-overdrive-projector-large + rotate: false + xy: 711, 390 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-large-overdrive-projector-medium + rotate: false + xy: 1613, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-large-overdrive-projector-small + rotate: false + xy: 1295, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-large-overdrive-projector-tiny + rotate: false + xy: 667, 2 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-large-overdrive-projector-xlarge + rotate: false + xy: 151, 458 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-laser-drill-large + rotate: false + xy: 703, 348 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-laser-drill-medium + rotate: false + xy: 1647, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-laser-drill-small + rotate: false + xy: 1321, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-laser-drill-tiny + rotate: false + xy: 1527, 542 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-laser-drill-xlarge + rotate: false + xy: 201, 508 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-launch-pad-large + rotate: false + xy: 761, 440 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-large + rotate: false + xy: 753, 398 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-medium + rotate: false + xy: 1681, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-launch-pad-large-small + rotate: false + xy: 1347, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-launch-pad-large-tiny + rotate: false + xy: 1527, 524 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-launch-pad-large-xlarge + rotate: false + xy: 151, 408 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-launch-pad-medium + rotate: false + xy: 1715, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-launch-pad-small + rotate: false + xy: 1373, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-launch-pad-tiny + rotate: false + xy: 1561, 599 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-launch-pad-xlarge + rotate: false + xy: 201, 458 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-junction-large + rotate: false + xy: 645, 248 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-junction-medium + rotate: false + xy: 1749, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-junction-small + rotate: false + xy: 1399, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-junction-tiny + rotate: false + xy: 1541, 571 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-junction-xlarge + rotate: false + xy: 151, 358 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-router-large + rotate: false + xy: 645, 206 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-router-medium + rotate: false + xy: 1783, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-router-small + rotate: false + xy: 1425, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-router-tiny + rotate: false + xy: 435, 4 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-router-xlarge + rotate: false + xy: 201, 408 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-source-large + rotate: false + xy: 645, 164 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-source-medium + rotate: false + xy: 1817, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-source-small + rotate: false + xy: 1451, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-source-tiny + rotate: false + xy: 453, 4 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-source-xlarge + rotate: false + xy: 151, 308 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-tank-large + rotate: false + xy: 645, 122 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-tank-medium + rotate: false + xy: 1851, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-tank-small + rotate: false + xy: 1477, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-tank-tiny + rotate: false + xy: 471, 4 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-tank-xlarge + rotate: false + xy: 201, 358 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-void-large + rotate: false + xy: 645, 80 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-void-medium + rotate: false + xy: 1885, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-void-small + rotate: false + xy: 1503, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-void-tiny + rotate: false + xy: 489, 4 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-void-xlarge + rotate: false + xy: 151, 258 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-magmarock-large + rotate: false + xy: 645, 38 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-magmarock-medium + rotate: false + xy: 1919, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-magmarock-small + rotate: false + xy: 1529, 742 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-magmarock-tiny + rotate: false + xy: 855, 2 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-magmarock-xlarge + rotate: false + xy: 201, 308 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mass-conveyor-large + rotate: false + xy: 695, 298 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mass-conveyor-medium + rotate: false + xy: 1953, 823 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mass-conveyor-small + rotate: false + xy: 1079, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mass-conveyor-tiny + rotate: false + xy: 873, 2 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mass-conveyor-xlarge + rotate: false + xy: 151, 208 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mass-driver-large + rotate: false + xy: 687, 256 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mass-driver-medium + rotate: false + xy: 769, 510 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mass-driver-small + rotate: false + xy: 1105, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mass-driver-tiny + rotate: false + xy: 891, 2 + 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: 687, 214 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mechanical-drill-medium + rotate: false + xy: 803, 510 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mechanical-drill-small + rotate: false + xy: 1131, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mechanical-drill-tiny + rotate: false + xy: 909, 2 + 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: 687, 172 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mechanical-pump-medium + rotate: false + xy: 837, 510 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mechanical-pump-small + rotate: false + xy: 1157, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mechanical-pump-tiny + rotate: false + xy: 1581, 745 + 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: 687, 130 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-meltdown-medium + rotate: false + xy: 871, 503 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-meltdown-small + rotate: false + xy: 1183, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-meltdown-tiny + rotate: false + xy: 1195, 505 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-meltdown-xlarge + rotate: false + xy: 151, 108 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-melter-large + rotate: false + xy: 687, 88 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-melter-medium + rotate: false + xy: 905, 503 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-melter-small + rotate: false + xy: 1209, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-melter-tiny + rotate: false + xy: 1195, 487 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-melter-xlarge + rotate: false + xy: 201, 158 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mend-projector-large + rotate: false + xy: 687, 46 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mend-projector-medium + rotate: false + xy: 939, 503 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mend-projector-small + rotate: false + xy: 1235, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mend-projector-tiny + rotate: false + xy: 1195, 469 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mend-projector-xlarge + rotate: false + xy: 151, 58 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mender-large + rotate: false + xy: 745, 348 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mender-medium + rotate: false + xy: 973, 503 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mender-small + rotate: false + xy: 1261, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mender-tiny + rotate: false + xy: 1195, 451 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mender-xlarge + rotate: false + xy: 201, 108 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-message-large + rotate: false + xy: 737, 306 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-message-medium + rotate: false + xy: 1007, 503 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-message-small + rotate: false + xy: 1287, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-message-tiny + rotate: false + xy: 1195, 433 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-message-xlarge + rotate: false + xy: 201, 58 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-2-large + rotate: false + xy: 795, 398 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-2-medium + rotate: false + xy: 1015, 537 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-2-small + rotate: false + xy: 1313, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-2-tiny + rotate: false + xy: 1195, 415 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-2-xlarge + rotate: false + xy: 251, 508 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-3-large + rotate: false + xy: 787, 356 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-3-medium + rotate: false + xy: 1049, 540 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-3-small + rotate: false + xy: 1339, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-3-tiny + rotate: false + xy: 1195, 397 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-3-xlarge + rotate: false + xy: 251, 458 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-5-large + rotate: false + xy: 729, 256 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-5-medium + rotate: false + xy: 1083, 540 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-5-small + rotate: false + xy: 1365, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-5-tiny + rotate: false + xy: 1195, 379 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-5-xlarge + rotate: false + xy: 251, 408 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-large + rotate: false + xy: 729, 214 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-medium + rotate: false + xy: 1041, 503 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-small + rotate: false + xy: 1391, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-tiny + rotate: false + xy: 1195, 361 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-xlarge + rotate: false + xy: 251, 358 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-large + rotate: false + xy: 729, 172 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-medium + rotate: false + xy: 1075, 506 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-small + rotate: false + xy: 1417, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-tiny + rotate: false + xy: 1195, 343 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-xlarge + rotate: false + xy: 251, 308 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-moss-large + rotate: false + xy: 729, 130 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-moss-medium + rotate: false + xy: 1109, 506 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-moss-small + rotate: false + xy: 1443, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-moss-tiny + rotate: false + xy: 1195, 325 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-moss-xlarge + rotate: false + xy: 251, 258 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-multi-press-large + rotate: false + xy: 729, 88 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-multi-press-medium + rotate: false + xy: 1117, 540 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-multi-press-small + rotate: false + xy: 1469, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-multi-press-tiny + rotate: false + xy: 1195, 307 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-multi-press-xlarge + rotate: false + xy: 251, 208 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-large + rotate: false + xy: 729, 46 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-medium + rotate: false + xy: 1143, 506 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-small + rotate: false + xy: 1495, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-tiny + rotate: false + xy: 1195, 289 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-xlarge + rotate: false + xy: 251, 158 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-naval-factory-large + rotate: false + xy: 687, 4 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-naval-factory-medium + rotate: false + xy: 837, 476 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-naval-factory-small + rotate: false + xy: 1521, 716 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-naval-factory-tiny + rotate: false + xy: 1195, 271 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-naval-factory-xlarge + rotate: false + xy: 251, 108 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-oil-extractor-large + rotate: false + xy: 729, 4 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-oil-extractor-medium + rotate: false + xy: 803, 476 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-oil-extractor-small + rotate: false + xy: 1105, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-oil-extractor-tiny + rotate: false + xy: 1195, 253 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-oil-extractor-xlarge + rotate: false + xy: 251, 58 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ore-coal-large + rotate: false + xy: 779, 306 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-coal-medium + rotate: false + xy: 803, 442 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-coal-small + rotate: false + xy: 1131, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-coal-tiny + rotate: false + xy: 1195, 235 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-coal-xlarge + rotate: false + xy: 151, 8 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ore-copper-large + rotate: false + xy: 771, 264 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-copper-medium + rotate: false + xy: 837, 442 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-copper-small + rotate: false + xy: 1157, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-copper-tiny + rotate: false + xy: 1195, 217 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-copper-xlarge + rotate: false + xy: 201, 8 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ore-lead-large + rotate: false + xy: 771, 222 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-lead-medium + rotate: false + xy: 871, 469 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-lead-small + rotate: false + xy: 1183, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-lead-tiny + rotate: false + xy: 1195, 199 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-lead-xlarge + rotate: false + xy: 251, 8 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ore-scrap-large + rotate: false + xy: 771, 180 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-scrap-medium + rotate: false + xy: 905, 469 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-scrap-small + rotate: false + xy: 1209, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-scrap-tiny + rotate: false + xy: 1195, 181 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-scrap-xlarge + rotate: false + xy: 281, 619 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ore-thorium-large + rotate: false + xy: 771, 138 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-thorium-medium + rotate: false + xy: 939, 469 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-thorium-small + rotate: false + xy: 1235, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-thorium-tiny + rotate: false + xy: 1195, 163 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-thorium-xlarge + rotate: false + xy: 281, 569 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ore-titanium-large + rotate: false + xy: 771, 96 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-titanium-medium + rotate: false + xy: 973, 469 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-titanium-small + rotate: false + xy: 1261, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-titanium-tiny + rotate: false + xy: 1195, 145 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-titanium-xlarge + rotate: false + xy: 301, 519 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-overdrive-projector-large + rotate: false + xy: 771, 54 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-overdrive-projector-medium + rotate: false + xy: 1007, 469 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-overdrive-projector-small + rotate: false + xy: 1287, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-overdrive-projector-tiny + rotate: false + xy: 1195, 127 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-overdrive-projector-xlarge + rotate: false + xy: 301, 469 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-overflow-gate-large + rotate: false + xy: 771, 12 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-overflow-gate-medium + rotate: false + xy: 1041, 469 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-overflow-gate-small + rotate: false + xy: 1313, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-overflow-gate-tiny + rotate: false + xy: 1195, 109 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-overflow-gate-xlarge + rotate: false + xy: 301, 419 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-payload-router-large + rotate: false + xy: 829, 356 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-payload-router-medium + rotate: false + xy: 1075, 472 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-payload-router-small + rotate: false + xy: 1339, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-payload-router-tiny + rotate: false + xy: 1195, 91 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-payload-router-xlarge + rotate: false + xy: 301, 369 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pebbles-large + rotate: false + xy: 821, 314 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pebbles-medium + rotate: false + xy: 1109, 472 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pebbles-small + rotate: false + xy: 1365, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pebbles-tiny + rotate: false + xy: 1195, 73 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pebbles-xlarge + rotate: false + xy: 301, 319 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-conduit-large + rotate: false + xy: 813, 264 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-conduit-medium + rotate: false + xy: 1143, 472 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conduit-small + rotate: false + xy: 1391, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-conduit-tiny + rotate: false + xy: 1195, 55 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-conduit-xlarge + rotate: false + xy: 301, 269 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-conveyor-large + rotate: false + xy: 813, 222 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-conveyor-medium + rotate: false + xy: 837, 408 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conveyor-small + rotate: false + xy: 1417, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-conveyor-tiny + rotate: false + xy: 1195, 37 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-conveyor-xlarge + rotate: false + xy: 301, 219 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-wall-large + rotate: false + xy: 813, 180 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-large + rotate: false + xy: 813, 138 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-medium + rotate: false + xy: 871, 435 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-large-small + rotate: false + xy: 1443, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-wall-large-tiny + rotate: false + xy: 1213, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-wall-large-xlarge + rotate: false + xy: 301, 169 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-wall-medium + rotate: false + xy: 905, 435 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-small + rotate: false + xy: 1469, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-wall-tiny + rotate: false + xy: 1213, 488 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-wall-xlarge + rotate: false + xy: 301, 119 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-weaver-large + rotate: false + xy: 813, 96 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-weaver-medium + rotate: false + xy: 939, 435 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-weaver-small + rotate: false + xy: 1495, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-weaver-tiny + rotate: false + xy: 1231, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-weaver-xlarge + rotate: false + xy: 301, 69 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pine-large + rotate: false + xy: 813, 54 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pine-medium + rotate: false + xy: 973, 435 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pine-small + rotate: false + xy: 1521, 690 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pine-tiny + rotate: false + xy: 1213, 470 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pine-xlarge + rotate: false + xy: 301, 19 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-compressor-large + rotate: false + xy: 813, 12 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-compressor-medium + rotate: false + xy: 1007, 435 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-compressor-small + rotate: false + xy: 1555, 737 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-compressor-tiny + rotate: false + xy: 1231, 488 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-compressor-xlarge + rotate: false + xy: 795, 878 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-conveyor-large + rotate: false + xy: 863, 314 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-conveyor-medium + rotate: false + xy: 1041, 435 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-conveyor-small + rotate: false + xy: 1547, 711 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-conveyor-tiny + rotate: false + xy: 1249, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-conveyor-xlarge + rotate: false + xy: 309, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-wall-large + rotate: false + xy: 855, 272 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-large + rotate: false + xy: 855, 230 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-medium + rotate: false + xy: 1075, 438 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-small + rotate: false + xy: 1547, 685 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-tiny + rotate: false + xy: 1213, 452 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-wall-large-xlarge + rotate: false + xy: 309, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-wall-medium + rotate: false + xy: 1109, 438 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-wall-small + rotate: false + xy: 1119, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-wall-tiny + rotate: false + xy: 1231, 470 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-wall-xlarge + rotate: false + xy: 359, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plated-conduit-large + rotate: false + xy: 855, 188 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plated-conduit-medium + rotate: false + xy: 1143, 438 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plated-conduit-small + rotate: false + xy: 1119, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plated-conduit-tiny + rotate: false + xy: 1249, 488 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plated-conduit-xlarge + rotate: false + xy: 309, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pneumatic-drill-large + rotate: false + xy: 855, 146 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pneumatic-drill-medium + rotate: false + xy: 871, 401 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pneumatic-drill-small + rotate: false + xy: 1145, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pneumatic-drill-tiny + rotate: false + xy: 1267, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pneumatic-drill-xlarge + rotate: false + xy: 359, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-large + rotate: false + xy: 855, 104 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-large + rotate: false + xy: 855, 62 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-medium + rotate: false + xy: 905, 401 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-large-small + rotate: false + xy: 1119, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-large-tiny + rotate: false + xy: 1213, 434 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-large-xlarge + rotate: false + xy: 409, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-medium + rotate: false + xy: 939, 401 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-small + rotate: false + xy: 1171, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-tiny + rotate: false + xy: 1231, 452 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-xlarge + rotate: false + xy: 359, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-source-large + rotate: false + xy: 855, 20 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-source-medium + rotate: false + xy: 973, 401 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-source-small + rotate: false + xy: 1145, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-source-tiny + rotate: false + xy: 1249, 470 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-source-xlarge + rotate: false + xy: 409, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-void-large + rotate: false + xy: 897, 272 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-void-medium + rotate: false + xy: 1007, 401 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-void-small + rotate: false + xy: 1119, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-void-tiny + rotate: false + xy: 1267, 488 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-void-xlarge + rotate: false + xy: 459, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pulse-conduit-large + rotate: false + xy: 897, 230 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pulse-conduit-medium + rotate: false + xy: 1041, 401 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulse-conduit-small + rotate: false + xy: 1197, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pulse-conduit-tiny + rotate: false + xy: 1285, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pulse-conduit-xlarge + rotate: false + xy: 409, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pulverizer-large + rotate: false + xy: 897, 188 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pulverizer-medium + rotate: false + xy: 1075, 404 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-small + rotate: false + xy: 1171, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pulverizer-tiny + rotate: false + xy: 1213, 416 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pulverizer-xlarge + rotate: false + xy: 459, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pyratite-mixer-large + rotate: false + xy: 897, 146 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pyratite-mixer-medium + rotate: false + xy: 1109, 404 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pyratite-mixer-small + rotate: false + xy: 1145, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pyratite-mixer-tiny + rotate: false + xy: 1231, 434 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pyratite-mixer-xlarge + rotate: false + xy: 509, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-repair-point-large + rotate: false + xy: 897, 104 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-repair-point-medium + rotate: false + xy: 1143, 404 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-repair-point-small + rotate: false + xy: 1223, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-repair-point-tiny + rotate: false + xy: 1249, 452 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-repair-point-xlarge + rotate: false + xy: 459, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-resupply-point-large + rotate: false + xy: 897, 62 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-resupply-point-medium + rotate: false + xy: 871, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-resupply-point-small + rotate: false + xy: 1197, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-resupply-point-tiny + rotate: false + xy: 1267, 470 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-resupply-point-xlarge + rotate: false + xy: 509, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ripple-large + rotate: false + xy: 897, 20 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ripple-medium + rotate: false + xy: 905, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ripple-small + rotate: false + xy: 1171, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ripple-tiny + rotate: false + xy: 1285, 488 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ripple-xlarge + rotate: false + xy: 559, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rock-large + rotate: false + xy: 821, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rock-medium + rotate: false + xy: 939, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rock-small + rotate: false + xy: 1145, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rock-tiny + rotate: false + xy: 1303, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rock-xlarge + rotate: false + xy: 509, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rocks-large + rotate: false + xy: 863, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rocks-medium + rotate: false + xy: 973, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rocks-small + rotate: false + xy: 1249, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rocks-tiny + rotate: false + xy: 1213, 398 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rocks-xlarge + rotate: false + xy: 559, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rotary-pump-large + rotate: false + xy: 905, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rotary-pump-medium + rotate: false + xy: 1007, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rotary-pump-small + rotate: false + xy: 1223, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rotary-pump-tiny + rotate: false + xy: 1231, 416 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rotary-pump-xlarge + rotate: false + xy: 609, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-router-large + rotate: false + xy: 947, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-router-medium + rotate: false + xy: 1041, 367 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-router-small + rotate: false + xy: 1197, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-router-tiny + rotate: false + xy: 1249, 434 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-router-xlarge + rotate: false + xy: 559, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rtg-generator-large + rotate: false + xy: 989, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rtg-generator-medium + rotate: false + xy: 1075, 370 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rtg-generator-small + rotate: false + xy: 1171, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rtg-generator-tiny + rotate: false + xy: 1267, 452 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rtg-generator-xlarge + rotate: false + xy: 609, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salt-large + rotate: false + xy: 1031, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salt-medium + rotate: false + xy: 1109, 370 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-small + rotate: false + xy: 1275, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salt-tiny + rotate: false + xy: 1285, 470 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salt-xlarge + rotate: false + xy: 659, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-saltrocks-large + rotate: false + xy: 1073, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-saltrocks-medium + rotate: false + xy: 1143, 370 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-saltrocks-small + rotate: false + xy: 1249, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-saltrocks-tiny + rotate: false + xy: 1303, 488 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-saltrocks-xlarge + rotate: false + xy: 609, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salvo-large + rotate: false + xy: 1115, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salvo-medium + rotate: false + xy: 905, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-small + rotate: false + xy: 1223, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salvo-tiny + rotate: false + xy: 1321, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salvo-xlarge + rotate: false + xy: 659, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-boulder-large + rotate: false + xy: 1157, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-boulder-medium + rotate: false + xy: 939, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-boulder-small + rotate: false + xy: 1197, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-boulder-tiny + rotate: false + xy: 1213, 380 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-boulder-xlarge + rotate: false + xy: 709, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-large + rotate: false + xy: 1199, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-medium + rotate: false + xy: 973, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-small + rotate: false + xy: 1301, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-tiny + rotate: false + xy: 1231, 398 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-water-large + rotate: false + xy: 1241, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-water-medium + rotate: false + xy: 1007, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-water-small + rotate: false + xy: 1275, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-water-tiny + rotate: false + xy: 1249, 416 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-water-xlarge + rotate: false + xy: 659, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-xlarge + rotate: false + xy: 709, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sandrocks-large + rotate: false + xy: 1283, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sandrocks-medium + rotate: false + xy: 1041, 333 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sandrocks-small + rotate: false + xy: 1249, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sandrocks-tiny + rotate: false + xy: 1267, 434 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sandrocks-xlarge + rotate: false + xy: 709, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scatter-large + rotate: false + xy: 1325, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scatter-medium + rotate: false + xy: 1075, 336 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scatter-small + rotate: false + xy: 1223, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scatter-tiny + rotate: false + xy: 1285, 452 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scatter-xlarge + rotate: false + xy: 759, 816 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scorch-large + rotate: false + xy: 1367, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scorch-medium + rotate: false + xy: 1109, 336 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scorch-small + rotate: false + xy: 1327, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scorch-tiny + rotate: false + xy: 1303, 470 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scorch-xlarge + rotate: false + xy: 759, 766 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-large + rotate: false + xy: 1409, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-medium + rotate: false + xy: 1143, 336 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-small + rotate: false + xy: 1301, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-tiny + rotate: false + xy: 1321, 488 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-xlarge + rotate: false + xy: 759, 716 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-large + rotate: false + xy: 1451, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-medium + rotate: false + xy: 939, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-small + rotate: false + xy: 1275, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-tiny + rotate: false + xy: 1339, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-xlarge + rotate: false + xy: 809, 828 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-large + rotate: false + xy: 1493, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-large + rotate: false + xy: 1535, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-medium + rotate: false + xy: 939, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-large-small + rotate: false + xy: 1249, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-large-tiny + rotate: false + xy: 1213, 362 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-large-xlarge + rotate: false + xy: 809, 778 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-medium + rotate: false + xy: 973, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-small + rotate: false + xy: 1353, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-tiny + rotate: false + xy: 1231, 380 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-xlarge + rotate: false + xy: 809, 728 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-segment-large + rotate: false + xy: 1577, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-segment-medium + rotate: false + xy: 939, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-segment-small + rotate: false + xy: 1327, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-segment-tiny + rotate: false + xy: 1249, 398 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-segment-xlarge + rotate: false + xy: 809, 678 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-separator-large + rotate: false + xy: 1619, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-separator-medium + rotate: false + xy: 973, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-separator-small + rotate: false + xy: 1301, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-separator-tiny + rotate: false + xy: 1267, 416 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-separator-xlarge + rotate: false + xy: 331, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-boulder-large + rotate: false + xy: 1661, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-boulder-medium + rotate: false + xy: 1007, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-boulder-small + rotate: false + xy: 1275, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-boulder-tiny + rotate: false + xy: 1285, 434 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-boulder-xlarge + rotate: false + xy: 331, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-large + rotate: false + xy: 1703, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-medium + rotate: false + xy: 939, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-small + rotate: false + xy: 1379, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-tiny + rotate: false + xy: 1303, 452 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-xlarge + rotate: false + xy: 381, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shalerocks-large + rotate: false + xy: 1745, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shalerocks-medium + rotate: false + xy: 973, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shalerocks-small + rotate: false + xy: 1353, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shalerocks-tiny + rotate: false + xy: 1321, 470 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shalerocks-xlarge + rotate: false + xy: 381, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shock-mine-large + rotate: false + xy: 1787, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shock-mine-medium + rotate: false + xy: 1007, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shock-mine-small + rotate: false + xy: 1327, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shock-mine-tiny + rotate: false + xy: 1339, 488 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shock-mine-xlarge + rotate: false + xy: 431, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shrubs-large + rotate: false + xy: 1829, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shrubs-medium + rotate: false + xy: 1041, 299 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-small + rotate: false + xy: 1301, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shrubs-tiny + rotate: false + xy: 1357, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shrubs-xlarge + rotate: false + xy: 431, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-silicon-crucible-large + rotate: false + xy: 1871, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-silicon-crucible-medium + rotate: false + xy: 1075, 302 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-silicon-crucible-small + rotate: false + xy: 1405, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-silicon-crucible-tiny + rotate: false + xy: 1213, 344 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-silicon-crucible-xlarge + rotate: false + xy: 481, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-silicon-smelter-large + rotate: false + xy: 1913, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-silicon-smelter-medium + rotate: false + xy: 939, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-silicon-smelter-small + rotate: false + xy: 1379, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-silicon-smelter-tiny + rotate: false + xy: 1231, 362 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-silicon-smelter-xlarge + rotate: false + xy: 481, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-slag-large + rotate: false + xy: 1955, 933 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-slag-medium + rotate: false + xy: 973, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-slag-small + rotate: false + xy: 1353, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-slag-tiny + rotate: false + xy: 1249, 380 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-slag-xlarge + rotate: false + xy: 531, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-large + rotate: false + xy: 845, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-medium + rotate: false + xy: 1007, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-large + rotate: false + xy: 887, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-pine-medium + rotate: false + xy: 1041, 265 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-small + rotate: false + xy: 1327, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-pine-tiny + rotate: false + xy: 1267, 398 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-pine-xlarge + rotate: false + xy: 531, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-small + rotate: false + xy: 1431, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-tiny + rotate: false + xy: 1285, 416 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-xlarge + rotate: false + xy: 581, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snowrock-large + rotate: false + xy: 929, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snowrock-medium + rotate: false + xy: 1075, 268 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snowrock-small + rotate: false + xy: 1405, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snowrock-tiny + rotate: false + xy: 1303, 434 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snowrock-xlarge + rotate: false + xy: 581, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snowrocks-large + rotate: false + xy: 971, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snowrocks-medium + rotate: false + xy: 1109, 302 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snowrocks-small + rotate: false + xy: 1379, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snowrocks-tiny + rotate: false + xy: 1321, 452 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snowrocks-xlarge + rotate: false + xy: 631, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-solar-panel-large + rotate: false + xy: 1013, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-large + rotate: false + xy: 1055, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-medium + rotate: false + xy: 939, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-large-small + rotate: false + xy: 1353, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-solar-panel-large-tiny + rotate: false + xy: 1339, 470 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-solar-panel-large-xlarge + rotate: false + xy: 631, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-solar-panel-medium + rotate: false + xy: 973, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-small + rotate: false + xy: 1457, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-solar-panel-tiny + rotate: false + xy: 1357, 488 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-solar-panel-xlarge + rotate: false + xy: 681, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sorter-large + rotate: false + xy: 1097, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sorter-medium + rotate: false + xy: 1007, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sorter-small + rotate: false + xy: 1431, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sorter-tiny + rotate: false + xy: 1375, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sorter-xlarge + rotate: false + xy: 681, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spawn-large + rotate: false + xy: 1139, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spawn-medium + rotate: false + xy: 1041, 231 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spawn-small + rotate: false + xy: 1405, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spawn-tiny + rotate: false + xy: 1213, 326 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spawn-xlarge + rotate: false + xy: 731, 666 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spectre-large + rotate: false + xy: 1181, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spectre-medium + rotate: false + xy: 1075, 234 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spectre-small + rotate: false + xy: 1379, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spectre-tiny + rotate: false + xy: 1231, 344 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spectre-xlarge + rotate: false + xy: 731, 616 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-cluster-large + rotate: false + xy: 1223, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-cluster-medium + rotate: false + xy: 1109, 268 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-cluster-small + rotate: false + xy: 1483, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-cluster-tiny + rotate: false + xy: 1249, 362 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-cluster-xlarge + rotate: false + xy: 781, 628 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-moss-large + rotate: false + xy: 1265, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-medium + rotate: false + xy: 1143, 302 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-moss-small + rotate: false + xy: 1457, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-moss-tiny + rotate: false + xy: 1267, 380 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-moss-xlarge + rotate: false + xy: 831, 628 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-pine-large + rotate: false + xy: 1307, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-pine-medium + rotate: false + xy: 939, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-pine-small + rotate: false + xy: 1431, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-pine-tiny + rotate: false + xy: 1285, 398 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-pine-xlarge + rotate: false + xy: 781, 578 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-press-large + rotate: false + xy: 1349, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-press-medium + rotate: false + xy: 973, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-press-small + rotate: false + xy: 1405, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-press-tiny + rotate: false + xy: 1303, 416 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-press-xlarge + rotate: false + xy: 831, 578 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sporerocks-large + rotate: false + xy: 1391, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sporerocks-medium + rotate: false + xy: 1007, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sporerocks-small + rotate: false + xy: 1509, 664 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sporerocks-tiny + rotate: false + xy: 1321, 434 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sporerocks-xlarge + rotate: false + xy: 351, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-stone-large + rotate: false + xy: 1433, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-medium + rotate: false + xy: 1041, 197 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-small + rotate: false + xy: 1483, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-tiny + rotate: false + xy: 1339, 452 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-xlarge + rotate: false + xy: 351, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-tower-large + rotate: false + xy: 1475, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-tower-medium + rotate: false + xy: 1075, 200 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-tower-small + rotate: false + xy: 1457, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-tower-tiny + rotate: false + xy: 1357, 470 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-tower-xlarge + rotate: false + xy: 401, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-large + rotate: false + xy: 1517, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-large + rotate: false + xy: 1559, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-medium + rotate: false + xy: 1109, 234 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-large-small + rotate: false + xy: 1431, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-large-tiny + rotate: false + xy: 1375, 488 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-large-xlarge + rotate: false + xy: 351, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-medium + rotate: false + xy: 1143, 268 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-small + rotate: false + xy: 1509, 638 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-tiny + rotate: false + xy: 1393, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-xlarge + rotate: false + xy: 401, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-swarmer-large + rotate: false + xy: 1601, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-swarmer-medium + rotate: false + xy: 939, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-swarmer-small + rotate: false + xy: 1483, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-swarmer-tiny + rotate: false + xy: 1213, 308 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-swarmer-xlarge + rotate: false + xy: 451, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tainted-water-large + rotate: false + xy: 1643, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tainted-water-medium + rotate: false + xy: 973, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tainted-water-small + rotate: false + xy: 1457, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tainted-water-tiny + rotate: false + xy: 1231, 326 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tainted-water-xlarge + rotate: false + xy: 351, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tar-large + rotate: false + xy: 1685, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tar-medium + rotate: false + xy: 1007, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tar-small + rotate: false + xy: 1509, 612 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tar-tiny + rotate: false + xy: 1249, 344 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tar-xlarge + rotate: false + xy: 401, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tendrils-large + rotate: false + xy: 1727, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tendrils-medium + rotate: false + xy: 1041, 163 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tendrils-small + rotate: false + xy: 1483, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tendrils-tiny + rotate: false + xy: 1267, 362 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tendrils-xlarge + rotate: false + xy: 451, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-large + rotate: false + xy: 1769, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-medium + rotate: false + xy: 1075, 166 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-small + rotate: false + xy: 1509, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-tiny + rotate: false + xy: 1285, 380 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-xlarge + rotate: false + xy: 501, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-generator-large + rotate: false + xy: 1811, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-generator-medium + rotate: false + xy: 1109, 200 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-generator-small + rotate: false + xy: 1151, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-generator-tiny + rotate: false + xy: 1303, 398 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-generator-xlarge + rotate: false + xy: 351, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-pump-large + rotate: false + xy: 1853, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-pump-medium + rotate: false + xy: 1143, 234 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-pump-small + rotate: false + xy: 1177, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-pump-tiny + rotate: false + xy: 1321, 416 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-pump-xlarge + rotate: false + xy: 401, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-reactor-large + rotate: false + xy: 1895, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-reactor-medium + rotate: false + xy: 939, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-reactor-small + rotate: false + xy: 1203, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-reactor-tiny + rotate: false + xy: 1339, 434 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-reactor-xlarge + rotate: false + xy: 451, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-large + rotate: false + xy: 1937, 891 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-large + rotate: false + xy: 859, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-medium + rotate: false + xy: 973, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-large-small + rotate: false + xy: 1229, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-large-tiny + rotate: false + xy: 1357, 452 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-large-xlarge + rotate: false + xy: 501, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-medium + rotate: false + xy: 1007, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-small + rotate: false + xy: 1255, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-tiny + rotate: false + xy: 1375, 470 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-xlarge + rotate: false + xy: 551, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thruster-large + rotate: false + xy: 859, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thruster-medium + rotate: false + xy: 1041, 129 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thruster-small + rotate: false + xy: 1281, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thruster-tiny + rotate: false + xy: 1393, 488 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thruster-xlarge + rotate: false + xy: 351, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-conveyor-large + rotate: false + xy: 901, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-conveyor-medium + rotate: false + xy: 1075, 132 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-conveyor-small + rotate: false + xy: 1307, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-conveyor-tiny + rotate: false + xy: 1411, 506 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-conveyor-xlarge + rotate: false + xy: 401, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-large + rotate: false + xy: 859, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-large + rotate: false + xy: 943, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-medium + rotate: false + xy: 1109, 166 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-large-small + rotate: false + xy: 1333, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-large-tiny + rotate: false + xy: 1213, 290 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-large-xlarge + rotate: false + xy: 451, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-medium + rotate: false + xy: 1143, 200 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-small + rotate: false + xy: 1359, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-tiny + rotate: false + xy: 1231, 308 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-xlarge + rotate: false + xy: 501, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-turbine-generator-large + rotate: false + xy: 901, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-turbine-generator-medium + rotate: false + xy: 973, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-turbine-generator-small + rotate: false + xy: 1385, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-turbine-generator-tiny + rotate: false + xy: 1249, 326 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-turbine-generator-xlarge + rotate: false + xy: 551, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-underflow-gate-large + rotate: false + xy: 859, 723 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-underflow-gate-medium + rotate: false + xy: 1007, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-underflow-gate-small + rotate: false + xy: 1411, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-underflow-gate-tiny + rotate: false + xy: 1267, 344 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-underflow-gate-xlarge + rotate: false + xy: 601, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-unloader-large + rotate: false + xy: 985, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-unloader-medium + rotate: false + xy: 1041, 95 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-unloader-small + rotate: false + xy: 1437, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-unloader-tiny + rotate: false + xy: 1285, 362 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-unloader-xlarge + rotate: false + xy: 351, 266 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-vault-large + rotate: false + xy: 943, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-vault-medium + rotate: false + xy: 1075, 98 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-vault-small + rotate: false + xy: 1463, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-vault-tiny + rotate: false + xy: 1303, 380 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-vault-xlarge + rotate: false + xy: 401, 316 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-extractor-large + rotate: false + xy: 901, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-extractor-medium + rotate: false + xy: 1109, 132 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-extractor-small + rotate: false + xy: 1489, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-extractor-tiny + rotate: false + xy: 1321, 398 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-extractor-xlarge + rotate: false + xy: 451, 366 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-large + rotate: false + xy: 859, 681 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-medium + rotate: false + xy: 1143, 166 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-small + rotate: false + xy: 1515, 560 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-tiny + rotate: false + xy: 1339, 416 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-xlarge + rotate: false + xy: 501, 416 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wave-large + rotate: false + xy: 1027, 849 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wave-medium + rotate: false + xy: 1007, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wave-small + rotate: false + xy: 1535, 659 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wave-tiny + rotate: false + xy: 1357, 434 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wave-xlarge + rotate: false + xy: 551, 466 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-dead-large + rotate: false + xy: 985, 807 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-dead-medium + rotate: false + xy: 1041, 61 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-dead-small + rotate: false + xy: 1535, 633 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-dead-tiny + rotate: false + xy: 1375, 452 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-dead-xlarge + rotate: false + xy: 601, 516 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-large + rotate: false + xy: 943, 765 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-medium + rotate: false + xy: 1075, 64 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-small + rotate: false + xy: 1535, 607 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-tiny + rotate: false + xy: 1393, 470 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-xlarge + rotate: false + xy: 651, 566 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +button + rotate: false + xy: 1297, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-disabled + rotate: false + xy: 743, 587 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-down + rotate: false + xy: 519, 1 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-1 + rotate: false + xy: 557, 1 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-2 + rotate: false + xy: 595, 1 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-3 + rotate: false + xy: 901, 736 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-4 + rotate: false + xy: 939, 736 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-edge-over-4 + rotate: false + xy: 1069, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-over + rotate: false + xy: 1027, 820 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-red + rotate: false + xy: 985, 778 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right + rotate: false + xy: 1107, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-down + rotate: false + xy: 901, 707 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-right-over + rotate: false + xy: 939, 707 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-select + rotate: false + xy: 1561, 659 + size: 24, 24 + split: 4, 4, 4, 4 + orig: 24, 24 + offset: 0, 0 + index: -1 +button-square + rotate: false + xy: 1221, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-square-down + rotate: false + xy: 1145, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-square-over + rotate: false + xy: 1183, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +button-trans + rotate: false + xy: 1259, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +check-disabled + rotate: false + xy: 1109, 98 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-off + rotate: false + xy: 1143, 132 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-on + rotate: false + xy: 1041, 27 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-on-disabled + rotate: false + xy: 1075, 30 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-on-over + rotate: false + xy: 1109, 64 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +check-over + rotate: false + xy: 1143, 98 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +clear + rotate: false + xy: 771, 916 + size: 10, 10 + orig: 10, 10 + offset: 0, 0 + index: -1 +crater + rotate: false + xy: 131, 538 + size: 18, 18 + orig: 18, 18 + offset: 0, 0 + index: -1 +cursor + rotate: false + xy: 1987, 833 + size: 4, 4 + orig: 4, 4 + offset: 0, 0 + index: -1 +discord-banner + rotate: false + xy: 771, 978 + size: 84, 45 + orig: 84, 45 + offset: 0, 0 + index: -1 +flat-down-base + rotate: false + xy: 1335, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +info-banner + rotate: false + xy: 259, 869 + size: 84, 45 + orig: 84, 45 + offset: 0, 0 + index: -1 +inventory + rotate: false + xy: 1561, 617 + size: 24, 40 + split: 10, 10, 10, 14 + orig: 24, 40 + offset: 0, 0 + index: -1 +item-blast-compound-icon + rotate: false + xy: 1109, 30 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-coal-icon + rotate: false + xy: 1143, 64 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-copper-icon + rotate: false + xy: 1143, 30 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-graphite-icon + rotate: false + xy: 1061, 786 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-lead-icon + rotate: false + xy: 1053, 752 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-metaglass-icon + rotate: false + xy: 1095, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-phase-fabric-icon + rotate: false + xy: 1129, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-plastanium-icon + rotate: false + xy: 1163, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-pyratite-icon + rotate: false + xy: 1197, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-sand-icon + rotate: false + xy: 1231, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-scrap-icon + rotate: false + xy: 1265, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-silicon-icon + rotate: false + xy: 1299, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod-icon + rotate: false + xy: 1333, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-surge-alloy-icon + rotate: false + xy: 1367, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-thorium-icon + rotate: false + xy: 1401, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-titanium-icon + rotate: false + xy: 1435, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-cryofluid-icon + rotate: false + xy: 1469, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-oil-icon + rotate: false + xy: 1503, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-slag-icon + rotate: false + xy: 1537, 794 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-water-icon + rotate: false + xy: 1571, 789 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +logo + rotate: false + xy: 1, 916 + size: 768, 107 + orig: 768, 107 + offset: 0, 0 + index: -1 +nomap + rotate: false + xy: 1, 658 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +pane + rotate: false + xy: 1411, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +pane-2 + rotate: false + xy: 1373, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +scroll + rotate: false + xy: 1177, 523 + size: 24, 35 + split: 10, 10, 6, 5 + orig: 24, 35 + offset: 0, 0 + index: -1 +scroll-horizontal + rotate: false + xy: 43, 2 + size: 35, 24 + split: 6, 5, 10, 10 + orig: 35, 24 + offset: 0, 0 + index: -1 +scroll-knob-horizontal-black + rotate: false + xy: 1, 2 + size: 40, 24 + orig: 40, 24 + offset: 0, 0 + index: -1 +scroll-knob-vertical-black + rotate: false + xy: 1573, 695 + size: 24, 40 + orig: 24, 40 + offset: 0, 0 + index: -1 +scroll-knob-vertical-thin + rotate: false + xy: 1213, 248 + size: 12, 40 + orig: 12, 40 + offset: 0, 0 + index: -1 +selection + rotate: false + xy: 821, 975 + size: 1, 1 + orig: 1, 1 + offset: 0, 0 + index: -1 +slider + rotate: false + xy: 837, 398 + size: 1, 8 + orig: 1, 8 + offset: 0, 0 + index: -1 +slider-knob + rotate: false + xy: 1605, 783 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-knob-down + rotate: false + xy: 1636, 783 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-knob-over + rotate: false + xy: 1667, 783 + size: 29, 38 + orig: 29, 38 + offset: 0, 0 + index: -1 +slider-vertical + rotate: false + xy: 309, 866 + size: 8, 1 + orig: 8, 1 + offset: 0, 0 + index: -1 +underline + rotate: false + xy: 1563, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +underline-2 + rotate: false + xy: 1449, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +underline-disabled + rotate: false + xy: 1487, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +underline-red + rotate: false + xy: 1525, 862 + size: 36, 27 + split: 12, 12, 12, 12 + orig: 36, 27 + offset: 0, 0 + index: -1 +whiteui + rotate: false + xy: 821, 928 + size: 3, 3 + orig: 3, 3 + offset: 0, 0 + index: -1 +window-empty + rotate: false + xy: 1756, 760 + size: 27, 61 + split: 4, 4, 2, 2 + orig: 27, 61 + offset: 0, 0 + index: -1 diff --git a/core/assets/sprites/fallback/sprites.png b/core/assets/sprites/fallback/sprites.png new file mode 100644 index 0000000000..5b30418964 Binary files /dev/null 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 new file mode 100644 index 0000000000..c1776da98d Binary files /dev/null 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 new file mode 100644 index 0000000000..1b766809aa Binary files /dev/null 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 new file mode 100644 index 0000000000..97e679515f Binary files /dev/null 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 new file mode 100644 index 0000000000..ea35158ac6 Binary files /dev/null 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 new file mode 100644 index 0000000000..c1d4185275 Binary files /dev/null and b/core/assets/sprites/fallback/sprites6.png differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index dfc92d4789..95468e534f 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -1,1930 +1,1972 @@ sprites.png -size: 2048,2048 -format: RGBA8888 -filter: Nearest,Nearest +size: 4096,2048 +format: rgba8888 +filter: nearest,nearest repeat: none core-silo rotate: false - xy: 1, 679 + xy: 291, 759 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 data-processor rotate: false - xy: 1803, 1301 + xy: 3013, 1081 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +data-processor-2 + rotate: false + xy: 2121, 525 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +data-processor-top + rotate: false + xy: 3045, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad rotate: false - xy: 1194, 1105 + xy: 3699, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large rotate: false - xy: 1628, 1627 + xy: 1233, 887 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 launch-pad-light rotate: false - xy: 1292, 1105 + xy: 3535, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launchpod rotate: false - xy: 1981, 1983 + xy: 3099, 1483 size: 66, 64 orig: 66, 64 offset: 0, 0 index: -1 force-projector rotate: false - xy: 1782, 1203 + xy: 1657, 719 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 force-projector-top rotate: false - xy: 1880, 1203 + xy: 3307, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 large-overdrive-projector rotate: false - xy: 1684, 1105 + xy: 3405, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 large-overdrive-projector-top rotate: false - xy: 1782, 1105 + xy: 3503, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mend-projector rotate: false - xy: 565, 653 + xy: 2479, 621 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mend-projector-top rotate: false - xy: 565, 587 + xy: 2545, 621 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender rotate: false - xy: 1375, 347 + xy: 2915, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mender-top rotate: false - xy: 1409, 381 + xy: 2949, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 overdrive-projector rotate: false - xy: 565, 455 + xy: 2677, 621 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overdrive-projector-top rotate: false - xy: 557, 389 + xy: 2319, 555 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 1545, 457 + xy: 1397, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-loader rotate: false - xy: 1133, 1399 + xy: 854, 57 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader rotate: false - xy: 1819, 1399 + xy: 2555, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 1683, 571 + xy: 3745, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor rotate: false - xy: 1747, 537 + xy: 3847, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 1679, 503 + xy: 3745, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 1713, 503 + xy: 3779, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 1747, 503 + xy: 3813, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-0 rotate: false - xy: 2015, 1417 + xy: 1371, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-full rotate: false - xy: 2015, 1417 + xy: 1371, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-1 rotate: false - xy: 1888, 1629 + xy: 1405, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-2 rotate: false - xy: 499, 421 + xy: 1439, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-3 rotate: false - xy: 557, 91 + xy: 1473, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-0 rotate: false - xy: 1513, 627 + xy: 1507, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-1 rotate: false - xy: 257, 848 + xy: 756, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-2 rotate: false - xy: 485, 820 + xy: 790, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-3 rotate: false - xy: 1922, 1629 + xy: 824, 7 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-0 rotate: false - xy: 1547, 627 + xy: 4062, 1445 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-1 rotate: false - xy: 1581, 627 + xy: 1673, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-2 rotate: false - xy: 1615, 627 + xy: 1707, 271 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-3 rotate: false - xy: 1649, 627 + xy: 2785, 619 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-0 rotate: false - xy: 1711, 1889 + xy: 2819, 619 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-1 rotate: false - xy: 1811, 1759 + xy: 2853, 619 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-2 rotate: false - xy: 1845, 1759 + xy: 2887, 619 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-3 rotate: false - xy: 989, 41 + xy: 2781, 585 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-0 rotate: false - xy: 519, 817 + xy: 2781, 551 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-1 rotate: false - xy: 989, 7 + xy: 2815, 585 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-2 rotate: false - xy: 1023, 45 + xy: 2781, 517 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-3 rotate: false - xy: 1023, 11 + xy: 2815, 551 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 1819, 557 + xy: 3881, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 1781, 523 + xy: 3915, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 1815, 523 + xy: 3949, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 1781, 489 + xy: 3915, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 1815, 489 + xy: 3949, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 1849, 523 + xy: 3949, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 1849, 489 + xy: 3983, 771 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 1137, 536 + xy: 4017, 771 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 1137, 502 + xy: 3983, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1171, 536 + xy: 3983, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 1137, 468 + xy: 4017, 737 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 1171, 502 + xy: 4051, 753 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 1171, 468 + xy: 4017, 703 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 1137, 434 + xy: 4051, 719 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 1171, 434 + xy: 3983, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 1137, 400 + xy: 4017, 669 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1137, 366 + xy: 4051, 685 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1171, 400 + xy: 4051, 651 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1137, 332 + xy: 3643, 641 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor rotate: false - xy: 1375, 279 + xy: 3265, 619 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-0 rotate: false - xy: 1409, 313 + xy: 3299, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-1 rotate: false - xy: 1443, 347 + xy: 3333, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-2 rotate: false - xy: 1307, 177 + xy: 3367, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-edge rotate: false - xy: 1341, 211 + xy: 3401, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-conveyor-stack rotate: false - xy: 1375, 245 + xy: 3435, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 1511, 287 + xy: 3503, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1545, 321 + xy: 3537, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1579, 355 + xy: 3571, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1613, 389 + xy: 3605, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1477, 219 + xy: 3639, 573 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1511, 253 + xy: 3673, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1545, 287 + xy: 3707, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1579, 321 + xy: 3741, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1613, 355 + xy: 3775, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1477, 185 + xy: 3809, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1511, 219 + xy: 3843, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1545, 253 + xy: 3877, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1579, 287 + xy: 3911, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1613, 321 + xy: 3945, 581 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1477, 151 + xy: 3979, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1511, 185 + xy: 4013, 567 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 1545, 219 + xy: 4047, 549 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 1579, 253 + xy: 1737, 329 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 1613, 287 + xy: 1771, 330 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cross rotate: false - xy: 1137, 162 + xy: 3983, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 distributor rotate: false - xy: 491, 84 + xy: 2215, 655 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 inverted-sorter rotate: false - xy: 1205, 483 + xy: 1052, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction rotate: false - xy: 1239, 279 + xy: 1222, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-conveyor rotate: false - xy: 1015, 909 + xy: 3731, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mass-conveyor-edge rotate: false - xy: 1113, 1007 + xy: 3895, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mass-conveyor-top rotate: false - xy: 1113, 909 + xy: 3731, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-top rotate: false - xy: 1113, 909 + xy: 3731, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mass-driver-base rotate: false - xy: 1211, 909 + xy: 3829, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overflow-gate rotate: false - xy: 1239, 177 + xy: 3017, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 payload-router rotate: false - xy: 1309, 811 + xy: 1629, 523 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-edge rotate: false - xy: 1407, 1007 + xy: 1755, 789 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-over rotate: false - xy: 1407, 909 + xy: 1755, 691 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-conveyor rotate: false - xy: 1409, 347 + xy: 3095, 619 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-arrow rotate: false - xy: 1443, 381 + xy: 3129, 619 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 1273, 177 + xy: 3163, 619 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 1307, 211 + xy: 3197, 619 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 router rotate: false - xy: 1409, 143 + xy: 4017, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sorter rotate: false - xy: 1477, 355 + xy: 1465, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 underflow-gate rotate: false - xy: 1579, 219 + xy: 3299, 559 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blast-drill rotate: false - xy: 526, 1275 + xy: 453, 859 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rim rotate: false - xy: 656, 1312 + xy: 453, 729 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 863, 1757 + xy: 453, 599 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 993, 1757 + xy: 453, 469 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 drill-top rotate: false - xy: 623, 790 + xy: 3099, 1351 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-liquid rotate: false - xy: 623, 790 + xy: 3099, 1351 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 1880, 1105 + xy: 3437, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rim rotate: false - xy: 900, 1105 + xy: 3601, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 998, 1105 + xy: 3437, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 1096, 1105 + xy: 3535, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 499, 521 + xy: 2677, 687 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 499, 455 + xy: 2347, 621 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 565, 719 + xy: 2413, 621 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 917, 811 + xy: 3993, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 1015, 811 + xy: 1531, 609 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 1113, 811 + xy: 1531, 511 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 1211, 811 + xy: 1629, 621 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 623, 191 + xy: 2451, 489 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 623, 125 + xy: 2517, 489 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 615, 59 + xy: 2583, 489 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 895, 745 + xy: 952, 37 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 961, 745 + xy: 3985, 805 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 895, 679 + xy: 1699, 429 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 1027, 745 + xy: 1765, 429 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border rotate: false - xy: 275, 27 + xy: 2883, 585 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 1407, 585 + xy: 2405, 1319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 1645, 525 + xy: 3643, 743 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 1821, 659 + xy: 3847, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message rotate: false - xy: 1443, 415 + xy: 2983, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 1505, 1007 + xy: 1727, 593 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 bridge-conduit rotate: false - xy: 1717, 571 + xy: 3813, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-arrow rotate: false - xy: 1751, 571 + xy: 3711, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 1751, 571 + xy: 3711, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 1679, 537 + xy: 3745, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 1713, 537 + xy: 3779, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 1822, 727 + xy: 3813, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 1787, 693 + xy: 3847, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 1821, 693 + xy: 3915, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 1787, 659 + xy: 3813, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 1787, 659 + xy: 3813, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 1787, 659 + xy: 3813, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 1785, 625 + xy: 3881, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 1785, 591 + xy: 3949, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 1819, 625 + xy: 3847, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 1819, 591 + xy: 3881, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 1819, 591 + xy: 3881, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 1785, 557 + xy: 3915, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-junction rotate: false - xy: 1341, 381 + xy: 1222, 132 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate rotate: false - xy: 1443, 483 + xy: 1222, 64 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-overflow-gate-top rotate: false - xy: 1205, 211 + xy: 1154, 30 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 1239, 245 + xy: 1188, 30 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 1273, 279 + xy: 1222, 30 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 1307, 313 + xy: 1261, 199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 917, 1007 + xy: 3633, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 917, 909 + xy: 3797, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 1015, 1007 + xy: 3633, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-pump rotate: false - xy: 1273, 245 + xy: 2813, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mechanical-pump-liquid rotate: false - xy: 1307, 279 + xy: 2847, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-liquid rotate: false - xy: 1307, 279 + xy: 2847, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thermal-pump-liquid rotate: false - xy: 1307, 279 + xy: 2847, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit rotate: false - xy: 1273, 211 + xy: 3051, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-arrow rotate: false - xy: 1307, 245 + xy: 2993, 619 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 1341, 279 + xy: 3027, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 1375, 313 + xy: 3061, 611 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-cap rotate: false - xy: 1443, 313 + xy: 3503, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-0 rotate: false - xy: 1341, 177 + xy: 3537, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-1 rotate: false - xy: 1375, 211 + xy: 3571, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-2 rotate: false - xy: 1409, 245 + xy: 3605, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-3 rotate: false - xy: 1443, 279 + xy: 3639, 607 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plated-conduit-top-4 rotate: false - xy: 1375, 177 + xy: 1868, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 1443, 211 + xy: 3745, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 1443, 177 + xy: 3779, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 1205, 143 + xy: 3813, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 1239, 143 + xy: 3847, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump rotate: false - xy: 697, 722 + xy: 2121, 459 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump rotate: false - xy: 1701, 909 + xy: 1951, 723 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery rotate: false - xy: 1057, 45 + xy: 2849, 585 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large rotate: false - xy: 623, 856 + xy: 658, 111 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-large-top rotate: false - xy: 721, 952 + xy: 756, 139 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 battery-top rotate: false - xy: 1057, 11 + xy: 2781, 483 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator rotate: false - xy: 1159, 27 + xy: 3881, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 combustion-generator-top rotate: false - xy: 1788, 727 + xy: 3779, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator rotate: false - xy: 1901, 1301 + xy: 3045, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-liquid rotate: false - xy: 900, 1203 + xy: 3111, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-top rotate: false - xy: 998, 1203 + xy: 3143, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode rotate: false - xy: 1171, 196 + xy: 4017, 635 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 diode-arrow rotate: false - xy: 1171, 162 + xy: 4051, 617 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator rotate: false - xy: 1883, 489 + xy: 1018, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-top rotate: false - xy: 1205, 517 + xy: 1052, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor rotate: false - xy: 807, 1474 + xy: 843, 627 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-bottom rotate: false - xy: 937, 1497 + xy: 973, 757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-light rotate: false - xy: 1067, 1497 + xy: 1103, 887 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-0 rotate: false - xy: 1197, 1497 + xy: 713, 367 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-1 rotate: false - xy: 1327, 1497 + xy: 843, 497 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-2 rotate: false - xy: 1457, 1497 + xy: 973, 627 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-3 rotate: false - xy: 1587, 1497 + xy: 1103, 757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 power-node rotate: false - xy: 1409, 211 + xy: 1902, 345 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large rotate: false - xy: 681, 59 + xy: 2649, 489 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source rotate: false - xy: 1443, 245 + xy: 3677, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void rotate: false - xy: 1409, 177 + xy: 3711, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator rotate: false - xy: 631, 590 + xy: 2187, 457 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rtg-generator-top rotate: false - xy: 1443, 143 + xy: 4051, 583 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel rotate: false - xy: 1613, 491 + xy: 1431, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large rotate: false - xy: 1603, 811 + xy: 2049, 821 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 surge-tower rotate: false - xy: 755, 128 + xy: 1547, 379 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-generator rotate: false - xy: 829, 656 + xy: 1349, 313 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-reactor rotate: false - xy: 1799, 1007 + xy: 2147, 821 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 1701, 811 + xy: 2049, 723 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-top rotate: false - xy: 1799, 909 + xy: 2147, 723 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 turbine-generator rotate: false - xy: 821, 194 + xy: 1547, 313 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +turbine-generator-cap + rotate: false + xy: 1613, 313 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-top rotate: false - xy: 821, 128 + xy: 957, 301 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +turbine-generator-turbine0 + rotate: false + xy: 957, 235 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +turbine-generator-turbine1 + rotate: false + xy: 952, 169 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 alloy-smelter rotate: false - xy: 525, 949 + xy: 1087, 361 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 alloy-smelter-top rotate: false - xy: 623, 954 + xy: 1185, 360 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-mixer rotate: false - xy: 293, 394 + xy: 3655, 819 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +block-forge + rotate: false + xy: 2229, 1081 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 coal-centrifuge rotate: false - xy: 367, 414 + xy: 4020, 1479 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-bottom rotate: false - xy: 359, 84 + xy: 1923, 525 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 425, 84 + xy: 1989, 591 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 351, 18 + xy: 1989, 525 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator rotate: false - xy: 417, 18 + xy: 2055, 591 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 491, 348 + xy: 2055, 525 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 491, 282 + xy: 2121, 591 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 disassembler rotate: false - xy: 1096, 1203 + xy: 3143, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-liquid rotate: false - xy: 1194, 1203 + xy: 3209, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 disassembler-spinner rotate: false - xy: 1292, 1203 + xy: 3241, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press rotate: false - xy: 755, 788 + xy: 3297, 1328 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 incinerator rotate: false - xy: 1239, 517 + xy: 1018, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source rotate: false - xy: 1375, 483 + xy: 1120, 65 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void rotate: false - xy: 1205, 245 + xy: 1188, 132 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln rotate: false - xy: 821, 788 + xy: 2281, 655 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-top rotate: false - xy: 499, 719 + xy: 2253, 589 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 499, 719 + xy: 2253, 589 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 liquid-source rotate: false - xy: 1409, 415 + xy: 1256, 97 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-void rotate: false - xy: 1443, 449 + xy: 1256, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 melter rotate: false - xy: 1341, 313 + xy: 2881, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press rotate: false - xy: 1309, 1007 + xy: 3927, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phase-weaver rotate: false - xy: 557, 257 + xy: 2451, 555 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 557, 191 + xy: 2517, 555 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 557, 125 + xy: 2583, 555 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor rotate: false - xy: 623, 389 + xy: 2649, 555 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 623, 323 + xy: 2319, 489 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 1273, 143 + xy: 3881, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 1307, 143 + xy: 3915, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer rotate: false - xy: 631, 722 + xy: 1923, 459 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator rotate: false - xy: 763, 458 + xy: 1303, 445 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-liquid rotate: false - xy: 689, 392 + xy: 1369, 445 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-spinner rotate: false - xy: 689, 326 + xy: 1435, 447 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-crucible rotate: false - xy: 1603, 909 + xy: 1825, 495 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-crucible-top rotate: false - xy: 1701, 1007 + xy: 1951, 821 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter rotate: false - xy: 755, 392 + xy: 1283, 379 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press rotate: false - xy: 689, 260 + xy: 1349, 379 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame0 rotate: false - xy: 755, 326 + xy: 1501, 445 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame1 rotate: false - xy: 689, 194 + xy: 1567, 445 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame2 rotate: false - xy: 755, 260 + xy: 1633, 457 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-liquid rotate: false - xy: 689, 128 + xy: 1415, 379 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-top rotate: false - xy: 755, 194 + xy: 1481, 379 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rock1 rotate: false - xy: 987, 163 + xy: 3143, 653 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rock2 rotate: false - xy: 1037, 379 + xy: 3193, 653 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sand-boulder1 rotate: false - xy: 1477, 491 + xy: 2349, 1201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-boulder2 rotate: false - xy: 1511, 491 + xy: 1295, 199 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder1 rotate: false - xy: 1477, 389 + xy: 1329, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-boulder2 rotate: false - xy: 1511, 423 + xy: 1363, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snowrock1 rotate: false - xy: 1037, 229 + xy: 3343, 661 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrock2 rotate: false - xy: 1037, 179 + xy: 3393, 661 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-cluster1 rotate: false - xy: 1387, 619 + xy: 1433, 271 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster2 rotate: false - xy: 1429, 619 + xy: 1475, 271 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-cluster3 rotate: false - xy: 1471, 619 + xy: 1517, 271 size: 40, 40 orig: 40, 40 offset: 0, 0 @@ -1945,2450 +1987,2891 @@ white-tree-dead index: -1 container rotate: false - xy: 359, 348 + xy: 2409, 753 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation rotate: false - xy: 1498, 1627 + xy: 583, 729 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-foundation-team + rotate: false + xy: 583, 599 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus rotate: false - xy: 863, 1887 + xy: 2613, 1387 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-nucleus-team + rotate: false + xy: 2775, 1387 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard rotate: false - xy: 1917, 1399 + xy: 2555, 885 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-shard-team + rotate: false + xy: 2621, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 unloader rotate: false - xy: 1613, 253 + xy: 3333, 559 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-center rotate: false - xy: 1545, 151 + xy: 3367, 559 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault rotate: false - xy: 1799, 811 + xy: 2245, 787 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-heat rotate: false - xy: 2015, 1451 + xy: 1337, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-1 rotate: false - xy: 1091, 45 + xy: 2815, 517 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-2 rotate: false - xy: 293, 328 + xy: 3099, 1417 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-3 rotate: false - xy: 721, 854 + xy: 854, 155 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-4 rotate: false - xy: 1123, 1757 + xy: 453, 339 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 hail-heat rotate: false - xy: 1999, 1307 + xy: 1139, 319 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 499, 587 + xy: 2347, 687 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 1773, 1793 + xy: 843, 367 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 1505, 909 + xy: 1853, 789 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 697, 656 + xy: 2319, 423 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 631, 524 + xy: 2385, 423 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 763, 656 + xy: 2451, 423 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-heat rotate: false - xy: 1545, 491 + xy: 1290, 131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 961, 679 + xy: 1679, 363 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +additive-reconstructor + rotate: false + xy: 2131, 1081 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +additive-reconstructor-top + rotate: false + xy: 1205, 458 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 air-factory rotate: false - xy: 525, 1047 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -basic-reconstructor - rotate: false - xy: 525, 851 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-forge - rotate: false - xy: 525, 851 + xy: 1595, 817 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 command-center rotate: false - xy: 433, 414 + xy: 2343, 753 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -dagger-factory +exponential-reconstructor rotate: false - xy: 491, 216 - size: 64, 64 - orig: 64, 64 + xy: 1517, 1017 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -dagger-factory-top +exponential-reconstructor-top rotate: false - xy: 491, 150 - size: 64, 64 - orig: 64, 64 + xy: 1805, 1275 + size: 224, 224 + orig: 224, 224 offset: 0, 0 index: -1 -factory-in +factory-in-3 rotate: false - xy: 1488, 1203 + xy: 3241, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -factory-out +factory-in-5 rotate: false - xy: 1586, 1203 + xy: 3534, 1435 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +factory-in-7 + rotate: false + xy: 2063, 1533 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +factory-in-9 + rotate: false + xy: 1225, 1469 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +factory-out-3 + rotate: false + xy: 1461, 707 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -factory-top +factory-out-5 rotate: false - xy: 1684, 1203 + xy: 3696, 1435 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +factory-out-7 + rotate: false + xy: 2289, 1565 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +factory-out-9 + rotate: false + xy: 1515, 1759 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +factory-top-3 + rotate: false + xy: 1559, 719 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ground-factory rotate: false - xy: 1586, 1105 + xy: 3339, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 +multiplicative-reconstructor + rotate: false + xy: 3858, 1435 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +multiplicative-reconstructor-top + rotate: false + xy: 3363, 1273 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 naval-factory rotate: false - xy: 1309, 909 + xy: 3927, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rally-point rotate: false - xy: 631, 656 + xy: 1989, 459 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-base rotate: false - xy: 1375, 143 + xy: 3983, 601 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -revenant-factory +resupply-point rotate: false - xy: 1903, 1793 - size: 128, 128 - orig: 128, 128 + xy: 2055, 459 + size: 64, 64 + orig: 64, 64 offset: 0, 0 index: -1 -revenant-factory-top +tetrative-reconstructor rotate: false - xy: 1717, 1497 - size: 128, 128 - orig: 128, 128 + xy: 1515, 1469 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +tetrative-reconstructor-top + rotate: false + xy: 1805, 1759 + size: 288, 288 + orig: 288, 288 offset: 0, 0 index: -1 copper-wall rotate: false - xy: 1171, 366 + xy: 3677, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large rotate: false - xy: 359, 282 + xy: 2475, 753 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door rotate: false - xy: 1853, 625 + xy: 1023, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large rotate: false - xy: 483, 18 + xy: 2187, 589 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 549, 18 + xy: 2187, 523 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-open rotate: false - xy: 1853, 591 + xy: 1057, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall rotate: false - xy: 1341, 245 + xy: 3231, 619 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large rotate: false - xy: 557, 323 + xy: 2385, 555 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-wall rotate: false - xy: 1409, 279 + xy: 3469, 627 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large rotate: false - xy: 623, 257 + xy: 2385, 489 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-gigantic rotate: false - xy: 1758, 1627 + xy: 973, 497 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge2 rotate: false - xy: 1603, 1007 + xy: 1853, 691 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge3 rotate: false - xy: 1505, 811 + xy: 1825, 593 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-large1 rotate: false - xy: 631, 458 + xy: 2583, 423 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large2 rotate: false - xy: 763, 590 + xy: 2649, 423 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large3 rotate: false - xy: 697, 524 + xy: 2715, 555 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large4 rotate: false - xy: 763, 524 + xy: 2715, 489 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall2 rotate: false - xy: 1477, 423 + xy: 1290, 97 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 1511, 457 + xy: 1290, 63 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1579, 491 + xy: 1290, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1579, 491 + xy: 1290, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall rotate: false - xy: 1613, 423 + xy: 3435, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large rotate: false - xy: 747, 62 + xy: 1613, 379 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thorium-wall rotate: false - xy: 1477, 253 + xy: 3469, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large rotate: false - xy: 829, 590 + xy: 1415, 313 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster rotate: false - xy: 1847, 1497 + xy: 1233, 757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-wall rotate: false - xy: 1511, 151 + xy: 1567, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large rotate: false - xy: 821, 260 + xy: 1481, 313 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 bullet rotate: false - xy: 1680, 757 + xy: 2739, 765 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 1734, 757 + xy: 2625, 1333 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 casing rotate: false - xy: 2033, 1399 + xy: 1733, 915 size: 8, 16 orig: 8, 16 offset: 0, 0 index: -1 circle-end rotate: false - xy: 219, 882 + xy: 1233, 556 size: 100, 199 orig: 100, 199 offset: 0, 0 index: -1 circle-mid rotate: false - xy: 1647, 254 + xy: 4085, 586 size: 1, 199 orig: 1, 199 offset: 0, 0 index: -1 circle-shadow rotate: false - xy: 645, 1604 + xy: 3169, 1588 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 error rotate: false - xy: 879, 75 + xy: 2893, 703 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 laser rotate: false - xy: 1673, 475 + xy: 607, 1065 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 laser-end rotate: false - xy: 293, 608 + xy: 3433, 811 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 minelaser rotate: false - xy: 848, 1757 + xy: 4091, 887 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 293, 534 + xy: 3507, 811 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 missile rotate: false - xy: 937, 125 + xy: 1559, 275 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 missile-back rotate: false - xy: 979, 75 + xy: 1597, 275 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 particle rotate: false - xy: 1345, 619 + xy: 1391, 271 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 scale_marker rotate: false - xy: 149, 61 + xy: 1081, 377 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 shell rotate: false - xy: 219, 844 + xy: 1635, 275 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 485, 854 + xy: 1265, 233 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 transfer rotate: false - xy: 995, 413 + xy: 607, 1015 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 1545, 185 + xy: 1601, 207 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 white rotate: false - xy: 623, 785 + xy: 952, 248 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 arc rotate: false - xy: 2015, 1485 + xy: 1303, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +block-additive-reconstructor-full + rotate: false + xy: 1363, 707 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-air-factory-full + rotate: false + xy: 1335, 609 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 block-arc-full rotate: false - xy: 1091, 11 + xy: 2849, 551 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-drill-full rotate: false - xy: 1253, 1757 + xy: 3954, 1725 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-char-full rotate: false - xy: 309, 30 + xy: 2781, 449 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliffs-full rotate: false - xy: 1169, 570 + xy: 2815, 483 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conduit-full rotate: false - xy: 1129, 95 + xy: 2849, 517 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conveyor-full rotate: false - xy: 1129, 61 + xy: 2883, 551 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-0 rotate: false - xy: 1129, 61 + xy: 2883, 551 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +block-core-foundation-full + rotate: false + xy: 453, 209 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-core-nucleus-full + rotate: false + xy: 2289, 1403 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-core-shard-full + rotate: false + xy: 1335, 511 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 block-craters-full rotate: false - xy: 1125, 27 + xy: 2815, 449 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cryofluidmixer-full rotate: false - xy: 293, 262 + xy: 3721, 819 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cultivator-full rotate: false - xy: 293, 196 + xy: 3787, 819 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-cyclone-full rotate: false - xy: 819, 952 + xy: 3987, 1337 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-dark-metal-full rotate: false - xy: 1513, 593 + xy: 2849, 483 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-full rotate: false - xy: 1547, 593 + xy: 2883, 517 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dunerocks-full rotate: false - xy: 1581, 593 + xy: 2849, 449 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-full rotate: false - xy: 1615, 593 + xy: 2883, 483 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +block-exponential-reconstructor-full + rotate: false + xy: 645, 1243 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 block-fuse-full rotate: false - xy: 819, 854 + xy: 2261, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-grass-full rotate: false - xy: 1649, 593 + xy: 2883, 449 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +block-ground-factory-full + rotate: false + xy: 2261, 885 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 block-hail-full rotate: false - xy: 1103, 553 + xy: 2781, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-holostone-full rotate: false - xy: 1103, 519 + xy: 2815, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hotrock-full rotate: false - xy: 1103, 485 + xy: 2849, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-full rotate: false - xy: 1103, 451 + xy: 2883, 415 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-snow-full rotate: false - xy: 1203, 570 + xy: 2371, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icerocks-full rotate: false - xy: 1237, 585 + xy: 1541, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ignarock-full rotate: false - xy: 1271, 585 + xy: 1575, 241 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-impact-reactor-full rotate: false - xy: 1383, 1757 + xy: 398, 79 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-lancer-full rotate: false - xy: 367, 744 + xy: 3853, 819 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-laser-drill-full rotate: false - xy: 937, 1399 + xy: 658, 13 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-liquid-router-full rotate: false - xy: 1305, 585 + xy: 1609, 241 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-tank-full rotate: false - xy: 1035, 1399 + xy: 756, 41 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-magmarock-full rotate: false - xy: 1339, 585 + xy: 858, 23 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mass-conveyor-full rotate: false - xy: 1231, 1399 + xy: 2327, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mass-conveyor-icon rotate: false - xy: 1231, 1399 + xy: 2327, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-mass-driver-full rotate: false - xy: 1329, 1399 + xy: 2359, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-mechanical-drill-full rotate: false - xy: 367, 678 + xy: 3919, 819 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-meltdown-full rotate: false - xy: 1513, 1757 + xy: 528, 79 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-metal-floor-damaged-full rotate: false - xy: 1373, 585 + xy: 892, 23 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-moss-full rotate: false - xy: 1441, 585 + xy: 2371, 1269 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +block-multiplicative-reconstructor-full + rotate: false + xy: 2451, 1387 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-naval-factory-full + rotate: false + xy: 2359, 885 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 block-oil-extractor-full rotate: false - xy: 1427, 1399 + xy: 2425, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-ore-coal-full rotate: false - xy: 1475, 585 + xy: 2405, 1285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-full rotate: false - xy: 1237, 551 + xy: 2439, 1295 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-full rotate: false - xy: 1271, 551 + xy: 2473, 1295 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-full rotate: false - xy: 1305, 551 + xy: 2507, 1295 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-full rotate: false - xy: 1339, 551 + xy: 2541, 1295 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-full rotate: false - xy: 1373, 551 + xy: 2575, 1295 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-payload-router-full rotate: false - xy: 1525, 1399 + xy: 2457, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 payload-router-icon rotate: false - xy: 1525, 1399 + xy: 2457, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-pebbles-full rotate: false - xy: 1407, 551 + xy: 2365, 1235 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-weaver-full rotate: false - xy: 367, 612 + xy: 2245, 721 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-plated-conduit-full rotate: false - xy: 1441, 551 + xy: 2405, 1251 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pneumatic-drill-full rotate: false - xy: 367, 546 + xy: 398, 13 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-pulse-conduit-full rotate: false - xy: 1475, 551 + xy: 2439, 1261 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulverizer-full rotate: false - xy: 1509, 559 + xy: 2473, 1261 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-repair-point-full rotate: false - xy: 1543, 559 + xy: 2507, 1261 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ripple-full rotate: false - xy: 1623, 1399 + xy: 2457, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-rock-full rotate: false - xy: 839, 12 + xy: 2779, 1337 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-rocks-full rotate: false - xy: 1577, 559 + xy: 2541, 1261 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-saltrocks-full rotate: false - xy: 1611, 559 + xy: 2575, 1261 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-salvo-full rotate: false - xy: 367, 480 + xy: 464, 13 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-sand-boulder-full rotate: false - xy: 1645, 559 + xy: 2609, 1295 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-full rotate: false - xy: 1509, 525 + xy: 2609, 1261 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sandrocks-full rotate: false - xy: 1543, 525 + xy: 2643, 1299 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scatter-full rotate: false - xy: 433, 744 + xy: 530, 13 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-scorch-full rotate: false - xy: 1577, 525 + xy: 2643, 1265 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-full rotate: false - xy: 1611, 525 + xy: 3643, 777 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall1 rotate: false - xy: 1611, 525 + xy: 3643, 777 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-huge-full rotate: false - xy: 1721, 1399 + xy: 2523, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge1 rotate: false - xy: 1721, 1399 + xy: 2523, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-scrap-wall-large-full rotate: false - xy: 433, 678 + xy: 4025, 871 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-segment-full rotate: false - xy: 433, 612 + xy: 2193, 1467 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-shale-boulder-full rotate: false - xy: 1888, 741 + xy: 3643, 709 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-full rotate: false - xy: 1922, 741 + xy: 3643, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shalerocks-full rotate: false - xy: 1685, 673 + xy: 3677, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shrubs-full rotate: false - xy: 1719, 673 + xy: 3711, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snow-full rotate: false - xy: 1753, 673 + xy: 3677, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snowrock-full rotate: false - xy: 1987, 1069 + xy: 2829, 1337 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snowrocks-full rotate: false - xy: 1683, 639 + xy: 3745, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spectre-full rotate: false - xy: 848, 1627 + xy: 3525, 1179 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 block-spore-cluster-full rotate: false - xy: 107, 25 + xy: 4020, 1437 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-moss-full rotate: false - xy: 1683, 605 + xy: 3677, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-press-full rotate: false - xy: 433, 546 + xy: 2193, 1401 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-sporerocks-full rotate: false - xy: 1717, 639 + xy: 3711, 751 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-stone-full rotate: false - xy: 1717, 605 + xy: 3779, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-swarmer-full rotate: false - xy: 433, 480 + xy: 2193, 1335 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-tendrils-full rotate: false - xy: 1751, 639 + xy: 3677, 683 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +block-tetrative-reconstructor-full + rotate: false + xy: 645, 1759 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 block-titanium-conveyor-full rotate: false - xy: 1751, 605 + xy: 3711, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-0 rotate: false - xy: 1751, 605 + xy: 3711, 717 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +block-turbine-generator-full + rotate: false + xy: 2259, 1337 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 block-water-extractor-full rotate: false - xy: 1978, 1235 + xy: 2325, 1337 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-wave-full rotate: false - xy: 1978, 1169 + xy: 4020, 1545 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +core-foundation-team-crux + rotate: false + xy: 583, 469 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-foundation-team-sharded + rotate: false + xy: 583, 339 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-nucleus-team-crux + rotate: false + xy: 2937, 1387 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-nucleus-team-sharded + rotate: false + xy: 291, 921 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-shard-team-crux + rotate: false + xy: 2653, 983 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-shard-team-sharded + rotate: false + xy: 2653, 885 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 cracks-1-0 rotate: false - xy: 1137, 298 + xy: 3711, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-1 rotate: false - xy: 1171, 332 + xy: 3745, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-2 rotate: false - xy: 1137, 264 + xy: 3779, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-3 rotate: false - xy: 1171, 298 + xy: 3813, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-4 rotate: false - xy: 1137, 230 + xy: 3847, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-5 rotate: false - xy: 1171, 264 + xy: 3881, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-6 rotate: false - xy: 1137, 196 + xy: 3915, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-1-7 rotate: false - xy: 1171, 230 + xy: 3949, 649 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cracks-2-0 rotate: false - xy: 425, 348 + xy: 2541, 753 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-1 rotate: false - xy: 359, 216 + xy: 2607, 753 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-2 rotate: false - xy: 425, 282 + xy: 2673, 753 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-3 rotate: false - xy: 425, 216 + xy: 1951, 657 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-4 rotate: false - xy: 359, 150 + xy: 2017, 657 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-5 rotate: false - xy: 425, 150 + xy: 2083, 657 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-6 rotate: false - xy: 293, 130 + xy: 2149, 657 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-2-7 rotate: false - xy: 285, 64 + xy: 1923, 591 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cracks-3-0 rotate: false - xy: 921, 1301 + xy: 2719, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-1 rotate: false - xy: 1019, 1301 + xy: 2751, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-2 rotate: false - xy: 1117, 1301 + xy: 2751, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-3 rotate: false - xy: 1215, 1301 + xy: 2817, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-4 rotate: false - xy: 1313, 1301 + xy: 2849, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-5 rotate: false - xy: 1411, 1301 + xy: 2849, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-6 rotate: false - xy: 1509, 1301 + xy: 2915, 1081 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-3-7 rotate: false - xy: 1607, 1301 + xy: 2947, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 cracks-4-0 rotate: false - xy: 526, 1145 + xy: 583, 209 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-1 rotate: false - xy: 656, 1182 + xy: 713, 887 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-2 rotate: false - xy: 163, 711 + xy: 713, 757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-3 rotate: false - xy: 163, 581 + xy: 843, 887 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-4 rotate: false - xy: 163, 451 + xy: 713, 627 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-5 rotate: false - xy: 163, 321 + xy: 843, 757 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-6 rotate: false - xy: 163, 191 + xy: 973, 887 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-7 rotate: false - xy: 155, 61 + xy: 713, 497 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-5-0 rotate: false - xy: 645, 1442 + xy: 291, 597 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-1 rotate: false - xy: 1025, 1887 + xy: 291, 435 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-2 rotate: false - xy: 1, 517 + xy: 291, 273 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-3 rotate: false - xy: 1187, 1887 + xy: 1743, 887 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-4 rotate: false - xy: 1, 355 + xy: 1937, 919 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-5 rotate: false - xy: 1349, 1887 + xy: 2031, 1339 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-6 rotate: false - xy: 1, 193 + xy: 2099, 919 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 cracks-5-7 rotate: false - xy: 1511, 1887 + xy: 3372, 1435 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 +cracks-6-0 + rotate: false + xy: 3901, 1855 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-1 + rotate: false + xy: 3372, 1597 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-2 + rotate: false + xy: 3566, 1597 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-3 + rotate: false + xy: 3760, 1597 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-4 + rotate: false + xy: 204, 19 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-5 + rotate: false + xy: 3169, 1394 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-6 + rotate: false + xy: 1743, 1049 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-6-7 + rotate: false + xy: 1937, 1081 + size: 192, 192 + orig: 192, 192 + offset: 0, 0 + index: -1 +cracks-7-0 + rotate: false + xy: 871, 1243 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-1 + rotate: false + xy: 1097, 1243 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-2 + rotate: false + xy: 1323, 1243 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-3 + rotate: false + xy: 1549, 1243 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-4 + rotate: false + xy: 613, 1017 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-5 + rotate: false + xy: 839, 1017 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-6 + rotate: false + xy: 1065, 1017 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-7-7 + rotate: false + xy: 1291, 1017 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 +cracks-8-0 + rotate: false + xy: 1805, 1501 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-1 + rotate: false + xy: 2095, 1791 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-2 + rotate: false + xy: 2353, 1791 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-3 + rotate: false + xy: 2611, 1791 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-4 + rotate: false + xy: 2869, 1791 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-5 + rotate: false + xy: 3127, 1791 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-6 + rotate: false + xy: 3385, 1791 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-8-7 + rotate: false + xy: 3643, 1791 + size: 256, 256 + orig: 256, 256 + offset: 0, 0 + index: -1 +cracks-9-0 + rotate: false + xy: 1, 793 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-1 + rotate: false + xy: 323, 1115 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-2 + rotate: false + xy: 645, 1469 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-3 + rotate: false + xy: 935, 1759 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-4 + rotate: false + xy: 1, 503 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-5 + rotate: false + xy: 935, 1469 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-6 + rotate: false + xy: 1225, 1759 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 +cracks-9-7 + rotate: false + xy: 1, 213 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 cyclone rotate: false - xy: 1705, 1301 + xy: 2947, 885 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 duo rotate: false - xy: 1853, 557 + xy: 1091, 211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 fuse rotate: false - xy: 1488, 1105 + xy: 3339, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 hail rotate: false - xy: 1883, 523 + xy: 1018, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-large rotate: false - xy: 1169, 604 + xy: 2743, 623 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-blast-compound-medium rotate: false - xy: 1205, 449 + xy: 1018, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 1477, 525 + xy: 1897, 469 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-blast-compound-tiny rotate: false - xy: 2015, 1399 + xy: 1697, 915 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-blast-compound-xlarge rotate: false - xy: 1135, 696 + xy: 3193, 753 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-coal-large rotate: false - xy: 477, 1118 + xy: 1697, 975 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-coal-medium rotate: false - xy: 1307, 517 + xy: 1086, 143 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-small rotate: false - xy: 1125, 1 + xy: 926, 31 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-coal-tiny rotate: false - xy: 848, 1609 + xy: 1265, 342 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-coal-xlarge rotate: false - xy: 1185, 703 + xy: 2943, 695 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-copper-large rotate: false - xy: 477, 1076 + xy: 1693, 823 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-copper-medium rotate: false - xy: 1239, 449 + xy: 1052, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-small rotate: false - xy: 1151, 1 + xy: 1897, 443 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-copper-tiny rotate: false - xy: 786, 1424 + xy: 1715, 915 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-copper-xlarge rotate: false - xy: 1235, 703 + xy: 2993, 703 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-graphite-large rotate: false - xy: 1219, 661 + xy: 2231, 1193 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-graphite-medium rotate: false - xy: 1341, 517 + xy: 1052, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-small rotate: false - xy: 1177, 1 + xy: 613, 1379 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-graphite-tiny rotate: false - xy: 900, 1342 + xy: 1265, 324 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-graphite-xlarge rotate: false - xy: 1285, 703 + xy: 3243, 753 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-lead-large rotate: false - xy: 1261, 661 + xy: 1139, 277 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-lead-medium rotate: false - xy: 1239, 415 + xy: 1086, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-small rotate: false - xy: 275, 1 + xy: 2095, 1765 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-lead-tiny rotate: false - xy: 367, 812 + xy: 204, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-lead-xlarge rotate: false - xy: 1335, 703 + xy: 3043, 695 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-metaglass-large rotate: false - xy: 1303, 661 + xy: 1697, 933 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-metaglass-medium rotate: false - xy: 1307, 483 + xy: 2315, 1211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-small rotate: false - xy: 301, 1 + xy: 1775, 1443 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-metaglass-tiny rotate: false - xy: 385, 812 + xy: 222, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-metaglass-xlarge rotate: false - xy: 1385, 703 + xy: 3093, 703 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-phase-fabric-large rotate: false - xy: 1345, 661 + xy: 4051, 829 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-phase-fabric-medium rotate: false - xy: 1205, 347 + xy: 2439, 1227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-small rotate: false - xy: 623, 1119 + xy: 323, 1089 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-phase-fabric-tiny rotate: false - xy: 107, 7 + xy: 240, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-phase-fabric-xlarge rotate: false - xy: 1435, 703 + xy: 3143, 703 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-plastanium-large rotate: false - xy: 1387, 661 + xy: 2281, 1245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-plastanium-medium rotate: false - xy: 1273, 415 + xy: 2507, 1227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-small rotate: false - xy: 887, 828 + xy: 1335, 731 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-plastanium-tiny rotate: false - xy: 1977, 1501 + xy: 258, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-plastanium-xlarge rotate: false - xy: 1485, 703 + xy: 3193, 703 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-pyratite-large rotate: false - xy: 1429, 661 + xy: 2323, 1245 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-pyratite-medium rotate: false - xy: 1341, 483 + xy: 2575, 1227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-small rotate: false - xy: 291, 856 + xy: 1465, 861 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-pyratite-tiny rotate: false - xy: 533, 437 + xy: 276, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-pyratite-xlarge rotate: false - xy: 1535, 703 + xy: 3243, 703 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-sand-large rotate: false - xy: 1471, 661 + xy: 1181, 318 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-sand-medium rotate: false - xy: 1205, 313 + xy: 2643, 1231 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-small rotate: false - xy: 293, 830 + xy: 1905, 1023 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-sand-tiny rotate: false - xy: 591, 107 + xy: 294, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-sand-xlarge rotate: false - xy: 1585, 703 + xy: 3293, 761 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-scrap-large rotate: false - xy: 1513, 661 + xy: 1223, 318 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-scrap-medium rotate: false - xy: 1273, 381 + xy: 1120, 167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-small rotate: false - xy: 1956, 749 + xy: 2063, 1507 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-scrap-tiny rotate: false - xy: 1956, 1645 + xy: 312, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-scrap-xlarge rotate: false - xy: 1635, 703 + xy: 3293, 711 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-silicon-large rotate: false - xy: 1555, 661 + xy: 1181, 276 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-silicon-medium rotate: false - xy: 1341, 449 + xy: 1120, 99 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-small rotate: false - xy: 1856, 735 + xy: 2259, 1507 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-silicon-tiny rotate: false - xy: 1956, 1627 + xy: 330, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-silicon-xlarge rotate: false - xy: 1685, 707 + xy: 3343, 761 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-spore-pod-large rotate: false - xy: 1597, 661 + xy: 1223, 276 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-spore-pod-medium rotate: false - xy: 1205, 279 + xy: 1159, 200 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-small rotate: false - xy: 1137, 136 + xy: 1923, 665 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-spore-pod-tiny rotate: false - xy: 1103, 433 + xy: 348, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-spore-pod-xlarge rotate: false - xy: 1735, 707 + xy: 3343, 711 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-surge-alloy-large rotate: false - xy: 1639, 661 + xy: 1139, 235 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-surge-alloy-medium rotate: false - xy: 1273, 347 + xy: 1227, 200 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-small rotate: false - xy: 1163, 136 + xy: 2311, 761 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-surge-alloy-tiny rotate: false - xy: 1205, 552 + xy: 366, 1 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-surge-alloy-xlarge rotate: false - xy: 953, 563 + xy: 3393, 761 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-thorium-large rotate: false - xy: 149, 19 + xy: 1181, 234 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-thorium-medium rotate: false - xy: 1341, 415 + xy: 1154, 132 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-small rotate: false - xy: 1647, 499 + xy: 2319, 629 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-thorium-tiny rotate: false - xy: 623, 1075 + xy: 1209, 609 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-thorium-xlarge rotate: false - xy: 953, 513 + xy: 3393, 711 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 item-titanium-large rotate: false - xy: 191, 19 + xy: 1223, 234 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 item-titanium-medium rotate: false - xy: 1409, 483 + xy: 1154, 98 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-small rotate: false - xy: 1579, 193 + xy: 1303, 530 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 item-titanium-tiny rotate: false - xy: 1647, 455 + xy: 2921, 635 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 item-titanium-xlarge rotate: false - xy: 953, 463 + xy: 3443, 761 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lancer rotate: false - xy: 499, 653 + xy: 2253, 523 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 liquid-cryofluid-large rotate: false - xy: 233, 19 + xy: 4051, 787 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-cryofluid-medium rotate: false - xy: 1307, 347 + xy: 1188, 98 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-small rotate: false - xy: 1613, 227 + xy: 1699, 497 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-cryofluid-tiny rotate: false - xy: 866, 1609 + xy: 3079, 1369 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-cryofluid-xlarge rotate: false - xy: 937, 163 + xy: 3493, 711 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-oil-large rotate: false - xy: 1219, 619 + xy: 1265, 271 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-oil-medium rotate: false - xy: 1409, 449 + xy: 1222, 98 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-small rotate: false - xy: 623, 1093 + xy: 4025, 1311 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-oil-tiny rotate: false - xy: 786, 1406 + xy: 1737, 311 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-oil-xlarge rotate: false - xy: 1019, 579 + xy: 3543, 761 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-slag-large rotate: false - xy: 1261, 619 + xy: 1307, 271 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-slag-medium rotate: false - xy: 1375, 381 + xy: 1256, 131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-small rotate: false - xy: 1647, 473 + xy: 1643, 249 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-slag-tiny rotate: false - xy: 900, 1324 + xy: 613, 1361 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-slag-xlarge rotate: false - xy: 1003, 529 + xy: 3543, 711 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 liquid-water-large rotate: false - xy: 1303, 619 + xy: 1349, 271 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 liquid-water-medium rotate: false - xy: 1239, 211 + xy: 2779, 1303 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-small rotate: false - xy: 1579, 167 + xy: 3401, 567 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 liquid-water-tiny rotate: false - xy: 125, 7 + xy: 2121, 1773 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 liquid-water-xlarge rotate: false - xy: 1003, 479 + xy: 3593, 761 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mass-driver rotate: false - xy: 1211, 1007 + xy: 3829, 983 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 meltdown rotate: false - xy: 1643, 1757 + xy: 713, 237 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 repair-point rotate: false - xy: 1341, 143 + xy: 3949, 615 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ripple rotate: false - xy: 1407, 811 + xy: 1727, 495 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo rotate: false - xy: 763, 722 + xy: 2253, 457 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scatter rotate: false - xy: 697, 590 + xy: 2517, 423 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch rotate: false - xy: 1477, 457 + xy: 1290, 165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 segment rotate: false - xy: 697, 458 + xy: 2715, 423 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spectre rotate: false - xy: 1888, 1663 + xy: 1103, 627 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 splash-0 rotate: false - xy: 1511, 389 + xy: 1499, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-1 rotate: false - xy: 1545, 423 + xy: 1533, 203 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-10 rotate: false - xy: 1545, 355 + xy: 3367, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-11 rotate: false - xy: 1579, 389 + xy: 3401, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-2 rotate: false - xy: 1579, 457 + xy: 3095, 585 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-3 rotate: false - xy: 1477, 321 + xy: 3129, 585 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-4 rotate: false - xy: 1511, 355 + xy: 3163, 585 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-5 rotate: false - xy: 1545, 389 + xy: 3197, 585 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-6 rotate: false - xy: 1579, 423 + xy: 3231, 585 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-7 rotate: false - xy: 1613, 457 + xy: 3265, 585 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-8 rotate: false - xy: 1477, 287 + xy: 3299, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 splash-9 rotate: false - xy: 1511, 321 + xy: 3333, 593 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 swarmer rotate: false - xy: 829, 722 + xy: 1283, 313 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 unit-alpha-full rotate: false - xy: 1087, 179 + xy: 2131, 1231 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-cix-full rotate: false - xy: 656, 1052 + xy: 1363, 887 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 unit-crawler-full rotate: false - xy: 1037, 129 + xy: 2131, 1181 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-dagger-full rotate: false - xy: 1087, 129 + xy: 1693, 865 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-draug-full rotate: false - xy: 979, 113 + xy: 1868, 379 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-eruptor-full rotate: false - xy: 1897, 775 + xy: 2703, 819 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 unit-fortress-full rotate: false - xy: 423, 994 + xy: 1493, 853 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 unit-ghoul-full rotate: false - xy: 293, 460 + xy: 3581, 811 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 +unit-lich-full + rotate: false + xy: 2951, 1549 + size: 216, 240 + orig: 216, 240 + offset: 0, 0 + index: -1 +unit-mace-full + rotate: false + xy: 952, 103 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 unit-oculon-full rotate: false - xy: 1978, 1119 - size: 58, 48 - orig: 58, 48 + xy: 3203, 803 + size: 80, 80 + orig: 80, 80 offset: 0, 0 index: -1 unit-phantom-full rotate: false - xy: 1564, 753 + xy: 2509, 1329 size: 56, 56 orig: 56, 56 offset: 0, 0 @@ -4402,651 +4885,637 @@ unit-reaper-full index: -1 unit-revenant-full rotate: false - xy: 786, 1132 + xy: 973, 383 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 unit-spirit-full rotate: false - xy: 1069, 637 + xy: 2171, 1285 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-tau-full rotate: false - xy: 1622, 753 + xy: 2567, 1329 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 -unit-titan-full - rotate: false - xy: 813, 62 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 unit-trident-full rotate: false - xy: 423, 892 + xy: 1103, 459 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 unit-vanguard-full rotate: false - xy: 1069, 587 + xy: 2221, 1285 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 unit-wraith-full rotate: false - xy: 1029, 79 + xy: 2271, 1287 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 wave rotate: false - xy: 895, 613 + xy: 1831, 429 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 item-blast-compound rotate: false - xy: 1273, 517 + xy: 1086, 177 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal rotate: false - xy: 1239, 483 + xy: 1052, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper rotate: false - xy: 1205, 415 + xy: 1018, 41 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite rotate: false - xy: 1273, 483 + xy: 1086, 109 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead rotate: false - xy: 1205, 381 + xy: 1086, 75 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass rotate: false - xy: 1273, 449 + xy: 2281, 1211 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric rotate: false - xy: 1375, 517 + xy: 2399, 1217 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium rotate: false - xy: 1239, 381 + xy: 2473, 1227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite rotate: false - xy: 1307, 449 + xy: 2541, 1227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand rotate: false - xy: 1409, 517 + xy: 2609, 1227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap rotate: false - xy: 1239, 347 + xy: 1125, 201 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon rotate: false - xy: 1307, 415 + xy: 1120, 133 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod rotate: false - xy: 1443, 517 + xy: 1120, 31 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy rotate: false - xy: 1239, 313 + xy: 1193, 200 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium rotate: false - xy: 1307, 381 + xy: 1154, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium rotate: false - xy: 1375, 449 + xy: 1188, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid rotate: false - xy: 1273, 313 + xy: 1154, 64 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil rotate: false - xy: 1375, 415 + xy: 1188, 64 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag rotate: false - xy: 1341, 347 + xy: 1256, 165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water rotate: false - xy: 1205, 177 + xy: 1256, 29 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 blank rotate: false - xy: 631, 455 + xy: 3951, 1852 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 circle rotate: false - xy: 323, 1202 + xy: 1, 10 size: 201, 201 orig: 201, 201 offset: 0, 0 index: -1 shape-3 rotate: false - xy: 1093, 746 + xy: 1745, 364 size: 63, 63 orig: 63, 63 offset: 0, 0 index: -1 alpha rotate: false - xy: 1999, 1349 + xy: 3901, 1805 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 alpha-cell rotate: false - xy: 1788, 761 + xy: 2679, 1337 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 chaos-array rotate: false - xy: 978, 1627 + xy: 3655, 1179 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cix rotate: false - xy: 978, 1627 + xy: 3655, 1179 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 chaos-array-base rotate: false - xy: 1108, 1627 + xy: 3785, 1179 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 chaos-array-cell rotate: false - xy: 1238, 1627 + xy: 3915, 1179 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 chaos-array-leg rotate: false - xy: 1368, 1627 + xy: 583, 859 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cix-cell rotate: false - xy: 1897, 1039 + xy: 2343, 819 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 cix-foot rotate: false - xy: 1977, 1591 + xy: 4025, 1009 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 cix-joint-base rotate: false - xy: 1977, 1519 + xy: 4025, 937 size: 70, 70 orig: 70, 70 offset: 0, 0 index: -1 cix-leg rotate: false - xy: 615, 1 + xy: 291, 215 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 cix-leg-base rotate: false - xy: 1, 1 + xy: 1103, 561 size: 104, 64 orig: 104, 64 offset: 0, 0 index: -1 cix-old rotate: false - xy: 1897, 973 + xy: 2433, 819 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 crawler rotate: false - xy: 1987, 1019 + xy: 2879, 1337 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-base rotate: false - xy: 1987, 969 + xy: 2929, 1337 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-cell rotate: false - xy: 1987, 919 + xy: 2979, 1337 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-leg rotate: false - xy: 1987, 869 + xy: 3029, 1337 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger rotate: false - xy: 1987, 819 + xy: 2743, 715 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-base rotate: false - xy: 1987, 769 + xy: 2793, 753 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-leg rotate: false - xy: 895, 425 + xy: 2743, 665 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta rotate: false - xy: 887, 375 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -delta-base - rotate: false - xy: 887, 325 + xy: 2793, 703 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 delta-cell rotate: false - xy: 887, 275 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -delta-leg - rotate: false - xy: 887, 225 + xy: 2843, 753 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 draug rotate: false - xy: 887, 175 + xy: 2843, 703 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 draug-cell rotate: false - xy: 887, 125 + xy: 2893, 753 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 eradicator rotate: false - xy: 1, 67 + xy: 3525, 1309 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 eradicator-base rotate: false - xy: 1673, 1923 + xy: 3679, 1309 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 eradicator-cell rotate: false - xy: 1827, 1923 + xy: 3833, 1309 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 eradicator-leg rotate: false - xy: 323, 1076 + xy: 453, 989 size: 152, 124 orig: 152, 124 offset: 0, 0 index: -1 eruptor rotate: false - xy: 1897, 907 + xy: 2523, 819 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 eruptor-base rotate: false - xy: 557, 785 + xy: 3165, 1328 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 eruptor-cell rotate: false - xy: 1897, 841 + xy: 2613, 819 size: 88, 64 orig: 88, 64 offset: 0, 0 index: -1 eruptor-foot rotate: false - xy: 477, 1160 + xy: 407, 231 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 eruptor-joint rotate: false - xy: 1745, 1895 + xy: 1727, 691 size: 26, 26 orig: 26, 26 offset: 0, 0 index: -1 eruptor-leg rotate: false - xy: 1673, 1895 + xy: 713, 209 size: 36, 26 orig: 36, 26 offset: 0, 0 index: -1 eruptor-leg-base rotate: false - xy: 1773, 1765 + xy: 3987, 1309 size: 36, 26 orig: 36, 26 offset: 0, 0 index: -1 fortress rotate: false - xy: 786, 1050 + xy: 1363, 805 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 689, 788 + xy: 3231, 1328 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-cell rotate: false - xy: 321, 994 + xy: 1493, 935 size: 100, 80 orig: 100, 80 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 321, 830 + xy: 2031, 1277 size: 80, 60 orig: 80, 60 offset: 0, 0 index: -1 ghoul rotate: false - xy: 293, 756 + xy: 3285, 811 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 ghoul-cell rotate: false - xy: 293, 682 + xy: 3359, 811 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 glaive rotate: false - xy: 673, 1 + xy: 596, 21 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 glaive-cell rotate: false - xy: 731, 1 + xy: 2113, 1281 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 -javelin - rotate: false - xy: 945, 413 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -javelin-cell - rotate: false - xy: 937, 363 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -javelin-shield - rotate: false - xy: 937, 313 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 lich rotate: false - xy: 645, 1807 + xy: 2515, 1549 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 lich-cell rotate: false - xy: 1, 841 + xy: 2733, 1549 size: 216, 240 orig: 216, 240 offset: 0, 0 index: -1 +mace + rotate: false + xy: 2413, 687 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-base + rotate: false + xy: 2479, 687 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-cell + rotate: false + xy: 2545, 687 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mace-leg + rotate: false + xy: 2611, 687 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 oculon rotate: false - xy: 1981, 1933 - size: 58, 48 - orig: 58, 48 + xy: 2875, 803 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +oculon-armor + rotate: false + xy: 2611, 621 + size: 64, 64 + orig: 64, 64 offset: 0, 0 index: -1 oculon-base rotate: false - xy: 1053, 429 + xy: 2957, 803 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +oculon-base-old + rotate: false + xy: 2893, 653 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 oculon-cell rotate: false - xy: 987, 363 + xy: 3039, 803 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +oculon-cell-old + rotate: false + xy: 2943, 645 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 oculon-leg rotate: false - xy: 987, 313 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -omega - rotate: false - xy: 403, 810 + xy: 3121, 803 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 -omega-armor +oculon-leg-old rotate: false - xy: 565, 521 - size: 64, 64 - orig: 64, 64 + xy: 2993, 653 + size: 48, 48 + orig: 48, 48 offset: 0, 0 index: -1 -omega-base +oculon-old rotate: false - xy: 961, 621 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -omega-cell - rotate: false - xy: 1027, 687 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -omega-leg - rotate: false - xy: 1158, 753 - size: 56, 56 - orig: 56, 56 + xy: 2391, 1353 + size: 58, 48 + orig: 58, 48 offset: 0, 0 index: -1 phantom rotate: false - xy: 1216, 753 + xy: 1810, 371 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 phantom-cell rotate: false - xy: 1274, 753 + xy: 349, 215 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 power-cell rotate: false - xy: 1332, 753 + xy: 1081, 303 size: 56, 56 orig: 56, 56 offset: 0, 0 @@ -5067,4000 +5536,4021 @@ reaper-cell index: -1 revenant rotate: false - xy: 807, 1360 + xy: 3954, 1611 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 revenant-cell rotate: false - xy: 786, 1246 + xy: 843, 253 size: 112, 112 orig: 112, 112 offset: 0, 0 index: -1 spirit rotate: false - xy: 1087, 379 + xy: 3443, 661 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spirit-cell rotate: false - xy: 1087, 329 + xy: 3493, 661 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tau rotate: false - xy: 1390, 753 + xy: 1081, 245 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 tau-base rotate: false - xy: 1087, 279 + xy: 3543, 661 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 tau-cell rotate: false - xy: 1448, 753 + xy: 1679, 305 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 tau-leg rotate: false - xy: 1087, 229 + xy: 3593, 661 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -titan - rotate: false - xy: 829, 524 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -titan-base - rotate: false - xy: 829, 458 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -titan-cell - rotate: false - xy: 821, 392 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -titan-leg - rotate: false - xy: 821, 326 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 trident rotate: false - xy: 321, 892 + xy: 1595, 915 size: 100, 100 orig: 100, 100 offset: 0, 0 index: -1 trident-cell rotate: false - xy: 1506, 753 + xy: 2451, 1329 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 vanguard rotate: false - xy: 1079, 79 + xy: 2321, 1287 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 vanguard-cell rotate: false - xy: 1119, 645 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -wraith - rotate: false - xy: 1169, 646 + xy: 2181, 1235 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 artillery rotate: false - xy: 789, 4 + xy: 2729, 1329 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 -beam-weapon - rotate: false - xy: 1838, 761 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 chaos rotate: false - xy: 895, 475 + xy: 1023, 245 size: 56, 136 orig: 56, 136 offset: 0, 0 index: -1 eradication rotate: false - xy: 1390, 1107 + xy: 1433, 513 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 eruption rotate: false - xy: 889, 17 + xy: 2943, 745 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flakgun rotate: false - xy: 929, 75 + xy: 2993, 753 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flamethrower rotate: false - xy: 939, 17 + xy: 3043, 745 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 heal-weapon rotate: false - xy: 1019, 629 + xy: 3093, 753 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 heal-weapon-mount rotate: false - xy: 1085, 695 + xy: 3143, 753 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 large-weapon rotate: false - xy: 937, 263 + xy: 3443, 711 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lich-missiles rotate: false - xy: 937, 213 + xy: 3493, 761 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles rotate: false - xy: 1053, 529 + xy: 3593, 711 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles-mount rotate: false - xy: 1053, 479 + xy: 2793, 653 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 mount-weapon rotate: false - xy: 1003, 429 + xy: 2843, 653 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 reaper-weapon rotate: false - xy: 987, 263 + xy: 3043, 645 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 revenant-missiles rotate: false - xy: 987, 213 + xy: 3093, 653 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-basic-weapon rotate: false - xy: 1037, 329 + xy: 3243, 653 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 small-weapon rotate: false - xy: 1037, 279 + xy: 3293, 661 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 weapon rotate: false - xy: 1119, 595 + xy: 2181, 1185 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 +wraith + rotate: false + xy: 2231, 1235 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +beam-weapon + rotate: false + xy: 2793, 803 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 +beam-weapon + rotate: false + xy: 2793, 803 + size: 80, 80 + orig: 80, 80 + offset: 0, 0 + index: -1 sprites2.png -size: 2048,1024 -format: RGBA8888 -filter: Nearest,Nearest +size: 4096,512 +format: rgba8888 +filter: nearest,nearest repeat: none rubble-1-0 rotate: false - xy: 1933, 723 + xy: 2793, 39 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-1-1 rotate: false - xy: 839, 363 + xy: 467, 77 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-0 rotate: false - xy: 1335, 191 + xy: 533, 77 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-1 rotate: false - xy: 1401, 191 + xy: 599, 77 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-3-0 rotate: false - xy: 1237, 189 + xy: 2793, 105 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-4-0 rotate: false - xy: 1827, 115 + xy: 143, 13 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 rubble-5-0 rotate: false - xy: 1887, 387 + xy: 1401, 11 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 rubble-6-0 rotate: false - xy: 1043, 33 + xy: 2427, 9 size: 192, 192 orig: 192, 192 offset: 0, 0 index: -1 rubble-7-0 rotate: false - xy: 817, 1 + xy: 3595, 7 size: 224, 224 orig: 224, 224 offset: 0, 0 index: -1 rubble-8-0 rotate: false - xy: 1611, 463 + xy: 3685, 237 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 scorch-0-0 rotate: false - xy: 675, 347 + xy: 1817, 91 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 scorch-0-1 rotate: false - xy: 757, 347 + xy: 385, 61 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 scorch-0-2 rotate: false - xy: 1957, 163 + xy: 1899, 91 size: 80, 80 orig: 80, 80 offset: 0, 0 index: -1 scorch-1-0 rotate: false - xy: 1933, 901 + xy: 3943, 241 size: 110, 110 orig: 110, 110 offset: 0, 0 index: -1 scorch-1-1 rotate: false - xy: 1933, 789 + xy: 1705, 61 size: 110, 110 orig: 110, 110 offset: 0, 0 index: -1 scorch-1-2 rotate: false - xy: 1237, 33 + xy: 273, 31 size: 110, 110 orig: 110, 110 offset: 0, 0 index: -1 scorch-2-0 rotate: false - xy: 1887, 245 + xy: 3943, 353 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 scorch-2-1 rotate: false - xy: 1543, 145 + xy: 1, 1 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 scorch-2-2 rotate: false - xy: 1685, 145 + xy: 1563, 31 size: 140, 140 orig: 140, 140 offset: 0, 0 index: -1 scorch-3-0 rotate: false - xy: 1543, 287 + xy: 2621, 31 size: 170, 170 orig: 170, 170 offset: 0, 0 index: -1 scorch-3-1 rotate: false - xy: 1715, 291 + xy: 1057, 1 size: 170, 170 orig: 170, 170 offset: 0, 0 index: -1 scorch-3-2 rotate: false - xy: 1869, 549 + xy: 1229, 1 size: 170, 170 orig: 170, 170 offset: 0, 0 index: -1 scorch-4-0 rotate: false - xy: 1139, 489 + xy: 3821, 35 size: 200, 200 orig: 200, 200 offset: 0, 0 index: -1 scorch-4-1 rotate: false - xy: 1139, 287 + xy: 2023, 1 size: 200, 200 orig: 200, 200 offset: 0, 0 index: -1 scorch-4-2 rotate: false - xy: 1341, 257 + xy: 2225, 1 size: 200, 200 orig: 200, 200 offset: 0, 0 index: -1 scorch-5-0 rotate: false - xy: 675, 429 + xy: 2899, 1 size: 230, 230 orig: 230, 230 offset: 0, 0 index: -1 scorch-5-1 rotate: false - xy: 907, 459 + xy: 3131, 1 size: 230, 230 orig: 230, 230 offset: 0, 0 index: -1 scorch-5-2 rotate: false - xy: 907, 227 + xy: 3363, 1 size: 230, 230 orig: 230, 230 offset: 0, 0 index: -1 scorch-6-0 rotate: false - xy: 293, 47 + xy: 2899, 233 size: 260, 260 orig: 260, 260 offset: 0, 0 index: -1 scorch-6-1 rotate: false - xy: 555, 77 + xy: 3161, 233 size: 260, 260 orig: 260, 260 offset: 0, 0 index: -1 scorch-6-2 rotate: false - xy: 1349, 459 + xy: 3423, 233 size: 260, 260 orig: 260, 260 offset: 0, 0 index: -1 scorch-7-0 rotate: false - xy: 1, 17 + xy: 2023, 203 size: 290, 290 orig: 290, 290 offset: 0, 0 index: -1 scorch-7-1 rotate: false - xy: 1349, 721 + xy: 2315, 203 size: 290, 290 orig: 290, 290 offset: 0, 0 index: -1 scorch-7-2 rotate: false - xy: 1641, 721 + xy: 2607, 203 size: 290, 290 orig: 290, 290 offset: 0, 0 index: -1 scorch-8-0 rotate: false - xy: 353, 339 + xy: 1057, 173 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 scorch-8-1 rotate: false - xy: 705, 691 + xy: 1379, 173 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 scorch-8-2 rotate: false - xy: 1027, 691 + xy: 1701, 173 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 scorch-9-0 rotate: false - xy: 1, 661 + xy: 1, 143 size: 350, 350 orig: 350, 350 offset: 0, 0 index: -1 scorch-9-1 rotate: false - xy: 1, 309 + xy: 353, 143 size: 350, 350 orig: 350, 350 offset: 0, 0 index: -1 scorch-9-2 rotate: false - xy: 353, 661 + xy: 705, 143 size: 350, 350 orig: 350, 350 offset: 0, 0 index: -1 sprites3.png -size: 2048,512 -format: RGBA8888 -filter: Nearest,Nearest +size: 4096,256 +format: rgba8888 +filter: nearest,nearest repeat: none char1 rotate: false - xy: 1281, 459 + xy: 2311, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char2 rotate: false - xy: 1315, 459 + xy: 101, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char3 rotate: false - xy: 1349, 459 + xy: 2345, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cliff rotate: false - xy: 1383, 459 + xy: 135, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cliffs1 rotate: false - xy: 1417, 459 + xy: 2379, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal1 rotate: false - xy: 1451, 459 + xy: 169, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal2 rotate: false - xy: 1485, 459 + xy: 2413, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal3 rotate: false - xy: 1519, 459 + xy: 203, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper1 rotate: false - xy: 1553, 459 + xy: 2447, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper2 rotate: false - xy: 1587, 459 + xy: 237, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper3 rotate: false - xy: 1621, 459 + xy: 2481, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters1 rotate: false - xy: 1655, 459 + xy: 271, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters2 rotate: false - xy: 1689, 459 + xy: 2515, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters3 rotate: false - xy: 1723, 459 + xy: 305, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters4 rotate: false - xy: 1757, 459 + xy: 2549, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters5 rotate: false - xy: 1791, 459 + xy: 339, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 craters6 rotate: false - xy: 1825, 459 + xy: 2583, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal-large rotate: false - xy: 687, 329 + xy: 1569, 83 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dark-metal1 rotate: false - xy: 1859, 459 + xy: 373, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-metal2 rotate: false - xy: 1893, 459 + xy: 2617, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1 rotate: false - xy: 1927, 459 + xy: 407, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-edge rotate: false - xy: 1, 395 + xy: 1, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-2 rotate: false - xy: 1961, 459 + xy: 2651, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-edge rotate: false - xy: 1, 297 + xy: 1, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-3 rotate: false - xy: 1995, 459 + xy: 441, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-edge rotate: false - xy: 99, 395 + xy: 99, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-4 rotate: false - xy: 753, 361 + xy: 2685, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-edge rotate: false - xy: 1, 199 + xy: 99, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-5 rotate: false - xy: 753, 327 + xy: 475, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-edge rotate: false - xy: 99, 297 + xy: 197, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-panel-6 rotate: false - xy: 753, 293 + xy: 2719, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-edge rotate: false - xy: 197, 395 + xy: 197, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-edge rotate: false - xy: 1, 101 + xy: 295, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-tainted-water rotate: false - xy: 525, 1 + xy: 2787, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-edge rotate: false - xy: 99, 199 + xy: 295, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-tainted-water1 rotate: false - xy: 655, 131 + xy: 577, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water2 rotate: false - xy: 753, 259 + xy: 2821, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water3 rotate: false - xy: 689, 179 + xy: 611, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water rotate: false - xy: 689, 145 + xy: 2855, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-edge rotate: false - xy: 197, 297 + xy: 393, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 darksand-water1 rotate: false - xy: 737, 225 + xy: 645, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water2 rotate: false - xy: 1181, 409 + xy: 2889, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water3 rotate: false - xy: 1215, 409 + xy: 679, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand1 rotate: false - xy: 491, 1 + xy: 509, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand2 rotate: false - xy: 557, 67 + xy: 2753, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand3 rotate: false - xy: 655, 165 + xy: 543, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater rotate: false - xy: 1249, 409 + xy: 2923, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 deepwater-edge rotate: false - xy: 295, 395 + xy: 393, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dunerocks-large rotate: false - xy: 785, 427 + xy: 1667, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dunerocks1 rotate: false - xy: 1283, 425 + xy: 713, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dunerocks2 rotate: false - xy: 1317, 425 + xy: 2957, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 edge rotate: false - xy: 1351, 425 + xy: 747, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 edge-stencil rotate: false - xy: 1, 3 + xy: 491, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 edgier rotate: false - xy: 1385, 425 + xy: 2991, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-edge rotate: false - xy: 99, 101 + xy: 491, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 grass1 rotate: false - xy: 1419, 425 + xy: 781, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass2 rotate: false - xy: 1453, 425 + xy: 3025, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass3 rotate: false - xy: 1487, 425 + xy: 815, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone-edge rotate: false - xy: 197, 199 + xy: 589, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 holostone1 rotate: false - xy: 1521, 425 + xy: 3059, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone2 rotate: false - xy: 1555, 425 + xy: 849, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone3 rotate: false - xy: 1589, 425 + xy: 3093, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock1 rotate: false - xy: 1623, 425 + xy: 883, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock2 rotate: false - xy: 1657, 425 + xy: 3127, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock3 rotate: false - xy: 1691, 425 + xy: 917, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-edge rotate: false - xy: 295, 297 + xy: 589, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-snow-edge rotate: false - xy: 393, 395 + xy: 687, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ice-snow1 rotate: false - xy: 1827, 425 + xy: 985, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow2 rotate: false - xy: 1861, 425 + xy: 3229, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow3 rotate: false - xy: 1895, 425 + xy: 1019, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice1 rotate: false - xy: 1725, 425 + xy: 3161, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice2 rotate: false - xy: 1759, 425 + xy: 951, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice3 rotate: false - xy: 1793, 425 + xy: 3195, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks-large rotate: false - xy: 491, 35 + xy: 1733, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 icerocks1 rotate: false - xy: 1929, 425 + xy: 3263, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks2 rotate: false - xy: 1963, 425 + xy: 1053, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock-edge rotate: false - xy: 99, 3 + xy: 687, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ignarock1 rotate: false - xy: 1997, 425 + xy: 3297, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock2 rotate: false - xy: 771, 225 + xy: 1087, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock3 rotate: false - xy: 1283, 391 + xy: 3331, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead1 rotate: false - xy: 1317, 391 + xy: 1121, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead2 rotate: false - xy: 1351, 391 + xy: 3365, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 lead3 rotate: false - xy: 1385, 391 + xy: 1155, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock1 rotate: false - xy: 1419, 391 + xy: 3399, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock2 rotate: false - xy: 1453, 391 + xy: 1189, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock3 rotate: false - xy: 1487, 391 + xy: 3433, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor rotate: false - xy: 1521, 391 + xy: 1223, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2 rotate: false - xy: 1555, 391 + xy: 3467, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-edge rotate: false - xy: 197, 101 + xy: 785, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-3 rotate: false - xy: 1589, 391 + xy: 1257, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-edge rotate: false - xy: 295, 199 + xy: 785, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-5 rotate: false - xy: 1623, 391 + xy: 3501, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-edge rotate: false - xy: 393, 297 + xy: 883, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-damaged-edge rotate: false - xy: 491, 395 + xy: 883, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 metal-floor-damaged1 rotate: false - xy: 1657, 391 + xy: 1291, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged2 rotate: false - xy: 1691, 391 + xy: 3535, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged3 rotate: false - xy: 1725, 391 + xy: 1325, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-edge rotate: false - xy: 197, 3 + xy: 981, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 moss-edge rotate: false - xy: 295, 101 + xy: 981, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 moss1 rotate: false - xy: 1759, 391 + xy: 3569, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss2 rotate: false - xy: 1793, 391 + xy: 1359, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss3 rotate: false - xy: 1827, 391 + xy: 3603, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal1 rotate: false - xy: 1861, 391 + xy: 1393, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal2 rotate: false - xy: 1895, 391 + xy: 3637, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-coal3 rotate: false - xy: 1929, 391 + xy: 1427, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper1 rotate: false - xy: 1963, 391 + xy: 3671, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper2 rotate: false - xy: 1997, 391 + xy: 1461, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-copper3 rotate: false - xy: 723, 179 + xy: 3705, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead1 rotate: false - xy: 723, 145 + xy: 1495, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead2 rotate: false - xy: 757, 191 + xy: 3739, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-lead3 rotate: false - xy: 757, 157 + xy: 1529, 17 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap1 rotate: false - xy: 689, 111 + xy: 3773, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap2 rotate: false - xy: 723, 111 + xy: 3807, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-scrap3 rotate: false - xy: 757, 123 + xy: 3841, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium1 rotate: false - xy: 791, 191 + xy: 3875, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium2 rotate: false - xy: 791, 157 + xy: 3909, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-thorium3 rotate: false - xy: 791, 123 + xy: 3943, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium1 rotate: false - xy: 757, 89 + xy: 3977, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium2 rotate: false - xy: 791, 89 + xy: 4011, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ore-titanium3 rotate: false - xy: 591, 99 + xy: 4045, 213 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles1 rotate: false - xy: 591, 65 + xy: 1569, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles2 rotate: false - xy: 625, 97 + xy: 1635, 115 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pebbles3 rotate: false - xy: 625, 63 + xy: 1603, 49 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pine rotate: false - xy: 687, 213 + xy: 1, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rocks-large rotate: false - xy: 589, 133 + xy: 1799, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rocks1 rotate: false - xy: 659, 77 + xy: 1563, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rocks2 rotate: false - xy: 693, 77 + xy: 1597, 15 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt rotate: false - xy: 659, 43 + xy: 2261, 163 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-edge rotate: false - xy: 393, 199 + xy: 1079, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 saltrocks-large rotate: false - xy: 687, 263 + xy: 1865, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 saltrocks1 rotate: false - xy: 693, 43 + xy: 2311, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 saltrocks2 rotate: false - xy: 727, 55 + xy: 2345, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-edge rotate: false - xy: 491, 297 + xy: 1079, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sand-water rotate: false - xy: 761, 21 + xy: 2481, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-edge rotate: false - xy: 589, 395 + xy: 1177, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sand-water1 rotate: false - xy: 795, 21 + xy: 2515, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water2 rotate: false - xy: 787, 393 + xy: 2549, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water3 rotate: false - xy: 787, 359 + xy: 2583, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand1 rotate: false - xy: 761, 55 + xy: 2379, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand2 rotate: false - xy: 795, 55 + xy: 2413, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand3 rotate: false - xy: 727, 21 + xy: 2447, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks-large rotate: false - xy: 851, 427 + xy: 1931, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sandrocks1 rotate: false - xy: 821, 393 + xy: 2617, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks2 rotate: false - xy: 787, 325 + xy: 2651, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap1 rotate: false - xy: 855, 393 + xy: 2685, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap2 rotate: false - xy: 821, 359 + xy: 2719, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap3 rotate: false - xy: 787, 291 + xy: 2753, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-edge rotate: false - xy: 295, 3 + xy: 1177, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 shale1 rotate: false - xy: 889, 393 + xy: 2787, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale2 rotate: false - xy: 821, 325 + xy: 2821, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale3 rotate: false - xy: 855, 359 + xy: 2855, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shalerocks-large rotate: false - xy: 917, 427 + xy: 1997, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shalerocks1 rotate: false - xy: 923, 393 + xy: 2889, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shalerocks2 rotate: false - xy: 821, 291 + xy: 2923, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-large rotate: false - xy: 983, 427 + xy: 2063, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shrubs1 rotate: false - xy: 855, 325 + xy: 2957, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs2 rotate: false - xy: 889, 359 + xy: 2991, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag rotate: false - xy: 957, 393 + xy: 3025, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-edge rotate: false - xy: 393, 101 + xy: 1275, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-edge rotate: false - xy: 491, 199 + xy: 1275, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 snow-pine rotate: false - xy: 1181, 443 + xy: 2261, 197 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snow1 rotate: false - xy: 855, 291 + xy: 3059, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow2 rotate: false - xy: 889, 325 + xy: 3093, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow3 rotate: false - xy: 923, 359 + xy: 3127, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snowrocks-large rotate: false - xy: 1049, 427 + xy: 2129, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 snowrocks1 rotate: false - xy: 991, 393 + xy: 3161, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snowrocks2 rotate: false - xy: 889, 291 + xy: 3195, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn rotate: false - xy: 923, 325 + xy: 3229, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-edge rotate: false - xy: 589, 297 + xy: 1373, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 spore-moss1 rotate: false - xy: 957, 359 + xy: 3263, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss2 rotate: false - xy: 1025, 393 + xy: 3297, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss3 rotate: false - xy: 923, 291 + xy: 3331, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-pine rotate: false - xy: 1231, 443 + xy: 51, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 sporerocks-large rotate: false - xy: 1115, 427 + xy: 2195, 181 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sporerocks1 rotate: false - xy: 957, 325 + xy: 3365, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sporerocks2 rotate: false - xy: 991, 359 + xy: 3399, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-edge rotate: false - xy: 687, 395 + xy: 1373, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 stone1 rotate: false - xy: 1059, 393 + xy: 3433, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone2 rotate: false - xy: 957, 291 + xy: 3467, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone3 rotate: false - xy: 991, 325 + xy: 3501, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water rotate: false - xy: 1025, 359 + xy: 3535, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-edge rotate: false - xy: 393, 3 + xy: 1471, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tar rotate: false - xy: 1093, 393 + xy: 3569, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-edge rotate: false - xy: 491, 101 + xy: 1471, 51 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 tendrils1 rotate: false - xy: 991, 291 + xy: 3603, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils2 rotate: false - xy: 1025, 325 + xy: 3637, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tendrils3 rotate: false - xy: 1059, 359 + xy: 3671, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium1 rotate: false - xy: 1127, 393 + xy: 3705, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium2 rotate: false - xy: 1025, 291 + xy: 3739, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium3 rotate: false - xy: 1059, 325 + xy: 3773, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium1 rotate: false - xy: 1093, 359 + xy: 3807, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium2 rotate: false - xy: 1059, 291 + xy: 3841, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium3 rotate: false - xy: 1093, 325 + xy: 3875, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water rotate: false - xy: 1127, 359 + xy: 3909, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-edge rotate: false - xy: 589, 199 + xy: 1569, 149 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sprites4.png -size: 2048,1024 -format: RGBA8888 -filter: Nearest,Nearest +size: 4096,512 +format: rgba8888 +filter: nearest,nearest repeat: none +additive-reconstructor-icon-editor + rotate: false + xy: 2103, 391 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +air-factory-icon-editor + rotate: false + xy: 2201, 391 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 alloy-smelter-icon-editor rotate: false - xy: 875, 909 + xy: 2299, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 arc-icon-editor rotate: false - xy: 1077, 809 + xy: 4063, 455 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-icon-editor rotate: false - xy: 1111, 809 + xy: 4063, 421 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -basic-reconstructor-icon-editor - rotate: false - xy: 973, 909 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -block-forge-icon-editor - rotate: false - xy: 973, 909 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 battery-icon-editor rotate: false - xy: 1145, 809 + xy: 325, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 battery-large-icon-editor rotate: false - xy: 1071, 909 + xy: 2397, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 blast-drill-icon-editor rotate: false - xy: 323, 715 + xy: 1323, 359 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-mixer-icon-editor rotate: false - xy: 1, 5 + xy: 2043, 293 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border-editor rotate: false - xy: 1179, 809 + xy: 359, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +block-forge-icon-editor + rotate: false + xy: 2495, 391 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 block-loader-icon-editor rotate: false - xy: 1169, 909 + xy: 2593, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 block-unloader-icon-editor rotate: false - xy: 1267, 909 + xy: 2691, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 bridge-conduit-icon-editor rotate: false - xy: 1213, 809 + xy: 393, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-icon-editor rotate: false - xy: 1247, 809 + xy: 427, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 char-icon-editor rotate: false - xy: 1281, 809 + xy: 461, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char1 rotate: false - xy: 1281, 809 + xy: 461, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear-editor rotate: false - xy: 293, 360 + xy: 1323, 356 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 cliff-icon-editor rotate: false - xy: 1315, 809 + xy: 495, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cliffs-icon-editor rotate: false - xy: 1349, 809 + xy: 529, 3 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 coal-centrifuge-icon-editor rotate: false - xy: 1953, 941 + xy: 1131, 163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 combustion-generator-icon-editor rotate: false - xy: 1383, 809 + xy: 1357, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-icon-editor rotate: false - xy: 1417, 809 + xy: 1391, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 container-icon-editor rotate: false - xy: 747, 517 + xy: 1197, 163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 conveyor-icon-editor rotate: false - xy: 1451, 809 + xy: 1425, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-icon-editor rotate: false - xy: 1485, 809 + xy: 1459, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 copper-wall-large-icon-editor rotate: false - xy: 67, 5 + xy: 1263, 163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 core-foundation-icon-editor rotate: false - xy: 485, 877 + xy: 325, 37 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 core-nucleus-icon-editor rotate: false - xy: 323, 845 + xy: 1, 5 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 core-shard-icon-editor rotate: false - xy: 1365, 909 + xy: 2789, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 core-silo-icon-editor rotate: false - xy: 1, 201 + xy: 1161, 327 size: 160, 160 orig: 160, 160 offset: 0, 0 index: -1 craters-icon-editor rotate: false - xy: 1519, 809 + xy: 1493, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters1 rotate: false - xy: 1519, 809 + xy: 1493, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 cryofluidmixer-icon-editor rotate: false - xy: 421, 387 + xy: 683, 133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-icon-editor rotate: false - xy: 487, 387 + xy: 749, 133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cyclone-icon-editor rotate: false - xy: 1463, 909 + xy: 2887, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 dark-metal-icon-editor rotate: false - xy: 1553, 809 + xy: 1527, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-1-icon-editor rotate: false - xy: 1587, 809 + xy: 1561, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-1 rotate: false - xy: 1587, 809 + xy: 1561, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-2-icon-editor rotate: false - xy: 1621, 809 + xy: 1595, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-2 rotate: false - xy: 1621, 809 + xy: 1595, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-3-icon-editor rotate: false - xy: 1655, 809 + xy: 1629, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-3 rotate: false - xy: 1655, 809 + xy: 1629, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-4-icon-editor rotate: false - xy: 1689, 809 + xy: 1663, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-4 rotate: false - xy: 1689, 809 + xy: 1663, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-5-icon-editor rotate: false - xy: 1723, 809 + xy: 1697, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-5 rotate: false - xy: 1723, 809 + xy: 1697, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 dark-panel-6-icon-editor rotate: false - xy: 1757, 809 + xy: 1731, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-dark-panel-6 rotate: false - xy: 1757, 809 + xy: 1731, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-icon-editor rotate: false - xy: 1791, 809 + xy: 1765, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand1 rotate: false - xy: 1791, 809 + xy: 1765, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-tainted-water-icon-editor rotate: false - xy: 1825, 809 + xy: 1799, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 darksand-water-icon-editor rotate: false - xy: 1859, 809 + xy: 1833, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 data-processor-icon-editor rotate: false - xy: 1561, 909 + xy: 2985, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 deepwater-icon-editor rotate: false - xy: 1893, 809 + xy: 1867, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-deepwater rotate: false - xy: 1893, 809 + xy: 1867, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 differential-generator-icon-editor rotate: false - xy: 1659, 909 + xy: 3083, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 diode-icon-editor rotate: false - xy: 1953, 907 + xy: 1901, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 disassembler-icon-editor rotate: false - xy: 1757, 909 + xy: 3181, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 distributor-icon-editor rotate: false - xy: 553, 419 + xy: 815, 133 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-icon-editor rotate: false - xy: 813, 549 + xy: 1935, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 door-large-icon-editor rotate: false - xy: 619, 419 + xy: 683, 67 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dunerocks-icon-editor rotate: false - xy: 553, 385 + xy: 1969, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 duo-icon-editor rotate: false - xy: 587, 385 + xy: 2003, 227 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char2 rotate: false - xy: 621, 385 + xy: 2043, 259 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-char3 rotate: false - xy: 655, 385 + xy: 585, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -editor-clear - rotate: false - xy: 485, 865 - size: 10, 10 - orig: 10, 10 - offset: 0, 0 - index: -1 editor-craters2 rotate: false - xy: 689, 385 + xy: 619, 35 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-craters3 rotate: false - xy: 977, 709 + xy: 2109, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water1 rotate: false - xy: 391, 323 + xy: 2211, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water2 rotate: false - xy: 391, 289 + xy: 2245, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-tainted-water3 rotate: false - xy: 361, 225 + xy: 2279, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water1 rotate: false - xy: 361, 191 + xy: 2313, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water2 rotate: false - xy: 133, 1 + xy: 2347, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand-water3 rotate: false - xy: 167, 1 + xy: 2381, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand2 rotate: false - xy: 1987, 907 + xy: 2143, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-darksand3 rotate: false - xy: 813, 515 + xy: 2177, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass1 rotate: false - xy: 201, 1 + xy: 2415, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 grass-icon-editor rotate: false - xy: 201, 1 + xy: 2415, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass2 rotate: false - xy: 235, 1 + xy: 2449, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-grass3 rotate: false - xy: 269, 1 + xy: 2483, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone1 rotate: false - xy: 723, 385 + xy: 2517, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 holostone-icon-editor rotate: false - xy: 723, 385 + xy: 2517, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone2 rotate: false - xy: 303, 1 + xy: 2551, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-holostone3 rotate: false - xy: 847, 561 + xy: 2585, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock1 rotate: false - xy: 847, 527 + xy: 2619, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 hotrock-icon-editor rotate: false - xy: 847, 527 + xy: 2619, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock2 rotate: false - xy: 961, 675 + xy: 2653, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-hotrock3 rotate: false - xy: 895, 611 + xy: 2687, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow1 rotate: false - xy: 1179, 775 + xy: 2823, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-snow-icon-editor rotate: false - xy: 1179, 775 + xy: 2823, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow2 rotate: false - xy: 1213, 775 + xy: 2857, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice-snow3 rotate: false - xy: 1247, 775 + xy: 2891, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice1 rotate: false - xy: 1077, 775 + xy: 2721, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ice-icon-editor rotate: false - xy: 1077, 775 + xy: 2721, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice2 rotate: false - xy: 1111, 775 + xy: 2755, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ice3 rotate: false - xy: 1145, 775 + xy: 2789, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock1 rotate: false - xy: 1281, 775 + xy: 2925, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 ignarock-icon-editor rotate: false - xy: 1281, 775 + xy: 2925, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock2 rotate: false - xy: 1315, 775 + xy: 2959, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ignarock3 rotate: false - xy: 1349, 775 + xy: 2993, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock1 rotate: false - xy: 1383, 775 + xy: 3027, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 magmarock-icon-editor rotate: false - xy: 1383, 775 + xy: 3027, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock2 rotate: false - xy: 1417, 775 + xy: 3061, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-magmarock3 rotate: false - xy: 1451, 775 + xy: 3095, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor rotate: false - xy: 1485, 775 + xy: 3129, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-icon-editor rotate: false - xy: 1485, 775 + xy: 3129, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-2 rotate: false - xy: 1519, 775 + xy: 3163, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-2-icon-editor rotate: false - xy: 1519, 775 + xy: 3163, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-3 rotate: false - xy: 1553, 775 + xy: 3197, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-3-icon-editor rotate: false - xy: 1553, 775 + xy: 3197, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-5 rotate: false - xy: 1587, 775 + xy: 3231, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-5-icon-editor rotate: false - xy: 1587, 775 + xy: 3231, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged1 rotate: false - xy: 1621, 775 + xy: 3265, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 metal-floor-damaged-icon-editor rotate: false - xy: 1621, 775 + xy: 3265, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged2 rotate: false - xy: 1655, 775 + xy: 3299, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-metal-floor-damaged3 rotate: false - xy: 1689, 775 + xy: 3333, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss1 rotate: false - xy: 1723, 775 + xy: 3367, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 moss-icon-editor rotate: false - xy: 1723, 775 + xy: 3367, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss2 rotate: false - xy: 1757, 775 + xy: 3401, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-moss3 rotate: false - xy: 1791, 775 + xy: 3435, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal1 rotate: false - xy: 1825, 775 + xy: 3469, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal2 rotate: false - xy: 1859, 775 + xy: 3503, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-coal3 rotate: false - xy: 1893, 775 + xy: 3537, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper1 rotate: false - xy: 1011, 709 + xy: 3571, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper2 rotate: false - xy: 995, 675 + xy: 3605, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-copper3 rotate: false - xy: 895, 577 + xy: 3639, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead1 rotate: false - xy: 881, 543 + xy: 3673, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead2 rotate: false - xy: 929, 627 + xy: 3707, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-lead3 rotate: false - xy: 929, 593 + xy: 3741, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap1 rotate: false - xy: 963, 641 + xy: 3775, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap2 rotate: false - xy: 963, 607 + xy: 3809, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-scrap3 rotate: false - xy: 997, 641 + xy: 3843, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium1 rotate: false - xy: 997, 607 + xy: 3877, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium2 rotate: false - xy: 1029, 675 + xy: 3911, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-thorium3 rotate: false - xy: 1031, 641 + xy: 3945, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium1 rotate: false - xy: 1031, 607 + xy: 3979, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium2 rotate: false - xy: 1069, 741 + xy: 4013, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-ore-titanium3 rotate: false - xy: 1103, 741 + xy: 4047, 291 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles1 rotate: false - xy: 1137, 741 + xy: 881, 65 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles2 rotate: false - xy: 1171, 741 + xy: 1123, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-pebbles3 rotate: false - xy: 1205, 741 + xy: 1157, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-salt rotate: false - xy: 1239, 741 + xy: 1191, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salt-icon-editor rotate: false - xy: 1239, 741 + xy: 1191, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water1 rotate: false - xy: 1375, 741 + xy: 2037, 225 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water2 rotate: false - xy: 1409, 741 + xy: 931, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand-water3 rotate: false - xy: 1443, 741 + xy: 965, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand1 rotate: false - xy: 1273, 741 + xy: 1225, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-icon-editor rotate: false - xy: 1273, 741 + xy: 1225, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand2 rotate: false - xy: 1307, 741 + xy: 1259, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-sand3 rotate: false - xy: 1341, 741 + xy: 1293, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale1 rotate: false - xy: 1477, 741 + xy: 999, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shale-icon-editor rotate: false - xy: 1477, 741 + xy: 999, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale2 rotate: false - xy: 1511, 741 + xy: 1033, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-shale3 rotate: false - xy: 1545, 741 + xy: 1067, 81 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-slag rotate: false - xy: 1579, 741 + xy: 1101, 89 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 slag-icon-editor rotate: false - xy: 1579, 741 + xy: 1101, 89 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow1 rotate: false - xy: 1613, 741 + xy: 1135, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow2 rotate: false - xy: 1647, 741 + xy: 1169, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-snow3 rotate: false - xy: 1681, 741 + xy: 1203, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spawn rotate: false - xy: 1715, 741 + xy: 1237, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss1 rotate: false - xy: 1749, 741 + xy: 1271, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spore-moss-icon-editor rotate: false - xy: 1749, 741 + xy: 1271, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss2 rotate: false - xy: 1783, 741 + xy: 1305, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-spore-moss3 rotate: false - xy: 1817, 741 + xy: 1327, 129 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone1 rotate: false - xy: 1851, 741 + xy: 1339, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 stone-icon-editor rotate: false - xy: 1851, 741 + xy: 1339, 95 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone2 rotate: false - xy: 1885, 741 + xy: 563, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-stone3 rotate: false - xy: 881, 509 + xy: 597, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tainted-water rotate: false - xy: 847, 493 + xy: 631, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tainted-water-icon-editor rotate: false - xy: 847, 493 + xy: 631, 1 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tar rotate: false - xy: 929, 559 + xy: 1101, 55 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 tar-icon-editor rotate: false - xy: 929, 559 + xy: 1101, 55 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils1 rotate: false - xy: 963, 573 + xy: 1135, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils2 rotate: false - xy: 997, 573 + xy: 1169, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-tendrils3 rotate: false - xy: 1031, 573 + xy: 1203, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 editor-water rotate: false - xy: 915, 525 + xy: 1237, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 water-icon-editor rotate: false - xy: 915, 525 + xy: 1237, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +exponential-reconstructor-icon-editor + rotate: false + xy: 935, 263 + size: 224, 224 + orig: 224, 224 + offset: 0, 0 + index: -1 force-projector-icon-editor rotate: false - xy: 1855, 909 + xy: 3279, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fuse-icon-editor rotate: false - xy: 323, 357 + xy: 3377, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 graphite-press-icon-editor rotate: false - xy: 685, 419 + xy: 749, 67 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 +ground-factory-icon-editor + rotate: false + xy: 3475, 391 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 hail-icon-editor rotate: false - xy: 881, 475 + xy: 1271, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icerocks-icon-editor rotate: false - xy: 915, 491 + xy: 1305, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 illuminator-icon-editor rotate: false - xy: 915, 457 + xy: 1339, 61 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 impact-reactor-icon-editor rotate: false - xy: 1, 71 + xy: 1453, 359 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 incinerator-icon-editor rotate: false - xy: 963, 539 + xy: 2071, 225 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 inverted-sorter-icon-editor rotate: false - xy: 997, 539 + xy: 1329, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-source-icon-editor rotate: false - xy: 1031, 539 + xy: 1363, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-void-icon-editor rotate: false - xy: 949, 505 + xy: 1397, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 junction-icon-editor rotate: false - xy: 949, 471 + xy: 1431, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 kiln-icon-editor rotate: false - xy: 163, 167 + xy: 815, 67 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 lancer-icon-editor rotate: false - xy: 229, 167 + xy: 2109, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 large-overdrive-projector-icon-editor rotate: false - xy: 293, 259 + xy: 3573, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-icon-editor rotate: false - xy: 453, 747 + xy: 3671, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-icon-editor rotate: false - xy: 453, 649 + xy: 3769, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 launch-pad-large-icon-editor rotate: false - xy: 163, 233 + xy: 455, 37 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 liquid-junction-icon-editor rotate: false - xy: 983, 505 + xy: 1465, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-icon-editor rotate: false - xy: 983, 471 + xy: 1499, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-source-icon-editor rotate: false - xy: 1017, 505 + xy: 1533, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-icon-editor rotate: false - xy: 453, 551 + xy: 3867, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-void-icon-editor rotate: false - xy: 1017, 471 + xy: 1567, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-conveyor-icon-editor rotate: false - xy: 453, 453 + xy: 3965, 391 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mass-driver-icon-editor rotate: false - xy: 551, 779 + xy: 935, 165 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill-icon-editor rotate: false - xy: 295, 193 + xy: 2175, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-pump-icon-editor rotate: false - xy: 949, 437 + xy: 1601, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 meltdown-icon-editor rotate: false - xy: 323, 585 + xy: 1583, 359 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 melter-icon-editor rotate: false - xy: 983, 437 + xy: 1635, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mend-projector-icon-editor rotate: false - xy: 131, 101 + xy: 2241, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mender-icon-editor rotate: false - xy: 1017, 437 + xy: 1669, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 message-icon-editor rotate: false - xy: 1051, 505 + xy: 1703, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 multi-press-icon-editor rotate: false - xy: 551, 681 + xy: 1033, 165 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +multiplicative-reconstructor-icon-editor + rotate: false + xy: 163, 5 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +naval-factory-icon-editor + rotate: false + xy: 1161, 229 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-icon-editor rotate: false - xy: 649, 779 + xy: 1259, 229 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 overdrive-projector-icon-editor rotate: false - xy: 197, 101 + xy: 2307, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 overflow-gate-icon-editor rotate: false - xy: 1051, 471 + xy: 1737, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 payload-router-icon-editor rotate: false - xy: 551, 583 + xy: 1357, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pebbles-icon-editor rotate: false - xy: 1051, 437 + xy: 1771, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-icon-editor rotate: false - xy: 1931, 873 + xy: 1805, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-icon-editor rotate: false - xy: 1965, 873 + xy: 1839, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-icon-editor rotate: false - xy: 1931, 839 + xy: 1873, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-wall-large-icon-editor rotate: false - xy: 133, 35 + xy: 2373, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-icon-editor rotate: false - xy: 199, 35 + xy: 2439, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pine-icon-editor rotate: false - xy: 977, 793 + xy: 881, 149 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 plastanium-compressor-icon-editor rotate: false - xy: 263, 101 + xy: 2505, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-conveyor-icon-editor rotate: false - xy: 1965, 839 + xy: 1907, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-icon-editor rotate: false - xy: 1927, 805 + xy: 1941, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 plastanium-wall-large-icon-editor rotate: false - xy: 265, 35 + xy: 2571, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plated-conduit-icon-editor rotate: false - xy: 1961, 805 + xy: 1975, 193 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pneumatic-drill-icon-editor rotate: false - xy: 875, 843 + xy: 2637, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-node-icon-editor rotate: false - xy: 1927, 771 + xy: 1135, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-node-large-icon-editor rotate: false - xy: 941, 843 + xy: 2703, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 power-source-icon-editor rotate: false - xy: 1961, 771 + xy: 1169, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 power-void-icon-editor rotate: false - xy: 1999, 873 + xy: 1203, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-icon-editor rotate: false - xy: 1999, 839 + xy: 1237, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-icon-editor rotate: false - xy: 1995, 805 + xy: 1271, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pyratite-mixer-icon-editor rotate: false - xy: 1007, 843 + xy: 2769, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-icon-editor rotate: false - xy: 1995, 771 + xy: 1305, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +resupply-point-icon-editor + rotate: false + xy: 2835, 325 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 ripple-icon-editor rotate: false - xy: 649, 681 + xy: 1455, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rock-icon-editor rotate: false - xy: 845, 595 + xy: 881, 99 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 rocks-icon-editor rotate: false - xy: 1919, 737 + xy: 1339, 27 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rotary-pump-icon-editor rotate: false - xy: 1073, 843 + xy: 2901, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 router-icon-editor rotate: false - xy: 1953, 737 + xy: 1361, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 rtg-generator-icon-editor rotate: false - xy: 1139, 843 + xy: 2967, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 saltrocks-icon-editor rotate: false - xy: 1987, 737 + xy: 1395, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 salvo-icon-editor rotate: false - xy: 1205, 843 + xy: 3033, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sand-boulder-icon-editor rotate: false - xy: 425, 353 + xy: 1429, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sand-water-icon-editor rotate: false - xy: 425, 319 + xy: 1463, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 sandrocks-icon-editor rotate: false - xy: 459, 353 + xy: 1497, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scatter-icon-editor rotate: false - xy: 1271, 843 + xy: 3099, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-icon-editor rotate: false - xy: 459, 319 + xy: 1531, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-gigantic-icon-editor rotate: false - xy: 615, 877 + xy: 1713, 359 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 scrap-wall-huge-icon-editor rotate: false - xy: 747, 779 + xy: 1553, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-icon-editor rotate: false - xy: 493, 353 + xy: 1565, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall-large-icon-editor rotate: false - xy: 1337, 843 + xy: 3165, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 segment-icon-editor rotate: false - xy: 1403, 843 + xy: 3231, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 separator-icon-editor rotate: false - xy: 1469, 843 + xy: 3297, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shale-boulder-icon-editor rotate: false - xy: 493, 319 + xy: 1599, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shalerocks-icon-editor rotate: false - xy: 425, 285 + xy: 1633, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shock-mine-icon-editor rotate: false - xy: 459, 285 + xy: 1667, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 shrubs-icon-editor rotate: false - xy: 493, 285 + xy: 1701, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 silicon-crucible-icon-editor rotate: false - xy: 551, 485 + xy: 1651, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 silicon-smelter-icon-editor rotate: false - xy: 1535, 843 + xy: 3363, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 snow-icon-editor rotate: false - xy: 527, 351 + xy: 1735, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 snow-pine-icon-editor rotate: false - xy: 911, 661 + xy: 931, 115 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrock-icon-editor rotate: false - xy: 977, 743 + xy: 981, 115 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 snowrocks-icon-editor rotate: false - xy: 527, 317 + xy: 1769, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-icon-editor rotate: false - xy: 561, 351 + xy: 1803, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 solar-panel-large-icon-editor rotate: false - xy: 649, 583 + xy: 1749, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 sorter-icon-editor rotate: false - xy: 561, 317 + xy: 1837, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spawn-icon-editor rotate: false - xy: 595, 351 + xy: 1871, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 spectre-icon-editor rotate: false - xy: 323, 455 + xy: 1843, 359 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spore-cluster-icon-editor rotate: false - xy: 1027, 751 + xy: 1081, 123 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 spore-pine-icon-editor rotate: false - xy: 1027, 793 + xy: 1031, 115 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 spore-press-icon-editor rotate: false - xy: 1601, 843 + xy: 3429, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 sporerocks-icon-editor rotate: false - xy: 595, 317 + xy: 1905, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-tower-icon-editor rotate: false - xy: 1667, 843 + xy: 3495, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 surge-wall-icon-editor rotate: false - xy: 629, 351 + xy: 1939, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 surge-wall-large-icon-editor rotate: false - xy: 1733, 843 + xy: 3561, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 swarmer-icon-editor rotate: false - xy: 1799, 843 + xy: 3627, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 tendrils-icon-editor rotate: false - xy: 629, 317 + xy: 1973, 159 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 +tetrative-reconstructor-icon-editor + rotate: false + xy: 645, 199 + size: 288, 288 + orig: 288, 288 + offset: 0, 0 + index: -1 thermal-generator-icon-editor rotate: false - xy: 1865, 843 + xy: 3693, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thermal-pump-icon-editor rotate: false - xy: 747, 681 + xy: 1847, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-icon-editor rotate: false - xy: 649, 485 + xy: 1945, 261 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-wall-icon-editor rotate: false - xy: 663, 351 + xy: 2009, 191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 thorium-wall-large-icon-editor rotate: false - xy: 845, 777 + xy: 3759, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 thruster-icon-editor rotate: false - xy: 745, 877 + xy: 1973, 359 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 titanium-conveyor-icon-editor rotate: false - xy: 663, 317 + xy: 2043, 191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-icon-editor rotate: false - xy: 697, 351 + xy: 2007, 157 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-wall-large-icon-editor rotate: false - xy: 845, 711 + xy: 3825, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-icon-editor rotate: false - xy: 911, 777 + xy: 3891, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 underflow-gate-icon-editor rotate: false - xy: 697, 317 + xy: 2041, 157 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 unloader-icon-editor rotate: false - xy: 527, 283 + xy: 2077, 191 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 vault-icon-editor rotate: false - xy: 747, 583 + xy: 585, 69 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 water-extractor-icon-editor rotate: false - xy: 845, 645 + xy: 3957, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wave-icon-editor rotate: false - xy: 911, 711 + xy: 4023, 325 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 white-tree-dead-icon-editor rotate: false - xy: 1, 685 + xy: 1, 167 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 white-tree-icon-editor rotate: false - xy: 1, 363 + xy: 323, 167 size: 320, 320 orig: 320, 320 offset: 0, 0 index: -1 sprites5.png -size: 2048,1024 -format: RGBA8888 -filter: Nearest,Nearest +size: 4096,512 +format: rgba8888 +filter: nearest,nearest repeat: none alpha-bg rotate: false - xy: 1, 528 + xy: 1, 13 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 bar rotate: false - xy: 1318, 646 + xy: 3827, 278 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -9068,6910 +9558,7155 @@ bar index: -1 bar-top rotate: false - xy: 1289, 638 + xy: 3798, 278 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 offset: 0, 0 index: -1 +block-additive-reconstructor-large + rotate: false + xy: 2859, 418 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-additive-reconstructor-medium + rotate: false + xy: 821, 429 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-additive-reconstructor-small + rotate: false + xy: 781, 175 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-additive-reconstructor-tiny + rotate: false + xy: 309, 183 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-additive-reconstructor-xlarge + rotate: false + xy: 131, 93 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-air-factory-large + rotate: false + xy: 2901, 418 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-air-factory-medium + rotate: false + xy: 2583, 305 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-air-factory-small + rotate: false + xy: 3856, 290 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-air-factory-tiny + rotate: false + xy: 257, 25 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-air-factory-xlarge + rotate: false + xy: 771, 413 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 block-alloy-smelter-large rotate: false - xy: 2007, 983 + xy: 2943, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-alloy-smelter-medium rotate: false - xy: 881, 647 + xy: 2621, 334 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-alloy-smelter-small rotate: false - xy: 781, 690 + xy: 3882, 290 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-alloy-smelter-tiny rotate: false - xy: 301, 1 + xy: 3681, 264 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-alloy-smelter-xlarge rotate: false - xy: 1, 478 + xy: 259, 304 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-arc-large rotate: false - xy: 2007, 941 + xy: 2985, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-arc-medium rotate: false - xy: 881, 613 + xy: 2655, 334 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-arc-small rotate: false - xy: 80, 2 + xy: 3908, 290 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-arc-tiny rotate: false - xy: 319, 1 + xy: 3833, 260 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-arc-xlarge rotate: false - xy: 131, 608 + xy: 131, 43 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-armored-conveyor-large rotate: false - xy: 601, 574 + xy: 3027, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-armored-conveyor-medium rotate: false - xy: 915, 647 + xy: 2689, 334 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-armored-conveyor-small rotate: false - xy: 963, 417 + xy: 3934, 290 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-armored-conveyor-tiny rotate: false - xy: 337, 1 + xy: 1305, 18 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-armored-conveyor-xlarge rotate: false - xy: 771, 928 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-basic-reconstructor-large - rotate: false - xy: 351, 274 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-block-forge-large - rotate: false - xy: 351, 274 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -block-basic-reconstructor-medium - rotate: false - xy: 881, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-block-forge-medium - rotate: false - xy: 881, 579 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -block-basic-reconstructor-small - rotate: false - xy: 1289, 612 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-block-forge-small - rotate: false - xy: 1289, 612 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -block-basic-reconstructor-tiny - rotate: false - xy: 309, 698 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-block-forge-tiny - rotate: false - xy: 309, 698 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -block-basic-reconstructor-xlarge - rotate: false - xy: 259, 819 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -block-block-forge-xlarge - rotate: false - xy: 259, 819 + xy: 181, 93 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-battery-large rotate: false - xy: 401, 324 + xy: 3069, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-large rotate: false - xy: 451, 374 + xy: 3111, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-battery-large-medium rotate: false - xy: 949, 647 + xy: 2723, 334 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-large-small rotate: false - xy: 1376, 658 + xy: 3960, 290 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-large-tiny rotate: false - xy: 331, 598 + xy: 1331, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-battery-large-xlarge rotate: false - xy: 1, 428 + xy: 259, 254 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-battery-medium rotate: false - xy: 915, 613 + xy: 2757, 334 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-battery-small rotate: false - xy: 1376, 632 + xy: 3986, 290 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-battery-tiny rotate: false - xy: 929, 459 + xy: 1357, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-battery-xlarge rotate: false - xy: 51, 478 + xy: 181, 43 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-blast-drill-large rotate: false - xy: 501, 424 + xy: 3153, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-drill-medium rotate: false - xy: 983, 647 + xy: 2791, 334 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-drill-small rotate: false - xy: 106, 2 + xy: 4012, 290 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-drill-tiny rotate: false - xy: 132, 10 + xy: 1487, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-blast-drill-xlarge rotate: false - xy: 131, 558 + xy: 259, 204 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-blast-mixer-large rotate: false - xy: 551, 474 + xy: 3195, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-blast-mixer-medium rotate: false - xy: 949, 613 + xy: 2825, 334 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-blast-mixer-small rotate: false - xy: 989, 417 + xy: 4051, 337 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-blast-mixer-tiny rotate: false - xy: 1145, 425 + xy: 1383, 96 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-blast-mixer-xlarge rotate: false - xy: 181, 608 + xy: 259, 154 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-block-forge-large + rotate: false + xy: 3237, 418 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-block-forge-medium + rotate: false + xy: 2861, 384 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-block-forge-small + rotate: false + xy: 4049, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-block-forge-tiny + rotate: false + xy: 1435, 106 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-block-forge-xlarge + rotate: false + xy: 857, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-block-loader-large rotate: false - xy: 601, 532 + xy: 3279, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-loader-medium rotate: false - xy: 915, 579 + xy: 2895, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-loader-small rotate: false - xy: 1015, 417 + xy: 3856, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-loader-tiny rotate: false - xy: 2026, 609 + xy: 309, 165 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-block-loader-xlarge rotate: false - xy: 259, 769 + xy: 907, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-block-unloader-large rotate: false - xy: 643, 574 + xy: 3321, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-block-unloader-medium rotate: false - xy: 1017, 647 + xy: 2929, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-block-unloader-small rotate: false - xy: 1041, 417 + xy: 3882, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-block-unloader-tiny rotate: false - xy: 1901, 520 + xy: 257, 7 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-block-unloader-xlarge rotate: false - xy: 1, 378 + xy: 957, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-bridge-conduit-large rotate: false - xy: 351, 232 + xy: 3363, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conduit-medium rotate: false - xy: 983, 613 + xy: 2963, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conduit-small rotate: false - xy: 1067, 417 + xy: 3908, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conduit-tiny rotate: false - xy: 1927, 551 + xy: 3833, 242 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-bridge-conduit-xlarge rotate: false - xy: 51, 428 + xy: 1007, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-bridge-conveyor-large rotate: false - xy: 643, 532 + xy: 3405, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-bridge-conveyor-medium rotate: false - xy: 949, 579 + xy: 2997, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-bridge-conveyor-small rotate: false - xy: 1093, 417 + xy: 3934, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-bridge-conveyor-tiny rotate: false - xy: 1953, 588 + xy: 1487, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-bridge-conveyor-xlarge rotate: false - xy: 181, 558 + xy: 1057, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-char-large rotate: false - xy: 685, 574 + xy: 3447, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-char-medium rotate: false - xy: 1051, 647 + xy: 3031, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-char-small rotate: false - xy: 1119, 417 + xy: 3960, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-char-tiny rotate: false - xy: 309, 680 + xy: 1505, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-char-xlarge rotate: false - xy: 259, 719 + xy: 1107, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cliff-large rotate: false - xy: 351, 190 + xy: 3489, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cliff-medium rotate: false - xy: 1017, 613 + xy: 3065, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliff-small rotate: false - xy: 1402, 632 + xy: 3986, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cliff-tiny rotate: false - xy: 331, 580 + xy: 1453, 106 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cliff-xlarge rotate: false - xy: 1, 328 + xy: 1157, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cliffs-large rotate: false - xy: 685, 532 + xy: 3531, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cliffs-medium rotate: false - xy: 983, 579 + xy: 3099, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cliffs-small rotate: false - xy: 1428, 632 + xy: 4012, 264 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cliffs-tiny rotate: false - xy: 1953, 570 + xy: 1505, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cliffs-xlarge rotate: false - xy: 51, 378 + xy: 1207, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-coal-centrifuge-large rotate: false - xy: 727, 574 + xy: 3573, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-coal-centrifuge-medium rotate: false - xy: 1085, 647 + xy: 3133, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-coal-centrifuge-small rotate: false - xy: 1454, 632 + xy: 4038, 285 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-coal-centrifuge-tiny rotate: false - xy: 1971, 588 + xy: 1523, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-coal-centrifuge-xlarge rotate: false - xy: 259, 669 + xy: 1257, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-combustion-generator-large rotate: false - xy: 351, 148 + xy: 3615, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-combustion-generator-medium rotate: false - xy: 1051, 613 + xy: 3167, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-combustion-generator-small rotate: false - xy: 1480, 632 + xy: 4038, 259 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-combustion-generator-tiny rotate: false - xy: 1971, 570 + xy: 1523, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-combustion-generator-xlarge rotate: false - xy: 1, 278 + xy: 1307, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-conduit-large rotate: false - xy: 727, 532 + xy: 3657, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conduit-medium rotate: false - xy: 1017, 579 + xy: 3201, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conduit-small rotate: false - xy: 1506, 632 + xy: 4064, 285 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conduit-tiny rotate: false - xy: 2027, 813 + xy: 1541, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-conduit-xlarge rotate: false - xy: 51, 328 + xy: 1357, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-container-large rotate: false - xy: 351, 106 + xy: 3699, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-container-medium rotate: false - xy: 1119, 647 + xy: 3235, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-container-small rotate: false - xy: 1532, 632 + xy: 4064, 259 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-container-tiny rotate: false - xy: 2027, 795 + xy: 1541, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-container-xlarge rotate: false - xy: 1, 228 + xy: 1407, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-conveyor-large rotate: false - xy: 351, 64 + xy: 3741, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-conveyor-medium rotate: false - xy: 1153, 660 + xy: 3269, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-conveyor-small rotate: false - xy: 1558, 632 + xy: 2849, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-conveyor-tiny rotate: false - xy: 2027, 777 + xy: 1559, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-conveyor-xlarge rotate: false - xy: 51, 278 + xy: 1457, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-copper-wall-large rotate: false - xy: 351, 22 + xy: 3783, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-large rotate: false - xy: 769, 536 + xy: 3825, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-copper-wall-large-medium rotate: false - xy: 1085, 613 + xy: 3303, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-large-small rotate: false - xy: 1584, 632 + xy: 2875, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-large-tiny rotate: false - xy: 355, 4 + xy: 1559, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-copper-wall-large-xlarge rotate: false - xy: 1, 178 + xy: 1507, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-copper-wall-medium rotate: false - xy: 1051, 579 + xy: 3337, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-copper-wall-small rotate: false - xy: 1610, 632 + xy: 2901, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-copper-wall-tiny rotate: false - xy: 373, 4 + xy: 1577, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-copper-wall-xlarge rotate: false - xy: 51, 228 + xy: 1557, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-foundation-large rotate: false - xy: 811, 536 + xy: 3867, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-foundation-medium rotate: false - xy: 1119, 613 + xy: 3371, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-foundation-small rotate: false - xy: 1636, 632 + xy: 2927, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-foundation-tiny rotate: false - xy: 391, 4 + xy: 1577, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-foundation-xlarge rotate: false - xy: 1, 128 + xy: 1607, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-nucleus-large rotate: false - xy: 853, 536 + xy: 3909, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-nucleus-medium rotate: false - xy: 1153, 626 + xy: 3405, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-nucleus-small rotate: false - xy: 1662, 632 + xy: 2953, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-nucleus-tiny rotate: false - xy: 409, 4 + xy: 1595, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-nucleus-xlarge rotate: false - xy: 51, 178 + xy: 1657, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-shard-large rotate: false - xy: 601, 490 + xy: 3951, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-shard-medium rotate: false - xy: 1085, 579 + xy: 3439, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-shard-small rotate: false - xy: 1688, 632 + xy: 2979, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-shard-tiny rotate: false - xy: 1927, 533 + xy: 1595, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-shard-xlarge rotate: false - xy: 1, 78 + xy: 1707, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-core-silo-large rotate: false - xy: 643, 490 + xy: 3993, 418 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-core-silo-medium rotate: false - xy: 1119, 579 + xy: 3473, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-core-silo-small rotate: false - xy: 1714, 632 + xy: 3005, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-core-silo-tiny rotate: false - xy: 1355, 510 + xy: 1613, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-core-silo-xlarge rotate: false - xy: 51, 128 + xy: 1757, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-craters-large rotate: false - xy: 685, 490 + xy: 131, 1 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-craters-medium rotate: false - xy: 1153, 592 + xy: 3507, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-craters-small rotate: false - xy: 1740, 632 + xy: 3031, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-craters-tiny rotate: false - xy: 1373, 510 + xy: 1613, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-craters-xlarge rotate: false - xy: 1, 28 + xy: 1807, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cryofluidmixer-large rotate: false - xy: 727, 490 + xy: 173, 1 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cryofluidmixer-medium rotate: false - xy: 895, 545 + xy: 3541, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cryofluidmixer-small rotate: false - xy: 1766, 632 + xy: 3057, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cryofluidmixer-tiny rotate: false - xy: 1391, 510 + xy: 1631, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cryofluidmixer-xlarge rotate: false - xy: 51, 78 + xy: 1857, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cultivator-large rotate: false - xy: 769, 494 + xy: 215, 1 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cultivator-medium rotate: false - xy: 929, 545 + xy: 3575, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cultivator-small rotate: false - xy: 1792, 632 + xy: 3083, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cultivator-tiny rotate: false - xy: 1409, 510 + xy: 1631, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cultivator-xlarge rotate: false - xy: 51, 28 + xy: 1907, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-cyclone-large rotate: false - xy: 811, 494 + xy: 845, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-cyclone-medium rotate: false - xy: 963, 545 + xy: 3609, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-cyclone-small rotate: false - xy: 1818, 632 + xy: 3109, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-cyclone-tiny rotate: false - xy: 1427, 510 + xy: 1649, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-cyclone-xlarge rotate: false - xy: 857, 975 + xy: 1957, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-metal-large rotate: false - xy: 853, 494 + xy: 887, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-metal-medium rotate: false - xy: 997, 545 + xy: 3643, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-metal-small rotate: false - xy: 1844, 632 + xy: 3135, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-metal-tiny rotate: false - xy: 1445, 510 + xy: 1649, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-metal-xlarge rotate: false - xy: 907, 975 + xy: 2007, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-1-large rotate: false - xy: 393, 274 + xy: 929, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-1-medium rotate: false - xy: 895, 511 + xy: 3677, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-1-small rotate: false - xy: 1870, 632 + xy: 3161, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-1-tiny rotate: false - xy: 1463, 510 + xy: 1667, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-1-xlarge rotate: false - xy: 957, 975 + xy: 2057, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-2-large rotate: false - xy: 393, 232 + xy: 971, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-2-medium rotate: false - xy: 929, 511 + xy: 3711, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-2-small rotate: false - xy: 1896, 632 + xy: 3187, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-2-tiny rotate: false - xy: 1481, 510 + xy: 1667, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-2-xlarge rotate: false - xy: 1007, 975 + xy: 2107, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-3-large rotate: false - xy: 393, 190 + xy: 1013, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-3-medium rotate: false - xy: 963, 511 + xy: 3745, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-3-small rotate: false - xy: 1922, 632 + xy: 3213, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-3-tiny rotate: false - xy: 1499, 510 + xy: 1685, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-3-xlarge rotate: false - xy: 1057, 975 + xy: 2157, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-4-large rotate: false - xy: 393, 148 + xy: 1055, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-4-medium rotate: false - xy: 997, 511 + xy: 3779, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-4-small rotate: false - xy: 1948, 632 + xy: 3239, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-4-tiny rotate: false - xy: 1517, 510 + xy: 1685, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-4-xlarge rotate: false - xy: 1107, 975 + xy: 2207, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-5-large rotate: false - xy: 393, 106 + xy: 1097, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-5-medium rotate: false - xy: 1031, 545 + xy: 3813, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-5-small rotate: false - xy: 1974, 632 + xy: 3265, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-5-tiny rotate: false - xy: 1535, 510 + xy: 1703, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-5-xlarge rotate: false - xy: 1157, 975 + xy: 2257, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dark-panel-6-large rotate: false - xy: 393, 64 + xy: 1139, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dark-panel-6-medium rotate: false - xy: 1031, 511 + xy: 3847, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dark-panel-6-small rotate: false - xy: 997, 391 + xy: 3291, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dark-panel-6-tiny rotate: false - xy: 1553, 510 + xy: 1703, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dark-panel-6-xlarge rotate: false - xy: 1207, 975 + xy: 2307, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-darksand-large rotate: false - xy: 393, 22 + xy: 1181, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-medium rotate: false - xy: 1065, 545 + xy: 3881, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-small rotate: false - xy: 997, 365 + xy: 3317, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-large rotate: false - xy: 443, 324 + xy: 1223, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-tainted-water-medium rotate: false - xy: 1065, 511 + xy: 3915, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-tainted-water-small rotate: false - xy: 1023, 391 + xy: 3343, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-tainted-water-tiny rotate: false - xy: 1571, 510 + xy: 1721, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-tainted-water-xlarge rotate: false - xy: 1257, 975 + xy: 2357, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-darksand-tiny rotate: false - xy: 1589, 510 + xy: 1721, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-water-large rotate: false - xy: 435, 282 + xy: 1265, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-darksand-water-medium rotate: false - xy: 1099, 545 + xy: 3949, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-darksand-water-small rotate: false - xy: 997, 339 + xy: 3369, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-darksand-water-tiny rotate: false - xy: 1607, 510 + xy: 1739, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-darksand-water-xlarge rotate: false - xy: 1307, 975 + xy: 2407, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-darksand-xlarge rotate: false - xy: 1357, 975 + xy: 2457, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-data-processor-large rotate: false - xy: 435, 240 + xy: 1307, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-data-processor-medium rotate: false - xy: 1099, 511 + xy: 3983, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-data-processor-small rotate: false - xy: 1023, 365 + xy: 3395, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-data-processor-tiny rotate: false - xy: 1625, 510 + xy: 1739, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-data-processor-xlarge rotate: false - xy: 1407, 975 + xy: 2507, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-deepwater-large rotate: false - xy: 435, 198 + xy: 1349, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-deepwater-medium rotate: false - xy: 1133, 545 + xy: 938, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-deepwater-small rotate: false - xy: 1049, 391 + xy: 3421, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-deepwater-tiny rotate: false - xy: 1643, 510 + xy: 1757, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-deepwater-xlarge rotate: false - xy: 1457, 975 + xy: 2557, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-differential-generator-large rotate: false - xy: 435, 156 + xy: 1391, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-differential-generator-medium rotate: false - xy: 1133, 511 + xy: 972, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-differential-generator-small rotate: false - xy: 1023, 339 + xy: 3447, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-differential-generator-tiny rotate: false - xy: 1661, 510 + xy: 1757, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-differential-generator-xlarge rotate: false - xy: 1507, 975 + xy: 2607, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-diode-large rotate: false - xy: 435, 114 + xy: 1433, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-diode-medium rotate: false - xy: 1979, 899 + xy: 1006, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-diode-small rotate: false - xy: 1049, 365 + xy: 3473, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-diode-tiny rotate: false - xy: 1679, 510 + xy: 1775, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-diode-xlarge rotate: false - xy: 1557, 975 + xy: 2657, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-disassembler-large rotate: false - xy: 435, 72 + xy: 1475, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-disassembler-medium rotate: false - xy: 2013, 907 + xy: 1040, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-disassembler-small rotate: false - xy: 1075, 391 + xy: 3499, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-disassembler-tiny rotate: false - xy: 1697, 510 + xy: 1775, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-disassembler-xlarge rotate: false - xy: 1607, 975 + xy: 2707, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-distributor-large rotate: false - xy: 435, 30 + xy: 1517, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-distributor-medium rotate: false - xy: 929, 477 + xy: 1074, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-distributor-small rotate: false - xy: 1049, 339 + xy: 3525, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-distributor-tiny rotate: false - xy: 1715, 510 + xy: 1793, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-distributor-xlarge rotate: false - xy: 1657, 975 + xy: 2757, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-door-large rotate: false - xy: 493, 374 + xy: 1559, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-large rotate: false - xy: 485, 332 + xy: 1601, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-door-large-medium rotate: false - xy: 963, 477 + xy: 1108, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-large-small rotate: false - xy: 1075, 365 + xy: 3551, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-large-tiny rotate: false - xy: 1733, 510 + xy: 1793, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-door-large-xlarge rotate: false - xy: 1707, 975 + xy: 2807, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-door-medium rotate: false - xy: 997, 477 + xy: 1142, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-door-small rotate: false - xy: 1101, 391 + xy: 3577, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-door-tiny rotate: false - xy: 1751, 510 + xy: 1811, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-door-xlarge rotate: false - xy: 1757, 975 + xy: 2857, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-dunerocks-large rotate: false - xy: 543, 424 + xy: 1643, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-dunerocks-medium rotate: false - xy: 1031, 477 + xy: 1176, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-dunerocks-small rotate: false - xy: 1075, 339 + xy: 3603, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-dunerocks-tiny rotate: false - xy: 1769, 510 + xy: 1811, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-dunerocks-xlarge rotate: false - xy: 1807, 975 + xy: 2907, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-duo-large rotate: false - xy: 535, 382 + xy: 1685, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-duo-medium rotate: false - xy: 1065, 477 + xy: 1210, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-duo-small rotate: false - xy: 1101, 365 + xy: 3629, 256 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-duo-tiny rotate: false - xy: 1787, 510 + xy: 1829, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-duo-xlarge rotate: false - xy: 1857, 975 + xy: 2957, 460 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-large + rotate: false + xy: 1727, 368 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-medium + rotate: false + xy: 1244, 166 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-small + rotate: false + xy: 3655, 256 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-tiny + rotate: false + xy: 1829, 130 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-exponential-reconstructor-xlarge + rotate: false + xy: 3007, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-force-projector-large rotate: false - xy: 593, 448 + xy: 1769, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-force-projector-medium rotate: false - xy: 1099, 477 + xy: 1278, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-force-projector-small rotate: false - xy: 1101, 339 + xy: 2845, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-force-projector-tiny rotate: false - xy: 1805, 510 + xy: 1847, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-force-projector-xlarge rotate: false - xy: 1907, 975 + xy: 3057, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-fuse-large rotate: false - xy: 635, 448 + xy: 1811, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-fuse-medium rotate: false - xy: 1133, 477 + xy: 1312, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-fuse-small rotate: false - xy: 1127, 391 + xy: 2871, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-fuse-tiny rotate: false - xy: 1823, 510 + xy: 1847, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-fuse-xlarge rotate: false - xy: 1957, 975 + xy: 3107, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-graphite-press-large rotate: false - xy: 677, 448 + xy: 1853, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-graphite-press-medium rotate: false - xy: 1279, 786 + xy: 1346, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-graphite-press-small rotate: false - xy: 1127, 365 + xy: 2897, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-graphite-press-tiny rotate: false - xy: 1841, 510 + xy: 1865, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-graphite-press-xlarge rotate: false - xy: 345, 866 + xy: 3157, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-grass-large rotate: false - xy: 719, 448 + xy: 1895, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-grass-medium rotate: false - xy: 1313, 786 + xy: 1380, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-grass-small rotate: false - xy: 1127, 339 + xy: 2923, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-grass-tiny rotate: false - xy: 1352, 492 + xy: 1865, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-grass-xlarge rotate: false - xy: 395, 866 + xy: 3207, 460 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ground-factory-large + rotate: false + xy: 1937, 368 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ground-factory-medium + rotate: false + xy: 1414, 166 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ground-factory-small + rotate: false + xy: 2949, 230 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ground-factory-tiny + rotate: false + xy: 1883, 148 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ground-factory-xlarge + rotate: false + xy: 3257, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-hail-large rotate: false - xy: 585, 406 + xy: 1979, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-hail-medium rotate: false - xy: 1237, 744 + xy: 1448, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hail-small rotate: false - xy: 1235, 412 + xy: 2975, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-hail-tiny rotate: false - xy: 1352, 474 + xy: 1883, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-hail-xlarge rotate: false - xy: 445, 866 + xy: 3307, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-holostone-large rotate: false - xy: 627, 406 + xy: 2021, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-holostone-medium rotate: false - xy: 1195, 702 + xy: 1482, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-holostone-small rotate: false - xy: 1007, 313 + xy: 3001, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-holostone-tiny rotate: false - xy: 1370, 492 + xy: 1901, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-holostone-xlarge rotate: false - xy: 495, 866 + xy: 3357, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-hotrock-large rotate: false - xy: 669, 406 + xy: 2063, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-hotrock-medium rotate: false - xy: 1363, 828 + xy: 1516, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-hotrock-small rotate: false - xy: 1033, 313 + xy: 3027, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-hotrock-tiny rotate: false - xy: 1352, 456 + xy: 1901, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-hotrock-xlarge rotate: false - xy: 545, 866 + xy: 3407, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ice-large rotate: false - xy: 711, 406 + xy: 2105, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ice-medium rotate: false - xy: 1397, 828 + xy: 1550, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-small rotate: false - xy: 1059, 313 + xy: 3053, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ice-snow-large rotate: false - xy: 577, 364 + xy: 2147, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ice-snow-medium rotate: false - xy: 1431, 828 + xy: 1584, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ice-snow-small rotate: false - xy: 1085, 313 + xy: 3079, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ice-snow-tiny rotate: false - xy: 1370, 474 + xy: 1919, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ice-snow-xlarge rotate: false - xy: 595, 866 + xy: 3457, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ice-tiny rotate: false - xy: 1388, 492 + xy: 1919, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ice-xlarge rotate: false - xy: 645, 866 + xy: 3507, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-icerocks-large rotate: false - xy: 619, 364 + xy: 2189, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-icerocks-medium rotate: false - xy: 1465, 828 + xy: 1618, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-icerocks-small rotate: false - xy: 1111, 313 + xy: 3105, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-icerocks-tiny rotate: false - xy: 1352, 438 + xy: 1937, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-icerocks-xlarge rotate: false - xy: 695, 866 + xy: 3557, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ignarock-large rotate: false - xy: 661, 364 + xy: 2231, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ignarock-medium rotate: false - xy: 1499, 828 + xy: 1652, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ignarock-small rotate: false - xy: 1007, 287 + xy: 3131, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ignarock-tiny rotate: false - xy: 1370, 456 + xy: 1937, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ignarock-xlarge rotate: false - xy: 101, 478 + xy: 3607, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-illuminator-large rotate: false - xy: 703, 364 + xy: 2273, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-illuminator-medium rotate: false - xy: 1533, 828 + xy: 1686, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-illuminator-small rotate: false - xy: 1033, 287 + xy: 3157, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-illuminator-tiny rotate: false - xy: 1388, 474 + xy: 1955, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-illuminator-xlarge rotate: false - xy: 101, 428 + xy: 3657, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-impact-reactor-large rotate: false - xy: 535, 340 + xy: 2315, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-impact-reactor-medium rotate: false - xy: 1567, 828 + xy: 1720, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-impact-reactor-small rotate: false - xy: 1059, 287 + xy: 3183, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-impact-reactor-tiny rotate: false - xy: 1406, 492 + xy: 1955, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-impact-reactor-xlarge rotate: false - xy: 101, 378 + xy: 3707, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-incinerator-large rotate: false - xy: 577, 322 + xy: 2357, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-incinerator-medium rotate: false - xy: 1601, 828 + xy: 1754, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-incinerator-small rotate: false - xy: 1085, 287 + xy: 3209, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-incinerator-tiny rotate: false - xy: 1352, 420 + xy: 1973, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-incinerator-xlarge rotate: false - xy: 101, 328 + xy: 3757, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-inverted-sorter-large rotate: false - xy: 619, 322 + xy: 2399, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-inverted-sorter-medium rotate: false - xy: 1635, 828 + xy: 1788, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-inverted-sorter-small rotate: false - xy: 1111, 287 + xy: 3235, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-inverted-sorter-tiny rotate: false - xy: 1370, 438 + xy: 1973, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-inverted-sorter-xlarge rotate: false - xy: 101, 278 + xy: 3807, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-item-source-large rotate: false - xy: 661, 322 + xy: 2441, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-item-source-medium rotate: false - xy: 1669, 828 + xy: 1822, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-source-small rotate: false - xy: 1137, 313 + xy: 3261, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-item-source-tiny rotate: false - xy: 1388, 456 + xy: 1991, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-item-source-xlarge rotate: false - xy: 101, 228 + xy: 3857, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-item-void-large rotate: false - xy: 703, 322 + xy: 2483, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-item-void-medium rotate: false - xy: 1703, 828 + xy: 1856, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-item-void-small rotate: false - xy: 1137, 287 + xy: 3287, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-item-void-tiny rotate: false - xy: 1406, 474 + xy: 1991, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-item-void-xlarge rotate: false - xy: 101, 178 + xy: 3907, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-junction-large rotate: false - xy: 761, 448 + xy: 2525, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-junction-medium rotate: false - xy: 1737, 828 + xy: 1890, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-junction-small rotate: false - xy: 1376, 606 + xy: 3313, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-junction-tiny rotate: false - xy: 1424, 492 + xy: 2009, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-junction-xlarge rotate: false - xy: 101, 128 + xy: 3957, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-kiln-large rotate: false - xy: 753, 406 + xy: 2567, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-kiln-medium rotate: false - xy: 1771, 828 + xy: 1924, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-kiln-small rotate: false - xy: 1402, 606 + xy: 3339, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-kiln-tiny rotate: false - xy: 1352, 402 + xy: 2009, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-kiln-xlarge rotate: false - xy: 101, 78 + xy: 4007, 460 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-lancer-large rotate: false - xy: 745, 364 + xy: 2609, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-lancer-medium rotate: false - xy: 1805, 828 + xy: 1958, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-lancer-small rotate: false - xy: 1428, 606 + xy: 3365, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-lancer-tiny rotate: false - xy: 1370, 420 + xy: 2027, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-lancer-xlarge rotate: false - xy: 101, 28 + xy: 345, 351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-large-overdrive-projector-large rotate: false - xy: 745, 322 + xy: 2651, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-large-overdrive-projector-medium rotate: false - xy: 1839, 828 + xy: 1992, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-large-overdrive-projector-small rotate: false - xy: 1454, 606 + xy: 3391, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-large-overdrive-projector-tiny rotate: false - xy: 1388, 438 + xy: 2027, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-large-overdrive-projector-xlarge rotate: false - xy: 231, 608 + xy: 395, 351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-laser-drill-large rotate: false - xy: 803, 452 + xy: 2693, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-laser-drill-medium rotate: false - xy: 1873, 828 + xy: 2026, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-laser-drill-small rotate: false - xy: 1480, 606 + xy: 3417, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-laser-drill-tiny rotate: false - xy: 1406, 456 + xy: 2045, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-laser-drill-xlarge rotate: false - xy: 231, 558 + xy: 445, 351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-launch-pad-large rotate: false - xy: 845, 452 + xy: 2735, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-launch-pad-large-large rotate: false - xy: 477, 282 + xy: 2777, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-launch-pad-large-medium rotate: false - xy: 1907, 828 + xy: 2060, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-launch-pad-large-small rotate: false - xy: 1506, 606 + xy: 3443, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-launch-pad-large-tiny rotate: false - xy: 1424, 474 + xy: 2045, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-launch-pad-large-xlarge rotate: false - xy: 745, 866 + xy: 495, 351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-launch-pad-medium rotate: false - xy: 1941, 828 + xy: 2203, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-launch-pad-small rotate: false - xy: 1532, 606 + xy: 3469, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-launch-pad-tiny rotate: false - xy: 1442, 492 + xy: 2063, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-launch-pad-xlarge rotate: false - xy: 151, 508 + xy: 545, 351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-junction-large rotate: false - xy: 477, 240 + xy: 2819, 368 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-junction-medium rotate: false - xy: 963, 443 + xy: 2237, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-junction-small rotate: false - xy: 1558, 606 + xy: 3495, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-junction-tiny rotate: false - xy: 1370, 402 + xy: 2063, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-junction-xlarge rotate: false - xy: 151, 458 + xy: 595, 351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-router-large rotate: false - xy: 477, 198 + xy: 859, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-router-medium rotate: false - xy: 997, 443 + xy: 2271, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-router-small rotate: false - xy: 1584, 606 + xy: 3521, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-router-tiny rotate: false - xy: 1388, 420 + xy: 2081, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-router-xlarge rotate: false - xy: 201, 508 + xy: 645, 351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-source-large rotate: false - xy: 477, 156 + xy: 859, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-source-medium rotate: false - xy: 1031, 443 + xy: 2305, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-source-small rotate: false - xy: 1610, 606 + xy: 3547, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-source-tiny rotate: false - xy: 1406, 438 + xy: 2081, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-source-xlarge rotate: false - xy: 151, 408 + xy: 695, 351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-tank-large rotate: false - xy: 477, 114 + xy: 901, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-tank-medium rotate: false - xy: 1065, 443 + xy: 2339, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-tank-small rotate: false - xy: 1636, 606 + xy: 3573, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-tank-tiny rotate: false - xy: 1424, 456 + xy: 2099, 148 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-tank-xlarge rotate: false - xy: 201, 458 + xy: 231, 93 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-liquid-void-large rotate: false - xy: 477, 72 + xy: 859, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-liquid-void-medium rotate: false - xy: 1099, 443 + xy: 2373, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-liquid-void-small rotate: false - xy: 1662, 606 + xy: 3599, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-liquid-void-tiny rotate: false - xy: 1442, 474 + xy: 2099, 130 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-liquid-void-xlarge rotate: false - xy: 151, 358 + xy: 231, 43 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-magmarock-large rotate: false - xy: 477, 30 + xy: 901, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-magmarock-medium rotate: false - xy: 1133, 443 + xy: 2407, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-magmarock-small rotate: false - xy: 1688, 606 + xy: 3625, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-magmarock-tiny rotate: false - xy: 1460, 492 + xy: 3833, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-magmarock-xlarge rotate: false - xy: 201, 408 + xy: 745, 351 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mass-conveyor-large rotate: false - xy: 795, 406 + xy: 943, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mass-conveyor-medium rotate: false - xy: 1979, 865 + xy: 2441, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mass-conveyor-small rotate: false - xy: 1714, 606 + xy: 3651, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mass-conveyor-tiny rotate: false - xy: 1388, 402 + xy: 1471, 106 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mass-conveyor-xlarge rotate: false - xy: 151, 308 + xy: 281, 104 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mass-driver-large rotate: false - xy: 787, 364 + xy: 859, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mass-driver-medium rotate: false - xy: 2013, 873 + xy: 2475, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mass-driver-small rotate: false - xy: 1740, 606 + xy: 2162, 127 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mass-driver-tiny rotate: false - xy: 1406, 420 + xy: 2195, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mass-driver-xlarge rotate: false - xy: 201, 358 + xy: 281, 54 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mechanical-drill-large rotate: false - xy: 787, 322 + xy: 901, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mechanical-drill-medium rotate: false - xy: 1975, 831 + xy: 2509, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mechanical-drill-small rotate: false - xy: 1766, 606 + xy: 2188, 127 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mechanical-drill-tiny rotate: false - xy: 1424, 438 + xy: 2213, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mechanical-drill-xlarge rotate: false - xy: 151, 258 + xy: 795, 363 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mechanical-pump-large rotate: false - xy: 837, 410 + xy: 943, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mechanical-pump-medium rotate: false - xy: 1347, 786 + xy: 2543, 276 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mechanical-pump-small rotate: false - xy: 1792, 606 + xy: 4069, 455 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mechanical-pump-tiny rotate: false - xy: 1442, 456 + xy: 2231, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mechanical-pump-xlarge rotate: false - xy: 201, 308 + xy: 309, 301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-meltdown-large rotate: false - xy: 887, 452 + xy: 985, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-meltdown-medium rotate: false - xy: 1381, 794 + xy: 2617, 300 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-meltdown-small rotate: false - xy: 1818, 606 + xy: 4069, 429 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-meltdown-tiny rotate: false - xy: 1460, 474 + xy: 2249, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-meltdown-xlarge rotate: false - xy: 151, 208 + xy: 309, 251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-melter-large rotate: false - xy: 879, 410 + xy: 901, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-melter-medium rotate: false - xy: 1415, 794 + xy: 2651, 300 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-melter-small rotate: false - xy: 1844, 606 + xy: 3677, 230 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-melter-tiny rotate: false - xy: 1478, 492 + xy: 2267, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-melter-xlarge rotate: false - xy: 201, 258 + xy: 359, 301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mend-projector-large rotate: false - xy: 829, 364 + xy: 943, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mend-projector-medium rotate: false - xy: 1449, 794 + xy: 2685, 300 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mend-projector-small rotate: false - xy: 1870, 606 + xy: 3703, 250 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mend-projector-tiny rotate: false - xy: 1406, 402 + xy: 2285, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mend-projector-xlarge rotate: false - xy: 151, 158 + xy: 309, 201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-mender-large rotate: false - xy: 829, 322 + xy: 985, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-mender-medium rotate: false - xy: 1483, 794 + xy: 2719, 300 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-mender-small rotate: false - xy: 1896, 606 + xy: 3729, 250 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-mender-tiny rotate: false - xy: 1424, 420 + xy: 2303, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-mender-xlarge rotate: false - xy: 201, 208 + xy: 359, 251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-message-large rotate: false - xy: 871, 368 + xy: 1027, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-message-medium rotate: false - xy: 1517, 794 + xy: 2753, 300 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-message-small rotate: false - xy: 1922, 606 + xy: 3755, 250 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-message-tiny rotate: false - xy: 1442, 438 + xy: 2321, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-message-xlarge rotate: false - xy: 151, 108 + xy: 409, 301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-2-large rotate: false - xy: 871, 326 + xy: 943, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-2-medium rotate: false - xy: 1551, 794 + xy: 2787, 300 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-2-small rotate: false - xy: 1948, 606 + xy: 3703, 224 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-2-tiny rotate: false - xy: 1460, 456 + xy: 2339, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-2-xlarge rotate: false - xy: 201, 158 + xy: 359, 201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-3-large rotate: false - xy: 921, 410 + xy: 985, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-3-medium rotate: false - xy: 1585, 794 + xy: 2821, 300 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-3-small rotate: false - xy: 1974, 606 + xy: 3729, 224 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-3-tiny rotate: false - xy: 1478, 474 + xy: 2357, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-3-xlarge rotate: false - xy: 151, 58 + xy: 409, 251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-5-large rotate: false - xy: 913, 368 + xy: 1027, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-5-medium rotate: false - xy: 1619, 794 + xy: 2094, 166 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-5-small rotate: false - xy: 1318, 620 + xy: 3755, 224 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-5-tiny rotate: false - xy: 1496, 492 + xy: 2375, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-5-xlarge rotate: false - xy: 201, 108 + xy: 459, 301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-damaged-large rotate: false - xy: 913, 326 + xy: 1069, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-damaged-medium rotate: false - xy: 1653, 794 + xy: 881, 140 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-damaged-small rotate: false - xy: 1303, 586 + xy: 3781, 250 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-damaged-tiny rotate: false - xy: 1424, 402 + xy: 2393, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-damaged-xlarge rotate: false - xy: 201, 58 + xy: 409, 201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-metal-floor-large rotate: false - xy: 955, 368 + xy: 985, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-metal-floor-medium rotate: false - xy: 1687, 794 + xy: 881, 106 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-metal-floor-small rotate: false - xy: 1303, 560 + xy: 3781, 224 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-metal-floor-tiny rotate: false - xy: 1442, 420 + xy: 2411, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-metal-floor-xlarge rotate: false - xy: 251, 508 + xy: 459, 251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-moss-large rotate: false - xy: 955, 326 + xy: 1027, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-moss-medium rotate: false - xy: 1721, 794 + xy: 881, 72 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-moss-small rotate: false - xy: 1303, 534 + xy: 3807, 252 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-moss-tiny rotate: false - xy: 1460, 438 + xy: 2429, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-moss-xlarge rotate: false - xy: 251, 458 + xy: 509, 301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-multi-press-large rotate: false - xy: 821, 933 + xy: 1069, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-multi-press-medium rotate: false - xy: 1755, 794 + xy: 881, 38 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-multi-press-small rotate: false - xy: 1300, 508 + xy: 3807, 226 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-multi-press-tiny rotate: false - xy: 1478, 456 + xy: 2447, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-multi-press-xlarge rotate: false - xy: 251, 408 + xy: 459, 201 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-large + rotate: false + xy: 1111, 326 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-medium + rotate: false + xy: 881, 4 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-small + rotate: false + xy: 915, 140 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-tiny + rotate: false + xy: 2465, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-multiplicative-reconstructor-xlarge + rotate: false + xy: 509, 251 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-naval-factory-large + rotate: false + xy: 1027, 200 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-naval-factory-medium + rotate: false + xy: 2577, 271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-naval-factory-small + rotate: false + xy: 941, 140 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-naval-factory-tiny + rotate: false + xy: 2483, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-naval-factory-xlarge + rotate: false + xy: 559, 301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-oil-extractor-large rotate: false - xy: 863, 933 + xy: 1069, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-oil-extractor-medium rotate: false - xy: 1789, 794 + xy: 2611, 266 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-oil-extractor-small rotate: false - xy: 1300, 482 + xy: 915, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-oil-extractor-tiny rotate: false - xy: 1496, 474 + xy: 2501, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-oil-extractor-xlarge rotate: false - xy: 251, 358 + xy: 509, 201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-coal-large rotate: false - xy: 905, 933 + xy: 1111, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-coal-medium rotate: false - xy: 1823, 794 + xy: 2645, 266 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-coal-small rotate: false - xy: 1300, 456 + xy: 967, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-coal-tiny rotate: false - xy: 1514, 492 + xy: 2519, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-coal-xlarge rotate: false - xy: 251, 308 + xy: 559, 251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-copper-large rotate: false - xy: 947, 933 + xy: 1153, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-copper-medium rotate: false - xy: 1857, 794 + xy: 2679, 266 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-copper-small rotate: false - xy: 1300, 430 + xy: 915, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-copper-tiny rotate: false - xy: 1442, 402 + xy: 2537, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-copper-xlarge rotate: false - xy: 251, 258 + xy: 609, 301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-lead-large rotate: false - xy: 989, 933 + xy: 1069, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-lead-medium rotate: false - xy: 1891, 794 + xy: 2713, 266 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-lead-small rotate: false - xy: 1300, 404 + xy: 941, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-lead-tiny rotate: false - xy: 1460, 420 + xy: 2555, 224 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-lead-xlarge rotate: false - xy: 251, 208 + xy: 559, 201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-scrap-large rotate: false - xy: 1031, 933 + xy: 1111, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-scrap-medium rotate: false - xy: 1925, 794 + xy: 2747, 266 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-scrap-small rotate: false - xy: 1153, 396 + xy: 993, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-scrap-tiny rotate: false - xy: 1478, 438 + xy: 2196, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-scrap-xlarge rotate: false - xy: 251, 158 + xy: 609, 251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-thorium-large rotate: false - xy: 1073, 933 + xy: 1153, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-thorium-medium rotate: false - xy: 1959, 794 + xy: 2781, 266 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-thorium-small rotate: false - xy: 1179, 396 + xy: 915, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-thorium-tiny rotate: false - xy: 1496, 456 + xy: 2214, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-thorium-xlarge rotate: false - xy: 251, 108 + xy: 659, 301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ore-titanium-large rotate: false - xy: 1115, 933 + xy: 1195, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ore-titanium-medium rotate: false - xy: 1993, 797 + xy: 2815, 266 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ore-titanium-small rotate: false - xy: 1153, 370 + xy: 941, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ore-titanium-tiny rotate: false - xy: 1514, 474 + xy: 2196, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ore-titanium-xlarge rotate: false - xy: 251, 58 + xy: 609, 201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-overdrive-projector-large rotate: false - xy: 1157, 933 + xy: 1111, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-overdrive-projector-medium rotate: false - xy: 2009, 831 + xy: 4035, 426 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-overdrive-projector-small rotate: false - xy: 1205, 396 + xy: 967, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-overdrive-projector-tiny rotate: false - xy: 1532, 492 + xy: 2214, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-overdrive-projector-xlarge rotate: false - xy: 151, 8 + xy: 659, 251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-overflow-gate-large rotate: false - xy: 1199, 933 + xy: 1153, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-overflow-gate-medium rotate: false - xy: 1381, 760 + xy: 4017, 384 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-overflow-gate-small rotate: false - xy: 1153, 344 + xy: 1019, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-overflow-gate-tiny rotate: false - xy: 1460, 402 + xy: 2232, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-overflow-gate-xlarge rotate: false - xy: 201, 8 + xy: 709, 301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-payload-router-large rotate: false - xy: 1241, 933 + xy: 1195, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-payload-router-medium rotate: false - xy: 1415, 760 + xy: 2199, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-payload-router-small rotate: false - xy: 1179, 370 + xy: 915, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-payload-router-tiny rotate: false - xy: 1478, 420 + xy: 2196, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-payload-router-xlarge rotate: false - xy: 251, 8 + xy: 659, 201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pebbles-large rotate: false - xy: 1283, 933 + xy: 1237, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pebbles-medium rotate: false - xy: 1449, 760 + xy: 2233, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pebbles-small rotate: false - xy: 1179, 344 + xy: 941, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pebbles-tiny rotate: false - xy: 1496, 438 + xy: 2214, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pebbles-xlarge rotate: false - xy: 281, 619 + xy: 709, 251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-conduit-large rotate: false - xy: 1325, 933 + xy: 1153, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-conduit-medium rotate: false - xy: 1483, 760 + xy: 2267, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conduit-small rotate: false - xy: 1205, 370 + xy: 967, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-conduit-tiny rotate: false - xy: 1514, 456 + xy: 2232, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-conduit-xlarge rotate: false - xy: 281, 569 + xy: 709, 201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-conveyor-large rotate: false - xy: 1367, 933 + xy: 1195, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-conveyor-medium rotate: false - xy: 1517, 760 + xy: 2301, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-conveyor-small rotate: false - xy: 1205, 344 + xy: 993, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-conveyor-tiny rotate: false - xy: 1532, 474 + xy: 2250, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-conveyor-xlarge rotate: false - xy: 301, 519 + xy: 759, 301 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-wall-large rotate: false - xy: 1409, 933 + xy: 1237, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-wall-large-large rotate: false - xy: 1451, 933 + xy: 1279, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-wall-large-medium rotate: false - xy: 1551, 760 + xy: 2335, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-large-small rotate: false - xy: 1231, 386 + xy: 1045, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-wall-large-tiny rotate: false - xy: 1550, 492 + xy: 2232, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-wall-large-xlarge rotate: false - xy: 301, 469 + xy: 759, 251 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-wall-medium rotate: false - xy: 1585, 760 + xy: 2369, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-wall-small rotate: false - xy: 1231, 360 + xy: 915, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-wall-tiny rotate: false - xy: 1478, 402 + xy: 2250, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-wall-xlarge rotate: false - xy: 301, 419 + xy: 759, 201 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-phase-weaver-large rotate: false - xy: 1493, 933 + xy: 1195, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-phase-weaver-medium rotate: false - xy: 1619, 760 + xy: 2403, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-phase-weaver-small rotate: false - xy: 1163, 318 + xy: 941, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-phase-weaver-tiny rotate: false - xy: 1496, 420 + xy: 2268, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-phase-weaver-xlarge rotate: false - xy: 301, 369 + xy: 809, 313 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pine-large rotate: false - xy: 1535, 933 + xy: 1237, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pine-medium rotate: false - xy: 1653, 760 + xy: 2437, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pine-small rotate: false - xy: 1163, 292 + xy: 967, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pine-tiny rotate: false - xy: 1514, 438 + xy: 2250, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pine-xlarge rotate: false - xy: 301, 319 + xy: 809, 263 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-compressor-large rotate: false - xy: 1577, 933 + xy: 1279, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-compressor-medium rotate: false - xy: 1687, 760 + xy: 2471, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-compressor-small rotate: false - xy: 1189, 318 + xy: 993, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-compressor-tiny rotate: false - xy: 1532, 456 + xy: 2268, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-compressor-xlarge rotate: false - xy: 301, 269 + xy: 809, 213 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-conveyor-large rotate: false - xy: 1619, 933 + xy: 1321, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-conveyor-medium rotate: false - xy: 1721, 760 + xy: 2505, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-conveyor-small rotate: false - xy: 1189, 292 + xy: 1019, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-conveyor-tiny rotate: false - xy: 1550, 474 + xy: 2286, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-conveyor-xlarge rotate: false - xy: 301, 219 + xy: 809, 163 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-wall-large rotate: false - xy: 1661, 933 + xy: 1237, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-wall-large-large rotate: false - xy: 1703, 933 + xy: 1279, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plastanium-wall-large-medium rotate: false - xy: 1755, 760 + xy: 2539, 242 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-wall-large-small rotate: false - xy: 1231, 334 + xy: 1071, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-wall-large-tiny rotate: false - xy: 1568, 492 + xy: 2268, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-wall-large-xlarge rotate: false - xy: 301, 169 + xy: 281, 4 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plastanium-wall-medium rotate: false - xy: 1789, 760 + xy: 2573, 237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plastanium-wall-small rotate: false - xy: 1215, 308 + xy: 941, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plastanium-wall-tiny rotate: false - xy: 1496, 402 + xy: 2286, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plastanium-wall-xlarge rotate: false - xy: 301, 119 + xy: 331, 151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-plated-conduit-large rotate: false - xy: 1745, 933 + xy: 1321, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-plated-conduit-medium rotate: false - xy: 1823, 760 + xy: 2607, 232 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-plated-conduit-small rotate: false - xy: 1215, 282 + xy: 967, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-plated-conduit-tiny rotate: false - xy: 1514, 420 + xy: 2304, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-plated-conduit-xlarge rotate: false - xy: 301, 69 + xy: 331, 101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pneumatic-drill-large rotate: false - xy: 1787, 933 + xy: 1363, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pneumatic-drill-medium rotate: false - xy: 1857, 760 + xy: 2641, 232 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pneumatic-drill-small rotate: false - xy: 1241, 308 + xy: 993, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pneumatic-drill-tiny rotate: false - xy: 1532, 438 + xy: 2286, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pneumatic-drill-xlarge rotate: false - xy: 301, 19 + xy: 381, 151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-node-large rotate: false - xy: 1829, 933 + xy: 1279, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-node-large-large rotate: false - xy: 1871, 933 + xy: 1321, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-node-large-medium rotate: false - xy: 1891, 760 + xy: 2675, 232 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-node-large-small rotate: false - xy: 1241, 282 + xy: 1019, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-node-large-tiny rotate: false - xy: 1550, 456 + xy: 2304, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-node-large-xlarge rotate: false - xy: 795, 878 + xy: 331, 51 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-node-medium rotate: false - xy: 1925, 760 + xy: 2709, 232 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-node-small rotate: false - xy: 1329, 594 + xy: 1045, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-node-tiny rotate: false - xy: 1568, 474 + xy: 2322, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-node-xlarge rotate: false - xy: 309, 816 + xy: 381, 101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-source-large rotate: false - xy: 1913, 933 + xy: 1363, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-source-medium rotate: false - xy: 1959, 760 + xy: 2743, 232 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-source-small rotate: false - xy: 1329, 568 + xy: 1097, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-source-tiny rotate: false - xy: 1586, 492 + xy: 2304, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-source-xlarge rotate: false - xy: 309, 766 + xy: 431, 151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-power-void-large rotate: false - xy: 1955, 933 + xy: 1405, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-power-void-medium rotate: false - xy: 1993, 763 + xy: 2777, 232 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-power-void-small rotate: false - xy: 1329, 542 + xy: 967, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-power-void-tiny rotate: false - xy: 1514, 402 + xy: 2322, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-power-void-xlarge rotate: false - xy: 359, 816 + xy: 381, 51 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pulse-conduit-large rotate: false - xy: 845, 891 + xy: 1321, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pulse-conduit-medium rotate: false - xy: 1167, 558 + xy: 2811, 232 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulse-conduit-small rotate: false - xy: 1329, 516 + xy: 993, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pulse-conduit-tiny rotate: false - xy: 1532, 420 + xy: 2340, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pulse-conduit-xlarge rotate: false - xy: 309, 716 + xy: 431, 101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pulverizer-large rotate: false - xy: 887, 891 + xy: 1363, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pulverizer-medium rotate: false - xy: 1167, 524 + xy: 2861, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pulverizer-small rotate: false - xy: 1326, 490 + xy: 1019, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pulverizer-tiny rotate: false - xy: 1550, 438 + xy: 2322, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pulverizer-xlarge rotate: false - xy: 359, 766 + xy: 481, 151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-pyratite-mixer-large rotate: false - xy: 929, 891 + xy: 1405, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-pyratite-mixer-medium rotate: false - xy: 1167, 490 + xy: 2895, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-pyratite-mixer-small rotate: false - xy: 1326, 464 + xy: 1045, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-pyratite-mixer-tiny rotate: false - xy: 1568, 456 + xy: 2340, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-pyratite-mixer-xlarge rotate: false - xy: 409, 816 + xy: 431, 51 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-repair-point-large rotate: false - xy: 971, 891 + xy: 1447, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-repair-point-medium rotate: false - xy: 1167, 456 + xy: 2929, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-repair-point-small rotate: false - xy: 1326, 438 + xy: 1071, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-repair-point-tiny rotate: false - xy: 1586, 474 + xy: 2358, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-repair-point-xlarge rotate: false - xy: 359, 716 + xy: 481, 101 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-resupply-point-large + rotate: false + xy: 1363, 200 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-resupply-point-medium + rotate: false + xy: 2963, 350 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-resupply-point-small + rotate: false + xy: 1123, 140 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-resupply-point-tiny + rotate: false + xy: 2340, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-resupply-point-xlarge + rotate: false + xy: 531, 151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-ripple-large rotate: false - xy: 1013, 891 + xy: 1405, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-ripple-medium rotate: false - xy: 1167, 422 + xy: 2997, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-ripple-small rotate: false - xy: 1326, 412 + xy: 993, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-ripple-tiny rotate: false - xy: 1604, 492 + xy: 2358, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-ripple-xlarge rotate: false - xy: 409, 766 + xy: 481, 51 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-rock-large rotate: false - xy: 1055, 891 + xy: 1447, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-rock-medium rotate: false - xy: 871, 292 + xy: 3031, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rock-small rotate: false - xy: 1326, 386 + xy: 1019, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-rock-tiny rotate: false - xy: 1532, 402 + xy: 2376, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-rock-xlarge rotate: false - xy: 459, 816 + xy: 531, 101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-rocks-large rotate: false - xy: 1097, 891 + xy: 1489, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-rocks-medium rotate: false - xy: 905, 292 + xy: 3065, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rocks-small rotate: false - xy: 2000, 601 + xy: 1045, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-rocks-tiny rotate: false - xy: 1550, 420 + xy: 2358, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-rocks-xlarge rotate: false - xy: 409, 716 + xy: 581, 151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-rotary-pump-large rotate: false - xy: 1139, 891 + xy: 1405, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-rotary-pump-medium rotate: false - xy: 939, 292 + xy: 3099, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rotary-pump-small rotate: false - xy: 1163, 266 + xy: 1071, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-rotary-pump-tiny rotate: false - xy: 1568, 438 + xy: 2376, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-rotary-pump-xlarge rotate: false - xy: 459, 766 + xy: 531, 51 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-router-large rotate: false - xy: 1181, 891 + xy: 1447, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-router-medium rotate: false - xy: 973, 292 + xy: 3133, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-router-small rotate: false - xy: 1189, 266 + xy: 1097, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-router-tiny rotate: false - xy: 1586, 456 + xy: 2394, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-router-xlarge rotate: false - xy: 509, 816 + xy: 581, 101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-rtg-generator-large rotate: false - xy: 1223, 891 + xy: 1489, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-rtg-generator-medium rotate: false - xy: 1233, 710 + xy: 3167, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-rtg-generator-small rotate: false - xy: 1215, 256 + xy: 1149, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-rtg-generator-tiny rotate: false - xy: 1604, 474 + xy: 2376, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-rtg-generator-xlarge rotate: false - xy: 459, 716 + xy: 631, 151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-salt-large rotate: false - xy: 1265, 891 + xy: 1531, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-salt-medium rotate: false - xy: 1275, 752 + xy: 3201, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-salt-small rotate: false - xy: 1241, 256 + xy: 1019, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-salt-tiny rotate: false - xy: 1622, 492 + xy: 2394, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-salt-xlarge rotate: false - xy: 509, 766 + xy: 581, 51 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-saltrocks-large rotate: false - xy: 1307, 891 + xy: 1447, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-saltrocks-medium rotate: false - xy: 1309, 752 + xy: 3235, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-saltrocks-small rotate: false - xy: 1355, 580 + xy: 1045, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-saltrocks-tiny rotate: false - xy: 1550, 402 + xy: 2412, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-saltrocks-xlarge rotate: false - xy: 559, 816 + xy: 631, 101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-salvo-large rotate: false - xy: 1349, 891 + xy: 1489, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-salvo-medium rotate: false - xy: 1343, 752 + xy: 3269, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-salvo-small rotate: false - xy: 1355, 554 + xy: 1071, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-salvo-tiny rotate: false - xy: 1568, 420 + xy: 2394, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-salvo-xlarge rotate: false - xy: 509, 716 + xy: 681, 151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sand-boulder-large rotate: false - xy: 1391, 891 + xy: 1531, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sand-boulder-medium rotate: false - xy: 1187, 660 + xy: 3303, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-boulder-small rotate: false - xy: 1381, 580 + xy: 1097, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sand-boulder-tiny rotate: false - xy: 1586, 438 + xy: 2412, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sand-boulder-xlarge rotate: false - xy: 559, 766 + xy: 631, 51 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sand-large rotate: false - xy: 1433, 891 + xy: 1573, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sand-medium rotate: false - xy: 1187, 626 + xy: 3337, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-small rotate: false - xy: 1355, 528 + xy: 1123, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sand-tiny rotate: false - xy: 1604, 456 + xy: 2430, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sand-water-large rotate: false - xy: 1475, 891 + xy: 1489, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sand-water-medium rotate: false - xy: 1187, 592 + xy: 3371, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sand-water-small rotate: false - xy: 1381, 554 + xy: 1175, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sand-water-tiny rotate: false - xy: 1622, 474 + xy: 2412, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sand-water-xlarge rotate: false - xy: 609, 816 + xy: 681, 101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sand-xlarge rotate: false - xy: 559, 716 + xy: 731, 151 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sandrocks-large rotate: false - xy: 1517, 891 + xy: 1531, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sandrocks-medium rotate: false - xy: 1201, 558 + xy: 3405, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sandrocks-small rotate: false - xy: 1407, 580 + xy: 1045, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sandrocks-tiny rotate: false - xy: 1640, 492 + xy: 2430, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sandrocks-xlarge rotate: false - xy: 609, 766 + xy: 681, 51 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scatter-large rotate: false - xy: 1559, 891 + xy: 1573, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scatter-medium rotate: false - xy: 1201, 524 + xy: 3439, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scatter-small rotate: false - xy: 1381, 528 + xy: 1071, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scatter-tiny rotate: false - xy: 1568, 402 + xy: 2448, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scatter-xlarge rotate: false - xy: 659, 816 + xy: 731, 101 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scorch-large rotate: false - xy: 1601, 891 + xy: 1615, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scorch-medium rotate: false - xy: 1201, 490 + xy: 3473, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scorch-small rotate: false - xy: 1407, 554 + xy: 1097, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scorch-tiny rotate: false - xy: 1586, 420 + xy: 2430, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scorch-xlarge rotate: false - xy: 609, 716 + xy: 731, 51 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-gigantic-large rotate: false - xy: 1643, 891 + xy: 1531, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-gigantic-medium rotate: false - xy: 1201, 456 + xy: 3507, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-gigantic-small rotate: false - xy: 1433, 580 + xy: 1123, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-gigantic-tiny rotate: false - xy: 1604, 438 + xy: 2448, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-gigantic-xlarge rotate: false - xy: 659, 766 + xy: 331, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-huge-large rotate: false - xy: 1685, 891 + xy: 1573, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-huge-medium rotate: false - xy: 1201, 422 + xy: 3541, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-huge-small rotate: false - xy: 1407, 528 + xy: 1149, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-huge-tiny rotate: false - xy: 1622, 456 + xy: 2466, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-huge-xlarge rotate: false - xy: 709, 816 + xy: 381, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-large rotate: false - xy: 1727, 891 + xy: 1615, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-large-large rotate: false - xy: 1769, 891 + xy: 1657, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-scrap-wall-large-medium rotate: false - xy: 1267, 710 + xy: 3575, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-large-small rotate: false - xy: 1433, 554 + xy: 1201, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-large-tiny rotate: false - xy: 1640, 474 + xy: 2448, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-large-xlarge rotate: false - xy: 659, 716 + xy: 431, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-scrap-wall-medium rotate: false - xy: 1301, 718 + xy: 3609, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-scrap-wall-small rotate: false - xy: 1459, 580 + xy: 1071, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-scrap-wall-tiny rotate: false - xy: 1658, 492 + xy: 2466, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-scrap-wall-xlarge rotate: false - xy: 709, 766 + xy: 481, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-segment-large rotate: false - xy: 1811, 891 + xy: 1573, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-segment-medium rotate: false - xy: 1335, 718 + xy: 3643, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-segment-small rotate: false - xy: 1433, 528 + xy: 1097, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-segment-tiny rotate: false - xy: 1586, 402 + xy: 2484, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-segment-xlarge rotate: false - xy: 709, 716 + xy: 531, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-separator-large rotate: false - xy: 1853, 891 + xy: 1615, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-separator-medium rotate: false - xy: 1301, 684 + xy: 3677, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-separator-small rotate: false - xy: 1459, 554 + xy: 1123, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-separator-tiny rotate: false - xy: 1604, 420 + xy: 2466, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-separator-xlarge rotate: false - xy: 759, 816 + xy: 581, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shale-boulder-large rotate: false - xy: 1895, 891 + xy: 1657, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shale-boulder-medium rotate: false - xy: 1335, 684 + xy: 3711, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-boulder-small rotate: false - xy: 1485, 580 + xy: 1149, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shale-boulder-tiny rotate: false - xy: 1622, 438 + xy: 2484, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-shale-boulder-xlarge rotate: false - xy: 759, 766 + xy: 631, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shale-large rotate: false - xy: 1937, 891 + xy: 1699, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shale-medium rotate: false - xy: 1369, 718 + xy: 3745, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shale-small rotate: false - xy: 1459, 528 + xy: 1175, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shale-tiny rotate: false - xy: 1640, 456 + xy: 2502, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-shale-xlarge rotate: false - xy: 759, 716 + xy: 681, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shalerocks-large rotate: false - xy: 859, 849 + xy: 1615, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shalerocks-medium rotate: false - xy: 1369, 684 + xy: 3779, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shalerocks-small rotate: false - xy: 1485, 554 + xy: 1227, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shalerocks-tiny rotate: false - xy: 1658, 474 + xy: 2484, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-shalerocks-xlarge rotate: false - xy: 809, 828 + xy: 731, 1 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shock-mine-large rotate: false - xy: 859, 807 + xy: 1657, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shock-mine-medium rotate: false - xy: 1403, 726 + xy: 3813, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shock-mine-small rotate: false - xy: 1511, 580 + xy: 1097, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shock-mine-tiny rotate: false - xy: 1676, 492 + xy: 2502, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-shock-mine-xlarge rotate: false - xy: 809, 778 + xy: 781, 113 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-shrubs-large rotate: false - xy: 901, 849 + xy: 1699, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-shrubs-medium rotate: false - xy: 1403, 692 + xy: 3847, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-shrubs-small rotate: false - xy: 1485, 528 + xy: 1123, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-shrubs-tiny rotate: false - xy: 1604, 402 + xy: 2520, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-shrubs-xlarge rotate: false - xy: 809, 728 + xy: 781, 63 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-silicon-crucible-large rotate: false - xy: 859, 765 + xy: 1741, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-silicon-crucible-medium rotate: false - xy: 1437, 726 + xy: 3881, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-silicon-crucible-small rotate: false - xy: 1511, 554 + xy: 1149, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-silicon-crucible-tiny rotate: false - xy: 1622, 420 + xy: 2502, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-silicon-crucible-xlarge rotate: false - xy: 809, 678 + xy: 781, 13 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-silicon-smelter-large rotate: false - xy: 943, 849 + xy: 1657, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-silicon-smelter-medium rotate: false - xy: 1437, 692 + xy: 3915, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-silicon-smelter-small rotate: false - xy: 1537, 580 + xy: 1175, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-silicon-smelter-tiny rotate: false - xy: 1640, 438 + xy: 2520, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-silicon-smelter-xlarge rotate: false - xy: 331, 666 + xy: 831, 113 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-slag-large rotate: false - xy: 901, 807 + xy: 1699, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-slag-medium rotate: false - xy: 1471, 726 + xy: 3949, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-slag-small rotate: false - xy: 1511, 528 + xy: 1201, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-slag-tiny rotate: false - xy: 1658, 456 + xy: 2538, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-slag-xlarge rotate: false - xy: 331, 616 + xy: 831, 63 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snow-large rotate: false - xy: 859, 723 + xy: 1741, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-snow-medium rotate: false - xy: 1471, 692 + xy: 3983, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snow-pine-large rotate: false - xy: 985, 849 + xy: 1783, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-snow-pine-medium rotate: false - xy: 1505, 726 + xy: 4017, 350 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snow-pine-small rotate: false - xy: 1537, 554 + xy: 1253, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-snow-pine-tiny rotate: false - xy: 1676, 474 + xy: 2520, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-snow-pine-xlarge rotate: false - xy: 381, 666 + xy: 831, 13 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snow-small rotate: false - xy: 1563, 580 + xy: 1123, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-snow-tiny rotate: false - xy: 1694, 492 + xy: 2538, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-snow-xlarge rotate: false - xy: 381, 616 + xy: 859, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snowrock-large rotate: false - xy: 943, 807 + xy: 1699, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-snowrock-medium rotate: false - xy: 1505, 692 + xy: 2128, 179 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snowrock-small rotate: false - xy: 1537, 528 + xy: 1149, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-snowrock-tiny rotate: false - xy: 1622, 402 + xy: 2538, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-snowrock-xlarge rotate: false - xy: 431, 666 + xy: 909, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-snowrocks-large rotate: false - xy: 901, 765 + xy: 1741, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-snowrocks-medium rotate: false - xy: 1539, 726 + xy: 2859, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-snowrocks-small rotate: false - xy: 1563, 554 + xy: 1175, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-snowrocks-tiny rotate: false - xy: 1640, 420 + xy: 2556, 206 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-snowrocks-xlarge rotate: false - xy: 431, 616 + xy: 959, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-solar-panel-large rotate: false - xy: 859, 681 + xy: 1783, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-solar-panel-large-large rotate: false - xy: 1027, 849 + xy: 1825, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-solar-panel-large-medium rotate: false - xy: 1539, 692 + xy: 2893, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-large-small rotate: false - xy: 1589, 580 + xy: 1201, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-solar-panel-large-tiny rotate: false - xy: 1658, 438 + xy: 2556, 188 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-solar-panel-large-xlarge rotate: false - xy: 481, 666 + xy: 1009, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-solar-panel-medium rotate: false - xy: 1573, 726 + xy: 2927, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-solar-panel-small rotate: false - xy: 1563, 528 + xy: 1227, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-solar-panel-tiny rotate: false - xy: 1676, 456 + xy: 2556, 170 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-solar-panel-xlarge rotate: false - xy: 481, 616 + xy: 1059, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sorter-large rotate: false - xy: 985, 807 + xy: 1741, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sorter-medium rotate: false - xy: 1573, 692 + xy: 2961, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sorter-small rotate: false - xy: 1589, 554 + xy: 1279, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sorter-tiny rotate: false - xy: 1694, 474 + xy: 3851, 246 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sorter-xlarge rotate: false - xy: 531, 666 + xy: 1109, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spawn-large rotate: false - xy: 943, 765 + xy: 1783, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spawn-medium rotate: false - xy: 1607, 726 + xy: 2995, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spawn-small rotate: false - xy: 1615, 580 + xy: 1149, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spawn-tiny rotate: false - xy: 1712, 492 + xy: 3869, 246 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spawn-xlarge rotate: false - xy: 531, 616 + xy: 1159, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spectre-large rotate: false - xy: 901, 723 + xy: 1825, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spectre-medium rotate: false - xy: 1607, 692 + xy: 3029, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spectre-small rotate: false - xy: 1589, 528 + xy: 1175, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spectre-tiny rotate: false - xy: 1640, 402 + xy: 3851, 228 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spectre-xlarge rotate: false - xy: 581, 666 + xy: 1209, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-cluster-large rotate: false - xy: 1069, 849 + xy: 1867, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-cluster-medium rotate: false - xy: 1641, 726 + xy: 3063, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-cluster-small rotate: false - xy: 1615, 554 + xy: 1201, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-cluster-tiny rotate: false - xy: 1658, 420 + xy: 3887, 246 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-cluster-xlarge rotate: false - xy: 581, 616 + xy: 1259, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-moss-large rotate: false - xy: 1027, 807 + xy: 1783, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-moss-medium rotate: false - xy: 1641, 692 + xy: 3097, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-moss-small rotate: false - xy: 1641, 580 + xy: 1227, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-moss-tiny rotate: false - xy: 1676, 438 + xy: 3869, 228 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-moss-xlarge rotate: false - xy: 631, 666 + xy: 1309, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-pine-large rotate: false - xy: 985, 765 + xy: 1825, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-pine-medium rotate: false - xy: 1675, 726 + xy: 3131, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-pine-small rotate: false - xy: 1615, 528 + xy: 1253, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-pine-tiny rotate: false - xy: 1694, 456 + xy: 3905, 246 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-pine-xlarge rotate: false - xy: 631, 616 + xy: 1359, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-spore-press-large rotate: false - xy: 943, 723 + xy: 1867, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-spore-press-medium rotate: false - xy: 1675, 692 + xy: 3165, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-spore-press-small rotate: false - xy: 1641, 554 + xy: 1305, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-spore-press-tiny rotate: false - xy: 1712, 474 + xy: 3887, 228 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-spore-press-xlarge rotate: false - xy: 681, 666 + xy: 1409, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-sporerocks-large rotate: false - xy: 901, 681 + xy: 1909, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-sporerocks-medium rotate: false - xy: 1709, 726 + xy: 3199, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-sporerocks-small rotate: false - xy: 1667, 580 + xy: 1175, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-sporerocks-tiny rotate: false - xy: 1730, 492 + xy: 3923, 246 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-sporerocks-xlarge rotate: false - xy: 681, 616 + xy: 1459, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-stone-large rotate: false - xy: 1111, 849 + xy: 1825, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-stone-medium rotate: false - xy: 1709, 692 + xy: 3233, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-stone-small rotate: false - xy: 1641, 528 + xy: 1201, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-stone-tiny rotate: false - xy: 1658, 402 + xy: 3905, 228 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-stone-xlarge rotate: false - xy: 731, 666 + xy: 1509, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-surge-tower-large rotate: false - xy: 1069, 807 + xy: 1867, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-surge-tower-medium rotate: false - xy: 1743, 726 + xy: 3267, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-tower-small rotate: false - xy: 1667, 554 + xy: 1227, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-surge-tower-tiny rotate: false - xy: 1676, 420 + xy: 3941, 246 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-surge-tower-xlarge rotate: false - xy: 731, 616 + xy: 1559, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-surge-wall-large rotate: false - xy: 1027, 765 + xy: 1909, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-surge-wall-large-large rotate: false - xy: 985, 723 + xy: 1951, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-surge-wall-large-medium rotate: false - xy: 1743, 692 + xy: 3301, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-wall-large-small rotate: false - xy: 1693, 580 + xy: 1253, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-surge-wall-large-tiny rotate: false - xy: 1694, 438 + xy: 3923, 228 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-surge-wall-large-xlarge rotate: false - xy: 781, 628 + xy: 1609, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-surge-wall-medium rotate: false - xy: 1777, 726 + xy: 3335, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-surge-wall-small rotate: false - xy: 1667, 528 + xy: 1279, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-surge-wall-tiny rotate: false - xy: 1712, 456 + xy: 3959, 246 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-surge-wall-xlarge rotate: false - xy: 831, 628 + xy: 1659, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-swarmer-large rotate: false - xy: 943, 681 + xy: 1867, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-swarmer-medium rotate: false - xy: 1777, 692 + xy: 3369, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-swarmer-small rotate: false - xy: 1693, 554 + xy: 1331, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-swarmer-tiny rotate: false - xy: 1730, 474 + xy: 3941, 228 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-swarmer-xlarge rotate: false - xy: 781, 578 + xy: 1709, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-tainted-water-large rotate: false - xy: 1153, 849 + xy: 1909, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-tainted-water-medium rotate: false - xy: 1811, 726 + xy: 3403, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tainted-water-small rotate: false - xy: 1719, 580 + xy: 1201, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-tainted-water-tiny rotate: false - xy: 1748, 492 + xy: 3977, 246 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-tainted-water-xlarge rotate: false - xy: 831, 578 + xy: 1759, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-tar-large rotate: false - xy: 1111, 807 + xy: 1951, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-tar-medium rotate: false - xy: 1811, 692 + xy: 3437, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tar-small rotate: false - xy: 1693, 528 + xy: 1227, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-tar-tiny rotate: false - xy: 1676, 402 + xy: 3959, 228 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-tar-xlarge rotate: false - xy: 351, 566 + xy: 1809, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-tendrils-large rotate: false - xy: 1069, 765 + xy: 1993, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-tendrils-medium rotate: false - xy: 1845, 726 + xy: 3471, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-tendrils-small rotate: false - xy: 1719, 554 + xy: 1253, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-tendrils-tiny rotate: false - xy: 1694, 420 + xy: 3995, 246 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-tendrils-xlarge rotate: false - xy: 351, 516 + xy: 1859, 410 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-large + rotate: false + xy: 1909, 200 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-medium + rotate: false + xy: 3505, 316 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-small + rotate: false + xy: 1279, 88 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-tiny + rotate: false + xy: 3977, 228 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tetrative-reconstructor-xlarge + rotate: false + xy: 1909, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thermal-generator-large rotate: false - xy: 1027, 723 + xy: 1951, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thermal-generator-medium rotate: false - xy: 1845, 692 + xy: 3539, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thermal-generator-small rotate: false - xy: 1745, 580 + xy: 1305, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thermal-generator-tiny rotate: false - xy: 1712, 438 + xy: 4013, 246 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thermal-generator-xlarge rotate: false - xy: 401, 566 + xy: 1959, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thermal-pump-large rotate: false - xy: 985, 681 + xy: 1993, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thermal-pump-medium rotate: false - xy: 1879, 726 + xy: 3573, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thermal-pump-small rotate: false - xy: 1719, 528 + xy: 1357, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thermal-pump-tiny rotate: false - xy: 1730, 456 + xy: 3995, 228 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thermal-pump-xlarge rotate: false - xy: 351, 466 + xy: 2009, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thorium-reactor-large rotate: false - xy: 1195, 849 + xy: 2035, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thorium-reactor-medium rotate: false - xy: 1879, 692 + xy: 3607, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thorium-reactor-small rotate: false - xy: 1745, 554 + xy: 1227, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thorium-reactor-tiny rotate: false - xy: 1748, 474 + xy: 4013, 228 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thorium-reactor-xlarge rotate: false - xy: 401, 516 + xy: 2059, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thorium-wall-large rotate: false - xy: 1153, 807 + xy: 1951, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thorium-wall-large-large rotate: false - xy: 1111, 765 + xy: 1993, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thorium-wall-large-medium rotate: false - xy: 1913, 726 + xy: 3641, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thorium-wall-large-small rotate: false - xy: 1771, 580 + xy: 1253, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thorium-wall-large-tiny rotate: false - xy: 1766, 492 + xy: 1489, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thorium-wall-large-xlarge rotate: false - xy: 451, 566 + xy: 2109, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thorium-wall-medium rotate: false - xy: 1913, 692 + xy: 3675, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thorium-wall-small rotate: false - xy: 1745, 528 + xy: 1279, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thorium-wall-tiny rotate: false - xy: 1694, 402 + xy: 1507, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thorium-wall-xlarge rotate: false - xy: 351, 416 + xy: 2159, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-thruster-large rotate: false - xy: 1069, 723 + xy: 2035, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-thruster-medium rotate: false - xy: 1947, 726 + xy: 3709, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-thruster-small rotate: false - xy: 1771, 554 + xy: 1305, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-thruster-tiny rotate: false - xy: 1712, 420 + xy: 1525, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-thruster-xlarge rotate: false - xy: 401, 466 + xy: 2209, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-titanium-conveyor-large rotate: false - xy: 1027, 681 + xy: 2077, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-titanium-conveyor-medium rotate: false - xy: 1947, 692 + xy: 3743, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-conveyor-small rotate: false - xy: 1797, 580 + xy: 1331, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-titanium-conveyor-tiny rotate: false - xy: 1730, 438 + xy: 1543, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-titanium-conveyor-xlarge rotate: false - xy: 451, 516 + xy: 2259, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-titanium-wall-large rotate: false - xy: 1237, 849 + xy: 1993, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-titanium-wall-large-large rotate: false - xy: 1195, 807 + xy: 2035, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-titanium-wall-large-medium rotate: false - xy: 1981, 726 + xy: 3777, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-large-small rotate: false - xy: 1771, 528 + xy: 1383, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-titanium-wall-large-tiny rotate: false - xy: 1748, 456 + xy: 1561, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-titanium-wall-large-xlarge rotate: false - xy: 501, 566 + xy: 2309, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-titanium-wall-medium rotate: false - xy: 2015, 729 + xy: 3811, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-titanium-wall-small rotate: false - xy: 1797, 554 + xy: 1253, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-titanium-wall-tiny rotate: false - xy: 1766, 474 + xy: 1579, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-titanium-wall-xlarge rotate: false - xy: 351, 366 + xy: 2359, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-turbine-generator-large rotate: false - xy: 1153, 765 + xy: 2077, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-turbine-generator-medium rotate: false - xy: 2015, 695 + xy: 3845, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-turbine-generator-small rotate: false - xy: 1823, 580 + xy: 1279, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-turbine-generator-tiny rotate: false - xy: 1784, 492 + xy: 1597, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-turbine-generator-xlarge rotate: false - xy: 401, 416 + xy: 2409, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-underflow-gate-large rotate: false - xy: 1111, 723 + xy: 2119, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-underflow-gate-medium rotate: false - xy: 1981, 692 + xy: 3879, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-underflow-gate-small rotate: false - xy: 1797, 528 + xy: 1305, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-underflow-gate-tiny rotate: false - xy: 1712, 402 + xy: 1615, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-underflow-gate-xlarge rotate: false - xy: 451, 466 + xy: 2459, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-unloader-large rotate: false - xy: 1069, 681 + xy: 2035, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-unloader-medium rotate: false - xy: 2015, 661 + xy: 3913, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-unloader-small rotate: false - xy: 1823, 554 + xy: 1331, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-unloader-tiny rotate: false - xy: 1730, 420 + xy: 1633, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-unloader-xlarge rotate: false - xy: 501, 516 + xy: 2509, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-vault-large rotate: false - xy: 1279, 849 + xy: 2077, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-vault-medium rotate: false - xy: 1403, 658 + xy: 3947, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-vault-small rotate: false - xy: 1849, 580 + xy: 1357, 114 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-vault-tiny rotate: false - xy: 1748, 438 + xy: 1651, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-vault-xlarge rotate: false - xy: 551, 566 + xy: 2559, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-water-extractor-large rotate: false - xy: 1237, 807 + xy: 2119, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-water-extractor-medium rotate: false - xy: 1437, 658 + xy: 3981, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-water-extractor-small rotate: false - xy: 1823, 528 + xy: 1409, 140 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-water-extractor-tiny rotate: false - xy: 1766, 456 + xy: 1669, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-water-extractor-xlarge rotate: false - xy: 351, 316 + xy: 2609, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-water-large rotate: false - xy: 1195, 765 + xy: 2161, 326 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-water-medium rotate: false - xy: 1471, 658 + xy: 4015, 316 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-water-small rotate: false - xy: 1849, 554 + xy: 1279, 10 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-water-tiny rotate: false - xy: 1784, 474 + xy: 1687, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-water-xlarge rotate: false - xy: 401, 366 + xy: 2659, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-wave-large rotate: false - xy: 1153, 723 + xy: 2077, 200 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-wave-medium rotate: false - xy: 1505, 658 + xy: 2128, 145 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-wave-small rotate: false - xy: 1875, 580 + xy: 1305, 36 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-wave-tiny rotate: false - xy: 1802, 492 + xy: 1705, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-wave-xlarge rotate: false - xy: 451, 416 + xy: 2709, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-white-tree-dead-large rotate: false - xy: 1111, 681 + xy: 2119, 242 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-white-tree-dead-medium rotate: false - xy: 1539, 658 + xy: 2161, 221 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-white-tree-dead-small rotate: false - xy: 1849, 528 + xy: 1331, 62 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-white-tree-dead-tiny rotate: false - xy: 1730, 402 + xy: 1723, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-white-tree-dead-xlarge rotate: false - xy: 501, 466 + xy: 2759, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 block-white-tree-large rotate: false - xy: 1321, 849 + xy: 2161, 284 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 block-white-tree-medium rotate: false - xy: 1573, 658 + xy: 2162, 187 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-white-tree-small rotate: false - xy: 1875, 554 + xy: 1357, 88 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 block-white-tree-tiny rotate: false - xy: 1748, 420 + xy: 1741, 112 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 block-white-tree-xlarge rotate: false - xy: 551, 516 + xy: 2809, 410 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 button rotate: false - xy: 1667, 862 + xy: 2431, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15979,7 +16714,7 @@ button index: -1 button-disabled rotate: false - xy: 435, 1 + xy: 4057, 481 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15987,7 +16722,7 @@ button-disabled index: -1 button-down rotate: false - xy: 473, 1 + xy: 2203, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15995,7 +16730,7 @@ button-down index: -1 button-edge-1 rotate: false - xy: 511, 1 + xy: 2119, 213 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16003,7 +16738,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 1279, 820 + xy: 2161, 255 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16011,7 +16746,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 1237, 778 + xy: 2203, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16019,7 +16754,7 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 1195, 736 + xy: 2241, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16027,7 +16762,7 @@ button-edge-4 index: -1 button-edge-over-4 rotate: false - xy: 1153, 694 + xy: 2241, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16035,7 +16770,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 1363, 862 + xy: 2279, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16043,7 +16778,7 @@ button-over index: -1 button-red rotate: false - xy: 1317, 820 + xy: 2279, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16051,7 +16786,7 @@ button-red index: -1 button-right rotate: false - xy: 1477, 862 + xy: 2355, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16059,7 +16794,7 @@ button-right index: -1 button-right-down rotate: false - xy: 1401, 862 + xy: 2317, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16067,7 +16802,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 1439, 862 + xy: 2317, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16075,7 +16810,7 @@ button-right-over index: -1 button-select rotate: false - xy: 1901, 580 + xy: 1383, 114 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -16083,7 +16818,7 @@ button-select index: -1 button-square rotate: false - xy: 1591, 862 + xy: 2393, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16091,7 +16826,7 @@ button-square index: -1 button-square-down rotate: false - xy: 1515, 862 + xy: 2355, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16099,7 +16834,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 1553, 862 + xy: 2393, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16107,7 +16842,7 @@ button-square-over index: -1 button-trans rotate: false - xy: 1629, 862 + xy: 2431, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16115,77 +16850,77 @@ button-trans index: -1 check-disabled rotate: false - xy: 1607, 658 + xy: 2162, 153 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 1641, 658 + xy: 2855, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 1675, 658 + xy: 2889, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 1709, 658 + xy: 2923, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 1743, 658 + xy: 2957, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 1777, 658 + xy: 2991, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 771, 916 + xy: 771, 401 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 crater rotate: false - xy: 131, 538 + xy: 4077, 343 size: 18, 18 orig: 18, 18 offset: 0, 0 index: -1 cursor rotate: false - xy: 259, 663 + xy: 3699, 276 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 discord-banner rotate: false - xy: 771, 978 + xy: 771, 463 size: 84, 45 orig: 84, 45 offset: 0, 0 index: -1 flat-down-base rotate: false - xy: 1705, 862 + xy: 2469, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16193,14 +16928,14 @@ flat-down-base index: -1 info-banner rotate: false - xy: 259, 869 + xy: 259, 354 size: 84, 45 orig: 84, 45 offset: 0, 0 index: -1 inventory rotate: false - xy: 1875, 512 + xy: 1435, 124 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 @@ -16208,161 +16943,161 @@ inventory index: -1 item-blast-compound-icon rotate: false - xy: 1811, 658 + xy: 3025, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-coal-icon rotate: false - xy: 1845, 658 + xy: 3059, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-copper-icon rotate: false - xy: 1879, 658 + xy: 3093, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-graphite-icon rotate: false - xy: 1913, 658 + xy: 3127, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-lead-icon rotate: false - xy: 1947, 658 + xy: 3161, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-metaglass-icon rotate: false - xy: 1981, 658 + xy: 3195, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-phase-fabric-icon rotate: false - xy: 2015, 627 + xy: 3229, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-plastanium-icon rotate: false - xy: 1229, 676 + xy: 3263, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-pyratite-icon rotate: false - xy: 1263, 676 + xy: 3297, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-sand-icon rotate: false - xy: 1221, 642 + xy: 3331, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-scrap-icon rotate: false - xy: 1221, 608 + xy: 3365, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-silicon-icon rotate: false - xy: 1255, 642 + xy: 3399, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-spore-pod-icon rotate: false - xy: 1255, 608 + xy: 3433, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-surge-alloy-icon rotate: false - xy: 1235, 574 + xy: 3467, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-thorium-icon rotate: false - xy: 1235, 540 + xy: 3501, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 item-titanium-icon rotate: false - xy: 1235, 506 + xy: 3535, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-cryofluid-icon rotate: false - xy: 1235, 472 + xy: 3569, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-oil-icon rotate: false - xy: 1235, 438 + xy: 3603, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-slag-icon rotate: false - xy: 1269, 574 + xy: 3637, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-water-icon rotate: false - xy: 1269, 540 + xy: 3671, 282 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 logo rotate: false - xy: 1, 916 + xy: 1, 401 size: 768, 107 orig: 768, 107 offset: 0, 0 index: -1 nomap rotate: false - xy: 1, 658 + xy: 1, 143 size: 256, 256 orig: 256, 256 offset: 0, 0 index: -1 pane rotate: false - xy: 1781, 862 + xy: 2507, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16370,7 +17105,7 @@ pane index: -1 pane-2 rotate: false - xy: 1743, 862 + xy: 2469, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16378,7 +17113,7 @@ pane-2 index: -1 scroll rotate: false - xy: 1927, 569 + xy: 1409, 103 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -16386,7 +17121,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 43, 2 + xy: 901, 174 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -16394,70 +17129,70 @@ scroll-horizontal index: -1 scroll-knob-horizontal-black rotate: false - xy: 1, 2 + xy: 859, 174 size: 40, 24 orig: 40, 24 offset: 0, 0 index: -1 scroll-knob-vertical-black rotate: false - xy: 1901, 538 + xy: 1461, 124 size: 24, 40 orig: 24, 40 offset: 0, 0 index: -1 scroll-knob-vertical-thin rotate: false - xy: 1766, 414 + xy: 4080, 387 size: 12, 40 orig: 12, 40 offset: 0, 0 index: -1 selection rotate: false - xy: 821, 975 + xy: 4069, 426 size: 1, 1 orig: 1, 1 offset: 0, 0 index: -1 slider rotate: false - xy: 1315, 628 + xy: 4094, 419 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 1269, 500 + xy: 3705, 276 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 1269, 460 + xy: 3736, 276 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 1269, 420 + xy: 3767, 276 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-vertical rotate: false - xy: 309, 866 + xy: 309, 351 size: 8, 1 orig: 8, 1 offset: 0, 0 index: -1 underline rotate: false - xy: 1933, 862 + xy: 2583, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16465,7 +17200,7 @@ underline index: -1 underline-2 rotate: false - xy: 1819, 862 + xy: 2507, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16473,7 +17208,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 1857, 862 + xy: 2545, 339 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16481,7 +17216,7 @@ underline-disabled index: -1 underline-red rotate: false - xy: 1895, 862 + xy: 2545, 310 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16489,14 +17224,14 @@ underline-red index: -1 whiteui rotate: false - xy: 821, 928 + xy: 845, 363 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 1347, 621 + xy: 4051, 363 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 6ca4632feb..027ec6b153 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 c8ab971458..1a34438d80 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 3c818547c8..ca73704f2c 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 87b18413db..c827aad9a0 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 dc4b0cf89e..aaebb47d17 100644 Binary files a/core/assets/sprites/sprites5.png and b/core/assets/sprites/sprites5.png differ diff --git a/core/build.gradle b/core/build.gradle index f8d539ee3b..caba473d6c 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,3 +1 @@ -sourceCompatibility = 1.8 -[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' sourceSets.main.java.srcDirs = ["src/", "$buildDir/generated/sources/annotationProcessor/java/main"] diff --git a/core/src/mindustry/ClientLauncher.java b/core/src/mindustry/ClientLauncher.java index d7287df1be..461b5014c4 100644 --- a/core/src/mindustry/ClientLauncher.java +++ b/core/src/mindustry/ClientLauncher.java @@ -40,6 +40,12 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform Vars.platform = this; beginTime = Time.millis(); + //debug GL information + Log.info("[GL] Version: @", graphics.getGLVersion()); + Log.info("[GL] Max texture size: @", Gl.getInt(Gl.maxTextureSize)); + Log.info("[GL] OpenGL 3.0 context: @", gl30 != null); + Log.info("[JAVA] Version: @", System.getProperty("java.version")); + Time.setDeltaProvider(() -> { float result = Core.graphics.getDeltaTime() * 60f; return (Float.isNaN(result) || Float.isInfinite(result)) ? 1f : Mathf.clamp(result, 0.0001f, 60f / 10f); @@ -65,7 +71,8 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform Fonts.loadDefaultFont(); - assets.load(new AssetDescriptor<>("sprites/sprites.atlas", TextureAtlas.class)).loaded = t -> { + //load fallback atlas if max texture size is below 4096 + assets.load(new AssetDescriptor<>(Gl.getInt(Gl.maxTextureSize) >= 4096 ? "sprites/sprites.atlas" : "sprites/fallback/sprites.atlas", TextureAtlas.class)).loaded = t -> { atlas = (TextureAtlas)t; Fonts.mergeFontAtlas(atlas); }; diff --git a/core/src/mindustry/Vars.java b/core/src/mindustry/Vars.java index 31a9e191bd..1587c69460 100644 --- a/core/src/mindustry/Vars.java +++ b/core/src/mindustry/Vars.java @@ -1,6 +1,5 @@ package mindustry; -import arc.Application.*; import arc.*; import arc.assets.*; import arc.files.*; @@ -62,7 +61,7 @@ public class Vars implements Loadable{ /** URL of the github issue report template.*/ public static final String reportIssueURL = "https://github.com/Anuken/Mindustry/issues/new?template=bug_report.md"; /** list of built-in servers.*/ - public static final Array defaultServers = Array.with(); + public static final Seq defaultServers = Seq.with(); /** maximum distance between mine and core that supports automatic transferring */ public static final float mineTransferRange = 220f; /** max chat message length */ @@ -134,6 +133,9 @@ public class Vars implements Loadable{ public static boolean clearSectors = false; /** whether any light rendering is enabled */ public static boolean enableLight = true; + /** Whether to draw shadows of blocks at map edges and static blocks. + * Do not change unless you know exactly what you are doing.*/ + public static boolean enableDarkness = true; /** application data directory, equivalent to {@link Settings#getDataDirectory()} */ public static Fi dataDirectory; /** data subdirectory used for screenshots */ @@ -168,7 +170,6 @@ public class Vars implements Loadable{ public static Net net; public static ContentLoader content; public static GameState state; - public static GlobalData data; public static EntityCollisions collisions; public static DefaultWaves defaultWaves; public static mindustry.audio.LoopControl loops; @@ -254,11 +255,10 @@ public class Vars implements Loadable{ bases = new BaseRegistry(); state = new GameState(); - data = new GlobalData(); - mobile = Core.app.getType() == ApplicationType.Android || Core.app.getType() == ApplicationType.iOS || testMobile; - ios = Core.app.getType() == ApplicationType.iOS; - android = Core.app.getType() == ApplicationType.Android; + mobile = Core.app.isMobile() || testMobile; + ios = Core.app.isIOS(); + android = Core.app.isAndroid(); modDirectory.mkdirs(); @@ -272,7 +272,7 @@ public class Vars implements Loadable{ String[] tags = {"[green][D][]", "[royal][I][]", "[yellow][W][]", "[scarlet][E][]", ""}; String[] stags = {"&lc&fb[D]", "&lg&fb[I]", "&ly&fb[W]", "&lr&fb[E]", ""}; - Array logBuffer = new Array<>(); + Seq logBuffer = new Seq<>(); Log.setLogger((level, text) -> { String result = text; String rawText = Log.format(stags[level.ordinal()] + "&fr " + text); diff --git a/core/src/mindustry/ai/Astar.java b/core/src/mindustry/ai/Astar.java index 1499be5ce5..c6f33e70f6 100644 --- a/core/src/mindustry/ai/Astar.java +++ b/core/src/mindustry/ai/Astar.java @@ -11,20 +11,20 @@ import static mindustry.Vars.world; public class Astar{ public static final DistanceHeuristic manhattan = (x1, y1, x2, y2) -> Math.abs(x1 - x2) + Math.abs(y1 - y2); - private static final Array out = new Array<>(); + private static final Seq out = new Seq<>(); private static final PQueue queue = new PQueue<>(200 * 200 / 4, (a, b) -> 0); private static final IntFloatMap costs = new IntFloatMap(); private static byte[][] rotations; - public static Array pathfind(Tile from, Tile to, TileHueristic th, Boolf passable){ + public static Seq pathfind(Tile from, Tile to, TileHueristic th, Boolf passable){ return pathfind(from.x, from.y, to.x, to.y, th, manhattan, passable); } - public static Array pathfind(int startX, int startY, int endX, int endY, TileHueristic th, Boolf passable){ + public static Seq pathfind(int startX, int startY, int endX, int endY, TileHueristic th, Boolf passable){ return pathfind(startX, startY, endX, endY, th, manhattan, passable); } - public static Array pathfind(int startX, int startY, int endX, int endY, TileHueristic th, DistanceHeuristic dh, Boolf passable){ + public static Seq pathfind(int startX, int startY, int endX, int endY, TileHueristic th, DistanceHeuristic dh, Boolf passable){ Tiles tiles = world.tiles; Tile start = tiles.getn(startX, startY); diff --git a/core/src/mindustry/ai/BaseAI.java b/core/src/mindustry/ai/BaseAI.java index 466a3fad95..06e7720651 100644 --- a/core/src/mindustry/ai/BaseAI.java +++ b/core/src/mindustry/ai/BaseAI.java @@ -10,11 +10,12 @@ import mindustry.content.*; import mindustry.game.*; import mindustry.game.Schematic.*; import mindustry.game.Teams.*; +import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.defense.*; import mindustry.world.blocks.production.*; -import mindustry.world.blocks.storage.CoreBlock.*; +import mindustry.world.blocks.storage.*; import static mindustry.Vars.*; @@ -24,6 +25,7 @@ public class BaseAI{ private static final float step = 5; private static final int attempts = 5; private static final float emptyChance = 0.01f; + private final static int timerStep = 0, timerSpawn = 1; private static int correct = 0, incorrect = 0; @@ -31,16 +33,27 @@ public class BaseAI{ private boolean triedWalls; TeamData data; - Interval timer = new Interval(); + Interval timer = new Interval(4); public BaseAI(TeamData data){ this.data = data; } public void update(){ + if(timer.get(timerSpawn, 60) && data.hasCore()){ + CoreBlock block = (CoreBlock)data.core().block; + + //create AI core unit + if(!Groups.unit.contains(u -> u.team() == data.team && u.type() == block.unitType)){ + Unitc unit = block.unitType.create(data.team); + unit.set(data.core()); + unit.add(); + Fx.spawn.at(unit); + } + } //only schedule when there's something to build. - if(data.blocks.isEmpty() && timer.get(step)){ + if(data.blocks.isEmpty() && timer.get(timerStep, step)){ if(!triedWalls){ tryWalls(); triedWalls = true; @@ -48,13 +61,16 @@ public class BaseAI{ for(int i = 0; i < attempts; i++){ int range = 150; - CoreEntity core = data.cores.random(); + + Position pos = randomPosition(); + //when there are no random positions, do nothing. + if(pos == null) return; Tmp.v1.rnd(Mathf.random(range)); - int wx = (int)(core.tileX() + Tmp.v1.x), wy = (int)(core.tileY() + Tmp.v1.y); + int wx = (int)(world.toTile(pos.getX()) + Tmp.v1.x), wy = (int)(world.toTile(pos.getY()) + Tmp.v1.y); Tile tile = world.tiles.getc(wx, wy); - Array parts = null; + Seq parts = null; //pick a completely random base part, and place it a random location //((yes, very intelligent)) @@ -74,7 +90,17 @@ public class BaseAI{ } } - boolean tryPlace(BasePart part, int x, int y){ + /** @return a random position from which to seed building. */ + private Position randomPosition(){ + if(data.hasCore()){ + return data.cores.random(); + }else if(data.team == state.rules.waveTeam){ + return spawner.getSpawns().random(); + } + return null; + } + + private boolean tryPlace(BasePart part, int x, int y){ int rotation = Mathf.range(2); axis.set((int)(part.schematic.width / 2f), (int)(part.schematic.height / 2f)); Schematic result = Schematics.rotate(part.schematic, rotation); @@ -131,7 +157,7 @@ public class BaseAI{ return true; } - void tryWalls(){ + private void tryWalls(){ Block wall = Blocks.copperWall; Tile spawn = state.rules.defaultTeam.core() != null ? state.rules.defaultTeam.core().tile : data.team.core().tile; diff --git a/core/src/mindustry/ai/BaseRegistry.java b/core/src/mindustry/ai/BaseRegistry.java index 88ceb86635..da6a11a562 100644 --- a/core/src/mindustry/ai/BaseRegistry.java +++ b/core/src/mindustry/ai/BaseRegistry.java @@ -19,12 +19,12 @@ import java.io.*; import static mindustry.Vars.tilesize; public class BaseRegistry{ - public Array cores = new Array<>(); - public Array parts = new Array<>(); - public ObjectMap> reqParts = new ObjectMap<>(); + public Seq cores = new Seq<>(); + public Seq parts = new Seq<>(); + public ObjectMap> reqParts = new ObjectMap<>(); - public Array forResource(Content item){ - return reqParts.get(item, Array::new); + public Seq forResource(Content item){ + return reqParts.get(item, Seq::new); } public void load(){ @@ -85,7 +85,7 @@ public class BaseRegistry{ part.centerY = part.schematic.height/2; } - if(part.required != null) reqParts.get(part.required, Array::new).add(part); + if(part.required != null) reqParts.get(part.required, Seq::new).add(part); }catch(IOException e){ throw new RuntimeException(e); diff --git a/core/src/mindustry/ai/BlockIndexer.java b/core/src/mindustry/ai/BlockIndexer.java index 1560263ee8..637bed1bbb 100644 --- a/core/src/mindustry/ai/BlockIndexer.java +++ b/core/src/mindustry/ai/BlockIndexer.java @@ -38,7 +38,7 @@ public class BlockIndexer{ /** All ores available on this map. */ private ObjectSet allOres = new ObjectSet<>(); /** Stores teams that are present here as tiles. */ - private Array activeTeams = new Array<>(); + private Seq activeTeams = new Seq<>(); /** 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. */ @@ -48,7 +48,7 @@ public class BlockIndexer{ /** Empty set used for returning. */ private TileArray emptySet = new TileArray(); /** Array used for returning and reusing. */ - private Array returnArray = new Array<>(); + private Seq returnArray = new Seq<>(); public BlockIndexer(){ Events.on(TileChangeEvent.class, event -> { @@ -196,7 +196,7 @@ public class BlockIndexer{ } /** Get all enemy blocks with a flag. */ - public Array getEnemy(Team team, BlockFlag type){ + public Seq getEnemy(Team team, BlockFlag type){ returnArray.clear(); for(Team enemy : team.enemies()){ if(state.teams.isActive(enemy)){ @@ -446,7 +446,7 @@ public class BlockIndexer{ } public static class TileArray implements Iterable{ - private Array tiles = new Array<>(false, 16); + private Seq tiles = new Seq<>(false, 16); private IntSet contained = new IntSet(); public void add(Tile tile){ diff --git a/core/src/mindustry/ai/Pathfinder.java b/core/src/mindustry/ai/Pathfinder.java index 06550d602c..5b8f58b93e 100644 --- a/core/src/mindustry/ai/Pathfinder.java +++ b/core/src/mindustry/ai/Pathfinder.java @@ -26,7 +26,7 @@ public class Pathfinder implements Runnable{ /** tile data, see PathTileStruct */ private int[][] tiles; /** unordered array of path data for iteration only. DO NOT iterate or access this in the main thread. */ - private Array threadList = new Array<>(), mainList = new Array<>(); + 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. */ @@ -37,7 +37,7 @@ public class Pathfinder implements Runnable{ private ObjectMap targetCache = new ObjectMap<>(); /** Current pathfinding thread */ private @Nullable Thread thread; - private IntArray tmpArray = new IntArray(); + private IntSeq tmpArray = new IntSeq(); public Pathfinder(){ Events.on(WorldLoadEvent.class, event -> { @@ -48,8 +48,8 @@ public class Pathfinder implements Runnable{ fieldMap = new ObjectMap[Team.all.length]; fieldMapUsed = new ObjectSet[Team.all.length]; targetCache = new ObjectMap<>(); - threadList = new Array<>(); - mainList = new Array<>(); + threadList = new Seq<>(); + mainList = new Seq<>(); for(Tile tile : world.tiles){ tiles[tile.x][tile.y] = packTile(tile); @@ -128,33 +128,35 @@ public class Pathfinder implements Runnable{ if(net.client()) return; try{ - queue.run(); + if(state.isPlaying()){ + queue.run(); - //total update time no longer than maxUpdate - for(Flowfield data : threadList){ - updateFrontier(data, maxUpdate / threadList.size); + //total update time no longer than maxUpdate + for(Flowfield data : threadList){ + 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){ - //make sure it doesn't get removed twice - data.lastUpdateTime = Time.millis(); + //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){ + //make sure it doesn't get removed twice + data.lastUpdateTime = Time.millis(); - Team team = data.team; + Team team = data.team; - Core.app.post(() -> { - //remove its used state - if(fieldMap[team.uid] != null){ - fieldMap[team.uid].remove(data.target); - fieldMapUsed[team.uid].remove(data.target); - } - //remove from main thread list - mainList.remove(data); - }); + Core.app.post(() -> { + //remove its used state + if(fieldMap[team.uid] != null){ + fieldMap[team.uid].remove(data.target); + fieldMapUsed[team.uid].remove(data.target); + } + //remove from main thread list + mainList.remove(data); + }); - queue.post(() -> { - //remove from this thread list with a delay - threadList.remove(data); - }); + queue.post(() -> { + //remove from this thread list with a delay + threadList.remove(data); + }); + } } } @@ -189,7 +191,7 @@ public class Pathfinder implements Runnable{ //if this combination is not found, create it on request if(fieldMapUsed[team.uid].add(target)){ //grab targets since this is run on main thread - IntArray targets = target.getPositions(team, new IntArray()); + IntSeq targets = target.getPositions(team, new IntSeq()); queue.post(() -> createPath(team, target, targets)); } return tile; @@ -293,14 +295,14 @@ public class Pathfinder implements Runnable{ } private void preloadPath(Team team, PathTarget target){ - updateFrontier(createPath(team, target, target.getPositions(team, new IntArray())), -1); + updateFrontier(createPath(team, target, target.getPositions(team, new IntSeq())), -1); } /** * 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, IntArray targets){ + private Flowfield createPath(Team team, PathTarget target, IntSeq targets){ Flowfield path = new Flowfield(team, target, world.width(), world.height()); path.lastUpdateTime = Time.millis(); @@ -391,14 +393,14 @@ public class Pathfinder implements Runnable{ public static final FlagTarget[] all = values(); - private final Cons2 targeter; + private final Cons2 targeter; - FlagTarget(Cons2 targeter){ + FlagTarget(Cons2 targeter){ this.targeter = targeter; } @Override - public IntArray getPositions(Team team, IntArray out){ + public IntSeq getPositions(Team team, IntSeq out){ targeter.get(team, out); return out; } @@ -417,7 +419,7 @@ public class Pathfinder implements Runnable{ } @Override - public IntArray getPositions(Team team, IntArray out){ + public IntSeq getPositions(Team team, IntSeq out){ out.add(Point2.pack(world.toTile(position.getX()), world.toTile(position.getY()))); return out; } @@ -430,7 +432,7 @@ public class Pathfinder implements Runnable{ public interface PathTarget{ /** Gets targets to pathfind towards. This must run on the main thread. */ - IntArray getPositions(Team team, IntArray out); + IntSeq getPositions(Team team, IntSeq out); /** Refresh rate in milliseconds. Return any number <= 0 to disable. */ int refreshRate(); } @@ -448,7 +450,7 @@ public class Pathfinder implements Runnable{ /** search frontier, these are Pos objects */ final IntQueue frontier = new IntQueue(); /** all target positions; these positions have a cost of 0, and must be synchronized on! */ - final IntArray targets = new IntArray(); + final IntSeq targets = new IntSeq(); /** current search ID */ int search = 1; /** last updated time */ diff --git a/core/src/mindustry/ai/WaveSpawner.java b/core/src/mindustry/ai/WaveSpawner.java index f7f78882eb..61b02e6113 100644 --- a/core/src/mindustry/ai/WaveSpawner.java +++ b/core/src/mindustry/ai/WaveSpawner.java @@ -17,7 +17,7 @@ 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 Array spawns = new Array<>(); + private Seq spawns = new Seq<>(); private boolean spawning = false; public WaveSpawner(){ @@ -28,7 +28,7 @@ public class WaveSpawner{ return spawns.size; } - public Array getSpawns(){ + public Seq getSpawns(){ return spawns; } diff --git a/core/src/mindustry/ai/formations/BoundedSlotAssignmentStrategy.java b/core/src/mindustry/ai/formations/BoundedSlotAssignmentStrategy.java index dcd96108f6..62461bde31 100644 --- a/core/src/mindustry/ai/formations/BoundedSlotAssignmentStrategy.java +++ b/core/src/mindustry/ai/formations/BoundedSlotAssignmentStrategy.java @@ -7,7 +7,7 @@ import arc.struct.*; * {@code BoundedSlotAssignmentStrategy} is an abstract implementation of {@link SlotAssignmentStrategy} that supports roles. * Generally speaking, there are hard and soft roles. Hard roles cannot be broken, soft roles can. *

- * This abstract class provides an implementation of the {@link #calculateNumberOfSlots(Array) calculateNumberOfSlots} method that + * This abstract class provides an implementation of the {@link #calculateNumberOfSlots(Seq) calculateNumberOfSlots} method that * is more general (and costly) than the simplified implementation in {@link FreeSlotAssignmentStrategy}. It scans the assignment * list to find the number of filled slots, which is the highest slot number in the assignments. * @author davebaol @@ -15,10 +15,10 @@ import arc.struct.*; public abstract class BoundedSlotAssignmentStrategy implements SlotAssignmentStrategy{ @Override - public abstract void updateSlotAssignments(Array assignments); + public abstract void updateSlotAssignments(Seq assignments); @Override - public int calculateNumberOfSlots(Array assignments){ + public int calculateNumberOfSlots(Seq assignments){ // Find the number of filled slots: it will be the // highest slot number in the assignments int filledSlots = -1; @@ -32,7 +32,7 @@ public abstract class BoundedSlotAssignmentStrategy implements SlotAssignmentStr } @Override - public void removeSlotAssignment(Array assignments, int index){ + public void removeSlotAssignment(Seq assignments, int index){ int sn = assignments.get(index).slotNumber; for(int i = 0; i < assignments.size; i++){ SlotAssignment sa = assignments.get(i); diff --git a/core/src/mindustry/ai/formations/DistanceAssignmentStrategy.java b/core/src/mindustry/ai/formations/DistanceAssignmentStrategy.java index 3a68efc915..9713e66862 100644 --- a/core/src/mindustry/ai/formations/DistanceAssignmentStrategy.java +++ b/core/src/mindustry/ai/formations/DistanceAssignmentStrategy.java @@ -13,8 +13,8 @@ public class DistanceAssignmentStrategy implements SlotAssignmentStrategy{ } @Override - public void updateSlotAssignments(Array assignments){ - IntArray slots = IntArray.range(0, assignments.size); + public void updateSlotAssignments(Seq assignments){ + IntSeq slots = IntSeq.range(0, assignments.size); for(SlotAssignment slot : assignments){ int mindex = 0; @@ -35,12 +35,12 @@ public class DistanceAssignmentStrategy implements SlotAssignmentStrategy{ } @Override - public int calculateNumberOfSlots(Array assignments){ + public int calculateNumberOfSlots(Seq assignments){ return assignments.size; } @Override - public void removeSlotAssignment(Array assignments, int index){ + public void removeSlotAssignment(Seq assignments, int index){ assignments.remove(index); } diff --git a/core/src/mindustry/ai/formations/Formation.java b/core/src/mindustry/ai/formations/Formation.java index 8ef03e509b..16db811b2f 100644 --- a/core/src/mindustry/ai/formations/Formation.java +++ b/core/src/mindustry/ai/formations/Formation.java @@ -19,7 +19,7 @@ import arc.struct.*; public class Formation{ /** A list of slots assignments. */ - public Array slotAssignments; + public Seq slotAssignments; /** The anchor point of this formation. */ public Vec3 anchor; @@ -74,7 +74,7 @@ public class Formation{ this.slotAssignmentStrategy = slotAssignmentStrategy; this.motionModerator = motionModerator; - this.slotAssignments = new Array<>(); + this.slotAssignments = new Seq<>(); this.driftOffset = new Vec3(); this.positionOffset = new Vec2(anchor.x, anchor.y).cpy(); } diff --git a/core/src/mindustry/ai/formations/FormationMotionModerator.java b/core/src/mindustry/ai/formations/FormationMotionModerator.java index 9326dd4966..65e55951c9 100644 --- a/core/src/mindustry/ai/formations/FormationMotionModerator.java +++ b/core/src/mindustry/ai/formations/FormationMotionModerator.java @@ -25,7 +25,7 @@ public abstract class FormationMotionModerator{ * @param pattern the pattern * @return the given location for chaining. */ - public Vec3 calculateDriftOffset(Vec3 centerOfMass, Array slotAssignments, FormationPattern pattern){ + public Vec3 calculateDriftOffset(Vec3 centerOfMass, Seq slotAssignments, FormationPattern pattern){ // Clear the center of mass centerOfMass.x = centerOfMass.y = 0; float centerOfMassOrientation = 0; diff --git a/core/src/mindustry/ai/formations/FreeSlotAssignmentStrategy.java b/core/src/mindustry/ai/formations/FreeSlotAssignmentStrategy.java index 58c25fa07e..35fd74f789 100644 --- a/core/src/mindustry/ai/formations/FreeSlotAssignmentStrategy.java +++ b/core/src/mindustry/ai/formations/FreeSlotAssignmentStrategy.java @@ -13,7 +13,7 @@ import arc.struct.*; public class FreeSlotAssignmentStrategy implements SlotAssignmentStrategy{ @Override - public void updateSlotAssignments(Array assignments){ + public void updateSlotAssignments(Seq assignments){ // A very simple assignment algorithm: we simply go through // each assignment in the list and assign sequential slot numbers for(int i = 0; i < assignments.size; i++) @@ -21,12 +21,12 @@ public class FreeSlotAssignmentStrategy implements SlotAssignmentStrategy{ } @Override - public int calculateNumberOfSlots(Array assignments){ + public int calculateNumberOfSlots(Seq assignments){ return assignments.size; } @Override - public void removeSlotAssignment(Array assignments, int index){ + public void removeSlotAssignment(Seq assignments, int index){ assignments.remove(index); } diff --git a/core/src/mindustry/ai/formations/SlotAssignmentStrategy.java b/core/src/mindustry/ai/formations/SlotAssignmentStrategy.java index 698bca1c15..2ccea7aa15 100644 --- a/core/src/mindustry/ai/formations/SlotAssignmentStrategy.java +++ b/core/src/mindustry/ai/formations/SlotAssignmentStrategy.java @@ -9,12 +9,12 @@ import arc.struct.*; public interface SlotAssignmentStrategy{ /** Updates the assignment of members to slots */ - void updateSlotAssignments(Array assignments); + void updateSlotAssignments(Seq assignments); /** Calculates the number of slots from the assignment data. */ - int calculateNumberOfSlots(Array assignments); + int calculateNumberOfSlots(Seq assignments); /** Removes the slot assignment at the specified index. */ - void removeSlotAssignment(Array assignments, int index); + void removeSlotAssignment(Seq assignments, int index); } diff --git a/core/src/mindustry/ai/formations/SoftRoleSlotAssignmentStrategy.java b/core/src/mindustry/ai/formations/SoftRoleSlotAssignmentStrategy.java index 2d61c8566e..f3f3c09bed 100644 --- a/core/src/mindustry/ai/formations/SoftRoleSlotAssignmentStrategy.java +++ b/core/src/mindustry/ai/formations/SoftRoleSlotAssignmentStrategy.java @@ -27,7 +27,7 @@ import arc.util.*; public class SoftRoleSlotAssignmentStrategy extends BoundedSlotAssignmentStrategy{ protected SlotCostProvider slotCostProvider; protected float costThreshold; - private BooleanArray filledSlots; + private BoolSeq filledSlots; /** * Creates a {@code SoftRoleSlotAssignmentStrategy} with the given slot cost provider and no cost threshold. @@ -46,14 +46,14 @@ public class SoftRoleSlotAssignmentStrategy extends BoundedSlotAssignmentStrateg this.slotCostProvider = slotCostProvider; this.costThreshold = costThreshold; - this.filledSlots = new BooleanArray(); + this.filledSlots = new BoolSeq(); } @Override - public void updateSlotAssignments(Array assignments){ + public void updateSlotAssignments(Seq assignments){ // Holds a list of member and slot data for each member. - Array memberData = new Array<>(); + Seq memberData = new Seq<>(); // Compile the member data int numberOfAssignments = assignments.size; @@ -146,12 +146,12 @@ public class SoftRoleSlotAssignmentStrategy extends BoundedSlotAssignmentStrateg static class MemberAndSlots implements Comparable{ FormationMember member; float assignmentEase; - Array costAndSlots; + Seq costAndSlots; public MemberAndSlots(FormationMember member){ this.member = member; this.assignmentEase = 0f; - this.costAndSlots = new Array<>(); + this.costAndSlots = new Seq<>(); } @Override diff --git a/core/src/mindustry/ai/types/BuilderAI.java b/core/src/mindustry/ai/types/BuilderAI.java index 4fd4667c58..31486988f9 100644 --- a/core/src/mindustry/ai/types/BuilderAI.java +++ b/core/src/mindustry/ai/types/BuilderAI.java @@ -23,8 +23,8 @@ public class BuilderAI extends AIController{ } //approach request if building - if(builder.buildRequest() != null){ - BuildRequest req = builder.buildRequest(); + if(builder.buildPlan() != null){ + BuildPlan req = builder.buildPlan(); boolean valid = (req.tile().entity instanceof BuildEntity && req.tile().ent().cblock == req.block) || @@ -37,7 +37,7 @@ public class BuilderAI extends AIController{ moveTo(req.tile(), buildingRange - 20f); }else{ //discard invalid request - builder.requests().removeFirst(); + builder.plans().removeFirst(); } }else{ //find new request @@ -50,7 +50,7 @@ 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. - BuildRequest req = new BuildRequest(block.x, block.y, block.rotation, content.block(block.block)); + BuildPlan req = new BuildPlan(block.x, block.y, block.rotation, content.block(block.block)); if(block.config != null){ req.configure(block.config); } diff --git a/core/src/mindustry/async/AsyncCore.java b/core/src/mindustry/async/AsyncCore.java index 923c46bfb0..a023afafcc 100644 --- a/core/src/mindustry/async/AsyncCore.java +++ b/core/src/mindustry/async/AsyncCore.java @@ -11,13 +11,13 @@ import static mindustry.Vars.state; public class AsyncCore{ //all processes to be executed each frame - private final Array processes = Array.with( + private final Seq processes = Seq.with( new PhysicsProcess(), Vars.teamIndex = new TeamIndexProcess() ); //futures to be awaited - private final Array> futures = new Array<>(); + private final Seq> futures = new Seq<>(); private final ExecutorService executor = Executors.newFixedThreadPool(processes.size, r -> { Thread thread = new Thread(r, "AsyncLogic-Thread"); diff --git a/core/src/mindustry/async/PhysicsProcess.java b/core/src/mindustry/async/PhysicsProcess.java index 165b2a0505..46946fd3de 100644 --- a/core/src/mindustry/async/PhysicsProcess.java +++ b/core/src/mindustry/async/PhysicsProcess.java @@ -10,7 +10,7 @@ import mindustry.gen.*; public class PhysicsProcess implements AsyncProcess{ private Physics physics; - private Array refs = new Array<>(false); + private Seq refs = new Seq<>(false); private BodyDef def; private EntityGroup group; @@ -22,7 +22,7 @@ public class PhysicsProcess implements AsyncProcess{ public PhysicsProcess(){ def = new BodyDef(); - def.type = BodyType.DynamicBody; + def.type = BodyType.dynamicBody; //currently only enabled for units group = Groups.unit; diff --git a/core/src/mindustry/audio/MusicControl.java b/core/src/mindustry/audio/MusicControl.java index cf49975931..c1bd7d0866 100644 --- a/core/src/mindustry/audio/MusicControl.java +++ b/core/src/mindustry/audio/MusicControl.java @@ -16,9 +16,9 @@ public class MusicControl{ protected static final float finTime = 120f, foutTime = 120f, musicInterval = 60 * 60 * 3f, musicChance = 0.6f, musicWaveChance = 0.5f; /** normal, ambient music, plays at any time */ - public Array ambientMusic = Array.with(); + public Seq ambientMusic = Seq.with(); /** darker music, used in times of conflict */ - public Array darkMusic = Array.with(); + public Seq darkMusic = Seq.with(); protected Music lastRandomPlayed; protected Interval timer = new Interval(); protected @Nullable Music current; @@ -39,8 +39,8 @@ public class MusicControl{ protected void reload(){ current = null; fade = 0f; - ambientMusic = Array.with(Musics.game1, Musics.game3, Musics.game4, Musics.game6); - darkMusic = Array.with(Musics.game2, Musics.game5, Musics.game7); + ambientMusic = Seq.with(Musics.game1, Musics.game3, Musics.game4, Musics.game6); + darkMusic = Seq.with(Musics.game2, Musics.game5, Musics.game7); } public void stop(){ diff --git a/core/src/mindustry/content/Blocks.java b/core/src/mindustry/content/Blocks.java index 532dcd6c7b..32b8e448c1 100644 --- a/core/src/mindustry/content/Blocks.java +++ b/core/src/mindustry/content/Blocks.java @@ -5,7 +5,6 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.util.*; -import mindustry.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.bullet.*; @@ -28,6 +27,7 @@ import mindustry.world.blocks.sandbox.*; import mindustry.world.blocks.storage.*; import mindustry.world.blocks.units.*; import mindustry.world.consumers.*; +import mindustry.world.draw.*; import mindustry.world.meta.*; public class Blocks implements ContentList{ @@ -77,10 +77,12 @@ public class Blocks implements ContentList{ duo, scatter, scorch, hail, arc, wave, lancer, swarmer, salvo, fuse, ripple, cyclone, spectre, meltdown, segment, //units - groundFactory, airFactory, navalFactory, basicReconstructor, repairPoint, + groundFactory, airFactory, navalFactory, + additiveReconstructor, multiplicativeReconstructor, exponentialReconstructor, tetrativeReconstructor, + repairPoint, resupplyPoint, //campaign - launchPad, launchPadLarge, coreSilo, dataProcessor, + launchPad, launchPadLarge, dataProcessor, //misc experimental blockForge, blockLoader, blockUnloader; @@ -525,19 +527,11 @@ public class Blocks implements ContentList{ hasPower = hasLiquids = true; craftEffect = Fx.formsmoke; updateEffect = Fx.plasticburn; + drawer = new DrawGlow(); consumes.liquid(Liquids.oil, 0.25f); consumes.power(3f); consumes.item(Items.titanium, 2); - - int topRegion = re("-top"); - - drawer = entity -> { - Draw.rect(region, entity.x(), entity.y()); - Draw.alpha(Mathf.absin(entity.totalProgress, 3f, 0.9f) * entity.warmup); - Draw.rect(re(topRegion), entity.x(), entity.y()); - Draw.reset(); - }; }}; phaseWeaver = new GenericCrafter("phase-weaver"){{ @@ -547,32 +541,11 @@ public class Blocks implements ContentList{ craftTime = 120f; size = 2; hasPower = true; + drawer = new DrawWeave(); consumes.items(new ItemStack(Items.thorium, 4), new ItemStack(Items.sand, 10)); consumes.power(5f); itemCapacity = 20; - - int bottomRegion = re("-bottom"), weaveRegion = re("-weave"); - - drawIcons = () -> new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name), Core.atlas.find(name + "-weave")}; - - drawer = entity -> { - Draw.rect(re(bottomRegion), entity.x(), entity.y()); - Draw.rect(re(weaveRegion), entity.x(), entity.y(), entity.totalProgress); - - Draw.color(Pal.accent); - Draw.alpha(entity.warmup); - - Lines.lineAngleCenter( - entity.x() + Mathf.sin(entity.totalProgress, 6f, Vars.tilesize / 3f * size), - entity.y(), - 90, - size * Vars.tilesize / 2f); - - Draw.reset(); - - Draw.rect(region, entity.x(), entity.y()); - }; }}; surgeSmelter = new GenericSmelter("alloy-smelter"){{ @@ -598,29 +571,11 @@ public class Blocks implements ContentList{ rotate = false; solid = true; outputsLiquid = true; + drawer = new DrawMixer(); consumes.power(1f); consumes.item(Items.titanium); consumes.liquid(Liquids.water, 0.2f); - - int liquidRegion = re("-liquid"), topRegion = re("-top"), bottomRegion = re("-bottom"); - - drawIcons = () -> new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name + "-top")}; - - drawer = entity -> { - float rotation = rotate ? entity.rotdeg() : 0; - - Draw.rect(re(bottomRegion), entity.x(), entity.y(), rotation); - - if(entity.liquids().total() > 0.001f){ - Draw.color(outputLiquid.liquid.color); - Draw.alpha(entity.liquids().get(outputLiquid.liquid) / liquidCapacity); - Draw.rect(re(liquidRegion), entity.x(), entity.y(), rotation); - Draw.color(); - } - - Draw.rect(re(topRegion), entity.x(), entity.y(), rotation); - }; }}; blastMixer = new GenericCrafter("blast-mixer"){{ @@ -702,27 +657,10 @@ public class Blocks implements ContentList{ hasLiquids = true; hasPower = true; craftEffect = Fx.none; + drawer = new DrawAnimation(); consumes.item(Items.sporePod, 1); consumes.power(0.60f); - - int[] frameRegions = new int[3]; - for(int i = 0; i < 3; i++){ - frameRegions[i] = re("-frame" + i); - } - - int liquidRegion = re("-liquid"); - int topRegion = re("-top"); - - drawIcons = () -> new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-top")}; - drawer = entity -> { - Draw.rect(region, entity.x(), entity.y()); - Draw.rect(re(frameRegions[(int)Mathf.absin(entity.totalProgress, 5f, 2.999f)]), entity.x(), entity.y()); - Draw.color(Color.clear, entity.liquids().current().color, entity.liquids().total() / liquidCapacity); - Draw.rect(re(liquidRegion), entity.x(), entity.y()); - Draw.color(); - Draw.rect(re(topRegion), entity.x(), entity.y()); - }; }}; pulverizer = new GenericCrafter("pulverizer"){{ @@ -732,18 +670,10 @@ public class Blocks implements ContentList{ craftTime = 40f; updateEffect = Fx.pulverizeSmall; hasItems = hasPower = true; + drawer = new DrawRotator(); consumes.item(Items.scrap, 1); consumes.power(0.50f); - - int rotatorRegion = re("-rotator"); - - drawIcons = () -> new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-rotator")}; - - drawer = entity -> { - Draw.rect(region, entity.x(), entity.y()); - Draw.rect(re(rotatorRegion), entity.x(), entity.y(), entity.totalProgress * 2f); - }; }}; coalCentrifuge = new GenericCrafter("coal-centrifuge"){{ @@ -1572,7 +1502,7 @@ public class Blocks implements ContentList{ health = 220 * size * size; shootSound = Sounds.shotgun; - ammo(Items.graphite, new BulletType(0.01f, 105){ + ammo(Items.thorium, new BulletType(0.01f, 105){ int rays = 1; float rayLength = range + 10f; @@ -1581,6 +1511,7 @@ public class Blocks implements ContentList{ shootEffect = smokeEffect = Fx.lightningShoot; lifetime = 10f; despawnEffect = Fx.none; + ammoMultiplier = 6f; pierce = true; } @@ -1721,8 +1652,6 @@ public class Blocks implements ContentList{ //endregion //region units - //for testing only. - groundFactory = new UnitFactory("ground-factory"){{ requirements(Category.units, ItemStack.with(Items.copper, 30, Items.lead, 70)); plans = new UnitPlan[]{ @@ -1756,23 +1685,68 @@ public class Blocks implements ContentList{ consumes.power(1.2f); }}; - basicReconstructor = new Reconstructor("basic-reconstructor"){{ + additiveReconstructor = new Reconstructor("additive-reconstructor"){{ requirements(Category.units, ItemStack.with(Items.copper, 50, Items.lead, 120, Items.silicon, 230)); size = 3; consumes.power(3f); - consumes.items(ItemStack.with(Items.silicon, 30, Items.graphite, 30)); - itemCapacity = 30; + consumes.items(ItemStack.with(Items.silicon, 40, Items.graphite, 30)); constructTime = 60f * 5f; upgrades = new UnitType[][]{ - {UnitTypes.dagger, UnitTypes.titan}, + {UnitTypes.tau, UnitTypes.oculon}, + {UnitTypes.dagger, UnitTypes.mace}, {UnitTypes.crawler, UnitTypes.eruptor}, {UnitTypes.wraith, UnitTypes.ghoul}, }; }}; + multiplicativeReconstructor = new Reconstructor("multiplicative-reconstructor"){{ + requirements(Category.units, ItemStack.with(Items.copper, 50, Items.lead, 120, Items.silicon, 230)); + + size = 5; + consumes.power(6f); + consumes.items(ItemStack.with(Items.silicon, 120, Items.titanium, 80)); + + constructTime = 60f * 15f; + + upgrades = new UnitType[][]{ + {UnitTypes.ghoul, UnitTypes.revenant}, + {UnitTypes.mace, UnitTypes.fortress}, + }; + }}; + + exponentialReconstructor = new Reconstructor("exponential-reconstructor"){{ + requirements(Category.units, ItemStack.with(Items.copper, 50, Items.lead, 120, Items.silicon, 230)); + + size = 7; + consumes.power(12f); + consumes.items(ItemStack.with(Items.silicon, 200, Items.titanium, 200, Items.surgealloy, 200)); + consumes.liquid(Liquids.cryofluid, 1f); + + constructTime = 60f * 60f; + + upgrades = new UnitType[][]{ + {UnitTypes.revenant, UnitTypes.lich}, + }; + }}; + + tetrativeReconstructor = new Reconstructor("tetrative-reconstructor"){{ + requirements(Category.units, ItemStack.with(Items.copper, 50, Items.lead, 120, Items.silicon, 230)); + + size = 9; + consumes.power(25f); + consumes.items(ItemStack.with(Items.silicon, 300, Items.plastanium, 300, Items.surgealloy, 300, Items.phasefabric, 250)); + consumes.liquid(Liquids.cryofluid, 3f); + + constructTime = 60f * 60f * 3; + + upgrades = new UnitType[][]{ + {UnitTypes.lich, UnitTypes.reaper}, + }; + }}; + repairPoint = new RepairPoint("repair-point"){{ requirements(Category.units, ItemStack.with(Items.lead, 15, Items.copper, 15, Items.silicon, 15)); repairSpeed = 0.5f; @@ -1780,6 +1754,15 @@ public class Blocks implements ContentList{ powerUse = 1f; }}; + resupplyPoint = new ResupplyPoint("resupply-point"){{ + requirements(Category.units, BuildVisibility.ammoOnly, ItemStack.with(Items.lead, 20, Items.copper, 15, Items.silicon, 15)); + + size = 2; + range = 80f; + + consumes.item(Items.copper, 1); + }}; + //endregion //region sandbox @@ -1853,18 +1836,11 @@ public class Blocks implements ContentList{ consumes.power(6f); }}; - coreSilo = new CoreLauncher("core-silo"){{ - requirements(Category.effect, BuildVisibility.campaignOnly, ItemStack.with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); - size = 5; - itemCapacity = 500; - - consumes.items(ItemStack.with(Items.copper, 500)); - }}; - dataProcessor = new ResearchBlock("data-processor"){{ - requirements(Category.effect, BuildVisibility.campaignOnly, ItemStack.with(Items.copper, 350, Items.silicon, 140, Items.lead, 200, Items.titanium, 150)); + requirements(Category.effect, BuildVisibility.campaignOnly, ItemStack.with(Items.copper, 200, Items.lead, 100)); size = 3; + alwaysUnlocked = true; }}; //endregion campaign diff --git a/core/src/mindustry/content/Bullets.java b/core/src/mindustry/content/Bullets.java index 946fb926e0..9d764a538a 100644 --- a/core/src/mindustry/content/Bullets.java +++ b/core/src/mindustry/content/Bullets.java @@ -48,16 +48,16 @@ public class Bullets implements ContentList{ hitEffect = Fx.flakExplosion; knockback = 0.8f; lifetime = 50f; - bulletWidth = bulletHeight = 11f; + width = height = 11f; collidesTiles = false; splashDamageRadius = 25f; splashDamage = 33f; }}; artilleryPlasticFrag = new BasicBulletType(2.5f, 10, "bullet"){{ - bulletWidth = 10f; - bulletHeight = 12f; - bulletShrink = 1f; + width = 10f; + height = 12f; + shrinkY = 1f; lifetime = 15f; backColor = Pal.plastaniumBack; frontColor = Pal.plastaniumFront; @@ -68,7 +68,7 @@ public class Bullets implements ContentList{ hitEffect = Fx.plasticExplosion; knockback = 1f; lifetime = 55f; - bulletWidth = bulletHeight = 13f; + width = height = 13f; collidesTiles = false; splashDamageRadius = 35f; splashDamage = 45f; @@ -82,7 +82,7 @@ public class Bullets implements ContentList{ hitEffect = Fx.flakExplosion; knockback = 0.8f; lifetime = 45f; - bulletWidth = bulletHeight = 11f; + width = height = 11f; collidesTiles = false; splashDamageRadius = 25f; splashDamage = 33f; @@ -96,7 +96,7 @@ public class Bullets implements ContentList{ hitEffect = Fx.blastExplosion; knockback = 0.8f; lifetime = 60f; - bulletWidth = bulletHeight = 13f; + width = height = 13f; collidesTiles = false; splashDamageRadius = 25f; splashDamage = 35f; @@ -110,7 +110,7 @@ public class Bullets implements ContentList{ hitEffect = Fx.blastExplosion; knockback = 0.8f; lifetime = 70f; - bulletWidth = bulletHeight = 14f; + width = height = 14f; collidesTiles = false; ammoMultiplier = 4f; splashDamageRadius = 45f; @@ -123,9 +123,9 @@ public class Bullets implements ContentList{ }}; glassFrag = new BasicBulletType(3f, 5, "bullet"){{ - bulletWidth = 5f; - bulletHeight = 12f; - bulletShrink = 1f; + width = 5f; + height = 12f; + shrinkY = 1f; lifetime = 20f; backColor = Pal.gray; frontColor = Color.white; @@ -136,8 +136,8 @@ public class Bullets implements ContentList{ lifetime = 60f; ammoMultiplier = 4f; shootEffect = Fx.shootSmall; - bulletWidth = 6f; - bulletHeight = 8f; + width = 6f; + height = 8f; hitEffect = Fx.flakExplosion; splashDamage = 27f; splashDamageRadius = 15f; @@ -148,8 +148,8 @@ public class Bullets implements ContentList{ ammoMultiplier = 5f; shootEffect = Fx.shootSmall; reloadMultiplier = 0.5f; - bulletWidth = 6f; - bulletHeight = 8f; + width = 6f; + height = 8f; hitEffect = Fx.flakExplosion; splashDamage = 22f; splashDamageRadius = 24f; @@ -160,8 +160,8 @@ public class Bullets implements ContentList{ ammoMultiplier = 5f; shootEffect = Fx.shootSmall; reloadMultiplier = 0.8f; - bulletWidth = 6f; - bulletHeight = 8f; + width = 6f; + height = 8f; hitEffect = Fx.flakExplosion; splashDamage = 20f; splashDamageRadius = 20f; @@ -199,9 +199,9 @@ public class Bullets implements ContentList{ }}; missileExplosive = new MissileBulletType(2.7f, 10, "missile"){{ - bulletWidth = 8f; - bulletHeight = 8f; - bulletShrink = 0f; + width = 8f; + height = 8f; + shrinkY = 0f; drag = -0.01f; splashDamageRadius = 30f; splashDamage = 30f; @@ -217,9 +217,9 @@ public class Bullets implements ContentList{ missileIncendiary = new MissileBulletType(2.9f, 12, "missile"){{ frontColor = Pal.lightishOrange; backColor = Pal.lightOrange; - bulletWidth = 7f; - bulletHeight = 8f; - bulletShrink = 0f; + width = 7f; + height = 8f; + shrinkY = 0f; drag = -0.01f; homingPower = 0.08f; splashDamageRadius = 20f; @@ -230,9 +230,9 @@ public class Bullets implements ContentList{ }}; missileSurge = new MissileBulletType(4.4f, 20, "bullet"){{ - bulletWidth = 8f; - bulletHeight = 8f; - bulletShrink = 0f; + width = 8f; + height = 8f; + shrinkY = 0f; drag = -0.01f; splashDamageRadius = 28f; splashDamage = 40f; @@ -244,9 +244,9 @@ public class Bullets implements ContentList{ }}; missileJavelin = new MissileBulletType(5f, 10.5f, "missile"){{ - bulletWidth = 8f; - bulletHeight = 8f; - bulletShrink = 0f; + width = 8f; + height = 8f; + shrinkY = 0f; drag = -0.003f; keepVelocity = false; splashDamageRadius = 20f; @@ -262,9 +262,9 @@ public class Bullets implements ContentList{ }}; missileSwarm = new MissileBulletType(2.7f, 12, "missile"){{ - bulletWidth = 8f; - bulletHeight = 8f; - bulletShrink = 0f; + width = 8f; + height = 8f; + shrinkY = 0f; drag = -0.003f; homingRange = 60f; keepVelocity = false; @@ -281,8 +281,8 @@ public class Bullets implements ContentList{ }}; standardCopper = new BasicBulletType(2.5f, 9, "bullet"){{ - bulletWidth = 7f; - bulletHeight = 9f; + width = 7f; + height = 9f; lifetime = 60f; shootEffect = Fx.shootSmall; smokeEffect = Fx.shootSmallSmoke; @@ -290,16 +290,16 @@ public class Bullets implements ContentList{ }}; standardDense = new BasicBulletType(3.5f, 18, "bullet"){{ - bulletWidth = 9f; - bulletHeight = 12f; + width = 9f; + height = 12f; reloadMultiplier = 0.6f; ammoMultiplier = 4; lifetime = 60f; }}; standardThorium = new BasicBulletType(4f, 29, "bullet"){{ - bulletWidth = 10f; - bulletHeight = 13f; + width = 10f; + height = 13f; shootEffect = Fx.shootBig; smokeEffect = Fx.shootBigSmoke; ammoMultiplier = 4; @@ -307,8 +307,8 @@ public class Bullets implements ContentList{ }}; standardHoming = new BasicBulletType(3f, 12, "bullet"){{ - bulletWidth = 7f; - bulletHeight = 9f; + width = 7f; + height = 9f; homingPower = 0.08f; reloadMultiplier = 1.5f; ammoMultiplier = 5; @@ -316,8 +316,8 @@ public class Bullets implements ContentList{ }}; standardIncendiary = new BasicBulletType(3.2f, 11, "bullet"){{ - bulletWidth = 10f; - bulletHeight = 12f; + width = 10f; + height = 12f; frontColor = Pal.lightishOrange; backColor = Pal.lightOrange; status = StatusEffects.burning; @@ -326,8 +326,8 @@ public class Bullets implements ContentList{ }}; standardGlaive = new BasicBulletType(4f, 7.5f, "bullet"){{ - bulletWidth = 10f; - bulletHeight = 12f; + width = 10f; + height = 12f; frontColor = Color.valueOf("feb380"); backColor = Color.valueOf("ea8878"); status = StatusEffects.burning; @@ -335,28 +335,28 @@ public class Bullets implements ContentList{ }}; standardMechSmall = new BasicBulletType(4f, 9, "bullet"){{ - bulletWidth = 11f; - bulletHeight = 14f; + width = 11f; + height = 14f; lifetime = 40f; inaccuracy = 5f; despawnEffect = Fx.hitBulletSmall; }}; standardDenseBig = new BasicBulletType(7f, 55, "bullet"){{ - bulletWidth = 15f; - bulletHeight = 21f; + width = 15f; + height = 21f; shootEffect = Fx.shootBig; }}; standardThoriumBig = new BasicBulletType(8f, 80, "bullet"){{ - bulletWidth = 16f; - bulletHeight = 23f; + width = 16f; + height = 23f; shootEffect = Fx.shootBig; }}; standardIncendiaryBig = new BasicBulletType(7f, 60, "bullet"){{ - bulletWidth = 16f; - bulletHeight = 21f; + width = 16f; + height = 21f; frontColor = Pal.lightishOrange; backColor = Pal.lightOrange; status = StatusEffects.burning; @@ -510,16 +510,16 @@ public class Bullets implements ContentList{ driverBolt = new MassDriverBolt(); frag = new BasicBulletType(5f, 8, "bullet"){{ - bulletWidth = 8f; - bulletHeight = 9f; - bulletShrink = 0.5f; + width = 8f; + height = 9f; + shrinkY = 0.5f; lifetime = 50f; drag = 0.04f; }}; bombExplosive = new BombBulletType(18f, 25f, "shell"){{ - bulletWidth = 10f; - bulletHeight = 14f; + width = 10f; + height = 14f; hitEffect = Fx.flakExplosion; shootEffect = Fx.none; smokeEffect = Fx.none; @@ -529,8 +529,8 @@ public class Bullets implements ContentList{ }}; bombIncendiary = new BombBulletType(7f, 10f, "shell"){{ - bulletWidth = 8f; - bulletHeight = 12f; + width = 8f; + height = 12f; hitEffect = Fx.flakExplosion; backColor = Pal.lightOrange; frontColor = Pal.lightishOrange; @@ -541,8 +541,8 @@ public class Bullets implements ContentList{ bombOil = new BombBulletType(2f, 3f, "shell"){ { - bulletWidth = 8f; - bulletHeight = 12f; + width = 8f; + height = 12f; hitEffect = Fx.pulverize; backColor = new Color(0x4f4f4fff); frontColor = Color.gray; diff --git a/core/src/mindustry/content/Fx.java b/core/src/mindustry/content/Fx.java index 7af54291dc..16d6fd9fac 100644 --- a/core/src/mindustry/content/Fx.java +++ b/core/src/mindustry/content/Fx.java @@ -8,6 +8,7 @@ import arc.math.geom.*; import arc.struct.*; import arc.util.*; import mindustry.entities.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; @@ -120,8 +121,8 @@ public class Fx{ }), lightning = new Effect(10f, 500f, e -> { - if(!(e.data instanceof Array)) return; - Array lines = e.data(); + if(!(e.data instanceof Seq)) return; + Seq lines = e.data(); stroke(3f * e.fout()); color(e.color, Color.white, e.fin()); @@ -228,7 +229,7 @@ public class Fx{ unitLandSmall = new Effect(30, e -> { color(Tmp.c1.set(e.color).mul(1.1f)); - randLenVectors(e.id, 6, 12f * e.finpow(), (x, y) -> { + randLenVectors(e.id, (int)(6 * e.rotation), 12f * e.finpow() * e.rotation, (x, y) -> { Fill.circle(e.x + x, e.y + y, e.fout() * 3f + 0.1f); }); }).ground(), @@ -526,7 +527,7 @@ public class Fx{ color(); - Drawf.light(e.x, e.y, 20f * e.fslope(), Pal.lightFlame, 0.5f); + Drawf.light(Team.derelict, e.x, e.y, 20f * e.fslope(), Pal.lightFlame, 0.5f); }), fireSmoke = new Effect(35f, e -> { @@ -1183,7 +1184,7 @@ public class Fx{ ripple = new Effect(30, e -> { color(Tmp.c1.set(e.color).mul(1.5f)); stroke(e.fout() + 0.4f); - Lines.circle(e.x, e.y, 2f + e.fin() * 4f); + Lines.circle(e.x, e.y, (2f + e.fin() * 4f) * e.rotation); }).ground(), bubble = new Effect(20, e -> { diff --git a/core/src/mindustry/content/Items.java b/core/src/mindustry/content/Items.java index 6269044786..1aea6e89c1 100644 --- a/core/src/mindustry/content/Items.java +++ b/core/src/mindustry/content/Items.java @@ -22,6 +22,7 @@ public class Items implements ContentList{ type = ItemType.material; hardness = 1; cost = 0.7f; + alwaysUnlocked = true; }}; metaglass = new Item("metaglass", Color.valueOf("ebeef5")){{ diff --git a/core/src/mindustry/content/SectorPresets.java b/core/src/mindustry/content/SectorPresets.java index 050a5b0bc9..c979bc9dda 100644 --- a/core/src/mindustry/content/SectorPresets.java +++ b/core/src/mindustry/content/SectorPresets.java @@ -4,10 +4,8 @@ import mindustry.ctype.*; import mindustry.game.Objectives.*; import mindustry.type.*; -import static arc.struct.Array.with; -import static mindustry.content.Items.*; -import static mindustry.content.Planets.starter; -import static mindustry.type.ItemStack.list; +import static arc.struct.Seq.*; +import static mindustry.content.Planets.*; public class SectorPresets implements ContentList{ public static SectorPreset @@ -20,16 +18,15 @@ public class SectorPresets implements ContentList{ public void load(){ groundZero = new SectorPreset("groundZero", starter, 15){{ - baseLaunchCost = list(copper, -60); - startingItems = list(copper, 60); alwaysUnlocked = true; conditionWave = 5; launchPeriod = 5; + rules = r -> { + r.winWave = 30; + }; }}; saltFlats = new SectorPreset("saltFlats", starter, 101){{ - startingItems = list(copper, 200, silicon, 200, lead, 200); - loadout = Loadouts.basicFoundation; conditionWave = 10; launchPeriod = 5; requirements = with( @@ -42,8 +39,6 @@ public class SectorPresets implements ContentList{ }}; frozenForest = new SectorPreset("frozenForest", starter, 86){{ - loadout = Loadouts.basicFoundation; - startingItems = list(copper, 250); conditionWave = 10; requirements = with( new SectorWave(groundZero, 10), @@ -53,7 +48,6 @@ public class SectorPresets implements ContentList{ }}; craters = new SectorPreset("craters", starter, 18){{ - startingItems = list(copper, 100); conditionWave = 10; requirements = with( new SectorWave(frozenForest, 10), @@ -63,8 +57,6 @@ public class SectorPresets implements ContentList{ }}; ruinousShores = new SectorPreset("ruinousShores", starter, 19){{ - loadout = Loadouts.basicFoundation; - startingItems = list(copper, 140, lead, 50); conditionWave = 20; launchPeriod = 20; requirements = with( @@ -78,8 +70,6 @@ public class SectorPresets implements ContentList{ }}; stainedMountains = new SectorPreset("stainedMountains", starter, 20){{ - loadout = Loadouts.basicFoundation; - startingItems = list(copper, 200, lead, 50); conditionWave = 10; launchPeriod = 10; requirements = with( @@ -91,7 +81,6 @@ public class SectorPresets implements ContentList{ }}; fungalPass = new SectorPreset("fungalPass", starter, 21){{ - startingItems = list(copper, 250, lead, 250, Items.metaglass, 100, Items.graphite, 100); requirements = with( new SectorWave(stainedMountains, 15), //new Unlock(Blocks.daggerFactory), @@ -102,10 +91,8 @@ public class SectorPresets implements ContentList{ }}; overgrowth = new SectorPreset("overgrowth", starter, 22){{ - startingItems = list(copper, 1500, lead, 1000, Items.silicon, 500, Items.metaglass, 250); conditionWave = 12; launchPeriod = 4; - loadout = Loadouts.basicNucleus; requirements = with( new SectorWave(craters, 40), new Launched(fungalPass), @@ -117,8 +104,6 @@ public class SectorPresets implements ContentList{ }}; tarFields = new SectorPreset("tarFields", starter, 23){{ - loadout = Loadouts.basicFoundation; - startingItems = list(copper, 250, lead, 100); conditionWave = 15; launchPeriod = 10; requirements = with( @@ -130,8 +115,6 @@ public class SectorPresets implements ContentList{ }}; desolateRift = new SectorPreset("desolateRift", starter, 123){{ - loadout = Loadouts.basicNucleus; - startingItems = list(copper, 1000, lead, 1000, Items.graphite, 250, titanium, 250, Items.silicon, 250); conditionWave = 3; launchPeriod = 2; requirements = with( @@ -143,8 +126,6 @@ public class SectorPresets implements ContentList{ nuclearComplex = new SectorPreset("nuclearComplex", starter, 130){{ - loadout = Loadouts.basicNucleus; - startingItems = list(copper, 1250, lead, 1500, Items.silicon, 400, Items.metaglass, 250); conditionWave = 30; launchPeriod = 15; requirements = with( diff --git a/core/src/mindustry/content/TechTree.java b/core/src/mindustry/content/TechTree.java index 0cb848f6c8..e95785d9a8 100644 --- a/core/src/mindustry/content/TechTree.java +++ b/core/src/mindustry/content/TechTree.java @@ -1,5 +1,6 @@ package mindustry.content; +import arc.*; import arc.math.*; import arc.struct.*; import arc.util.ArcAnnotate.*; @@ -11,13 +12,16 @@ import mindustry.world.*; import static mindustry.content.Blocks.*; public class TechTree implements ContentList{ - public static Array all; + private static ObjectMap map = new ObjectMap<>(); + + public static Seq all; public static TechNode root; @Override public void load(){ TechNode.context = null; - all = new Array<>(); + map = new ObjectMap<>(); + all = new Seq<>(); root = node(coreShard, () -> { @@ -67,6 +71,12 @@ public class TechTree implements ContentList{ }); }); + node(coreFoundation, () -> { + node(coreNucleus, () -> { + + }); + }); + node(duo, () -> { node(scatter, () -> { node(hail, () -> { @@ -136,63 +146,30 @@ public class TechTree implements ContentList{ }); node(mechanicalDrill, () -> { - node(graphitePress, () -> { - node(pneumaticDrill, () -> { - node(cultivator, () -> { - }); + node(Liquids.water, () -> { + node(mechanicalPump, () -> { + node(conduit, () -> { + node(liquidJunction, () -> { + node(liquidRouter, () -> { + node(liquidTank); - node(laserDrill, () -> { - node(blastDrill, () -> { + node(bridgeConduit); - }); + node(pulseConduit, () -> { + node(phaseConduit, () -> { - node(waterExtractor, () -> { - node(oilExtractor, () -> { + }); - }); - }); - }); - }); - - node(pyratiteMixer, () -> { - node(blastMixer, () -> { - - }); - }); - - node(siliconSmelter, () -> { - - node(sporePress, () -> { - node(coalCentrifuge, () -> { - - }); - node(multiPress, () -> { - - }); - - node(plastaniumCompressor, () -> { - node(phaseWeaver, () -> { - - }); - }); - }); - - node(kiln, () -> { - node(incinerator, () -> { - node(melter, () -> { - node(surgeSmelter, () -> { - - }); - - node(separator, () -> { - node(pulverizer, () -> { + node(platedConduit, () -> { }); }); - node(cryofluidMixer, () -> { + node(rotaryPump, () -> { + node(thermalPump, () -> { + }); }); }); }); @@ -200,84 +177,121 @@ public class TechTree implements ContentList{ }); }); + node(Items.coal, () -> { + node(graphitePress, () -> { + node(pneumaticDrill, () -> { + node(cultivator, () -> { - node(mechanicalPump, () -> { - node(conduit, () -> { - node(liquidJunction, () -> { - node(liquidRouter, () -> { - node(liquidTank); + }); - node(bridgeConduit); + node(laserDrill, () -> { + node(blastDrill, () -> { - node(pulseConduit, () -> { - node(phaseConduit, () -> { + }); - }); - - node(platedConduit, () -> { + node(waterExtractor, () -> { + node(oilExtractor, () -> { }); }); + }); + }); - node(rotaryPump, () -> { - node(thermalPump, () -> { + node(pyratiteMixer, () -> { + node(blastMixer, () -> { + }); + }); + + node(siliconSmelter, () -> { + + node(sporePress, () -> { + node(coalCentrifuge, () -> { + + }); + node(multiPress, () -> { + + }); + + node(plastaniumCompressor, () -> { + node(phaseWeaver, () -> { + + }); + }); + }); + + node(kiln, () -> { + node(incinerator, () -> { + node(melter, () -> { + node(surgeSmelter, () -> { + + }); + + node(separator, () -> { + node(pulverizer, () -> { + + }); + }); + + node(cryofluidMixer, () -> { + + }); }); }); }); }); }); - }); - node(combustionGenerator, () -> { - node(powerNode, () -> { - node(powerNodeLarge, () -> { - node(diode, () -> { - node(surgeTower, () -> { - - }); - }); - }); - - node(battery, () -> { - node(batteryLarge, () -> { - - }); - }); - - node(mender, () -> { - node(mendProjector, () -> { - node(forceProjector, () -> { - node(overdriveProjector, () -> { + node(combustionGenerator, () -> { + node(powerNode, () -> { + node(powerNodeLarge, () -> { + node(diode, () -> { + node(surgeTower, () -> { }); }); + }); - node(repairPoint, () -> { + node(battery, () -> { + node(batteryLarge, () -> { }); }); - }); - node(turbineGenerator, () -> { - node(thermalGenerator, () -> { - node(differentialGenerator, () -> { - node(thoriumReactor, () -> { - node(impactReactor, () -> { + node(mender, () -> { + node(mendProjector, () -> { + node(forceProjector, () -> { + node(overdriveProjector, () -> { }); + }); - node(rtgGenerator, () -> { + node(repairPoint, () -> { + }); + }); + }); + + node(turbineGenerator, () -> { + node(thermalGenerator, () -> { + node(differentialGenerator, () -> { + node(thoriumReactor, () -> { + node(impactReactor, () -> { + + }); + + node(rtgGenerator, () -> { + + }); }); }); }); }); - }); - node(solarPanel, () -> { - node(largeSolarPanel, () -> { + node(solarPanel, () -> { + node(largeSolarPanel, () -> { + }); }); }); }); @@ -312,6 +326,14 @@ public class TechTree implements ContentList{ return node(block, () -> {}); } + public static @Nullable TechNode get(UnlockableContent content){ + return map.get(content); + } + + public static TechNode getNotNull(UnlockableContent content){ + return map.getThrow(content, () -> new RuntimeException(content + " does not have a tech node")); + } + public static class TechNode{ private static TechNode context; @@ -325,12 +347,14 @@ public class TechTree implements ContentList{ public ItemStack[] requirements; /** Extra objectives needed to research this. TODO implement */ public Objective[] objectives = {}; - /** Research turns required to research this content. */ - public int turns = 3; //TODO keep track of turns that have been used so far + /** Time required to research this content, in seconds. */ + public float time = 60; /** Nodes that depend on this node. */ - public final Array children = new Array<>(); + public final Seq children = new Seq<>(); + /** Research progress, in seconds. */ + public float progress; - TechNode(TechNode ccontext, UnlockableContent content, ItemStack[] requirements, Runnable children){ + TechNode(@Nullable TechNode ccontext, UnlockableContent content, ItemStack[] requirements, Runnable children){ if(ccontext != null){ ccontext.children.add(this); } @@ -339,7 +363,9 @@ public class TechTree implements ContentList{ 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); + map.put(content, this); context = this; children.run(); context = ccontext; @@ -349,5 +375,10 @@ public class TechTree implements ContentList{ TechNode(UnlockableContent content, ItemStack[] requirements, Runnable children){ this(context, content, requirements, children); } + + /** Flushes research progress to settings. */ + public void save(){ + Core.settings.put("research-" + content.name, progress); + } } } diff --git a/core/src/mindustry/content/UnitTypes.java b/core/src/mindustry/content/UnitTypes.java index 3f6f8a869f..b0cdd121f4 100644 --- a/core/src/mindustry/content/UnitTypes.java +++ b/core/src/mindustry/content/UnitTypes.java @@ -14,7 +14,7 @@ import mindustry.type.*; public class UnitTypes implements ContentList{ //ground - public static @EntityDef({Unitc.class, Mechc.class}) UnitType titan, dagger, crawler, fortress, chaosArray, eradicator; + public static @EntityDef({Unitc.class, Mechc.class}) UnitType mace, dagger, crawler, fortress, chaosArray, eradicator; //ground + builder public static @EntityDef({Unitc.class, Mechc.class, Builderc.class}) UnitType tau; @@ -76,7 +76,7 @@ public class UnitTypes implements ContentList{ }}); }}; - titan = new UnitType("titan"){{ + mace = new UnitType("mace"){{ speed = 0.4f; hitsize = 9f; range = 10f; @@ -96,26 +96,26 @@ public class UnitTypes implements ContentList{ }}; tau = new UnitType("tau"){{ - itemCapacity = 60; - canBoost = true; - boostMultiplier = 1.5f; - speed = 0.5f; - hitsize = 8f; - health = 100f; - buildSpeed = 0.8f; + itemCapacity = 60; + canBoost = true; + boostMultiplier = 1.5f; + speed = 0.5f; + hitsize = 8f; + health = 100f; + buildSpeed = 0.8f; - weapons.add(new Weapon("heal-weapon"){{ - shootY = 1.5f; - reload = 24f; - x = 1f; - shootX = 3.5f; - alternate = false; - ejectEffect = Fx.none; - recoil = 2f; - bullet = Bullets.healBullet; - shootSound = Sounds.pew; - }}); - } + weapons.add(new Weapon("heal-weapon"){{ + shootY = 1.5f; + reload = 24f; + x = 1f; + shootX = 3.5f; + alternate = false; + ejectEffect = Fx.none; + recoil = 2f; + bullet = Bullets.healBullet; + shootSound = Sounds.pew; + }}); + } /* @@ -145,6 +145,39 @@ public class UnitTypes implements ContentList{ }*/ }; + oculon = new UnitType("oculon"){{ + drillTier = 1; + hitsize = 9f; + boostMultiplier = 2f; + itemCapacity = 20; + health = 230f; + buildSpeed = 1.5f; + canBoost = true; + + speed = 0.4f; + hitsize = 10f; + + weapons.add(new Weapon("beam-weapon"){{ + shake = 2f; + shootY = 4f; + shootX = 6f; + x = 0.25f; + reload = 50f; + alternate = true; + recoil = 4f; + shootSound = Sounds.laser; + + bullet = new LaserBulletType(){{ + damage = 20f; + recoil = 1f; + sideAngle = 45f; + sideWidth = 1f; + sideLength = 70f; + colors = new Color[]{Pal.heal.cpy().a(0.4f), Pal.heal, Color.white}; + }}; + }}); + }}; + fortress = new UnitType("fortress"){{ speed = 0.38f; hitsize = 13f; @@ -164,7 +197,7 @@ public class UnitTypes implements ContentList{ hitEffect = Fx.blastExplosion; knockback = 0.8f; lifetime = 110f; - bulletWidth = bulletHeight = 14f; + width = height = 14f; collides = true; collidesTiles = true; splashDamageRadius = 20f; @@ -212,7 +245,7 @@ public class UnitTypes implements ContentList{ immunities = ObjectSet.with(StatusEffects.burning, StatusEffects.melting); legCount = 4; legLength = 9f; - legTrns = 2f; + legTrns = 0.6f; legMoveSpace = 1.4f; weapons.add(new Weapon("eruption"){{ @@ -235,19 +268,25 @@ public class UnitTypes implements ContentList{ cix = new UnitType("cix"){{ drag = 0.1f; - speed = 0.4f; + speed = 0.5f; hitsize = 9f; health = 140; baseElevation = 0.51f; legCount = 6; - legMoveSpace = 0.9f; + legMoveSpace = 1f; + legPairOffset = 3; legLength = 34f; rotateShooting = false; legExtension = -15; - legBaseOffset = 8f; + legBaseOffset = 10f; landShake = 2f; legSpeed = 0.1f; + legLengthScl = 1f; + rippleScale = 2f; + legSpeed = 0.2f; + legSplashDamage = 32; + legSplashRange = 30; for(boolean b : Mathf.booleans){ weapons.add( @@ -332,9 +371,9 @@ public class UnitTypes implements ContentList{ shake = 1f; bullet = new MissileBulletType(2.7f, 12, "missile"){{ - bulletWidth = 8f; - bulletHeight = 8f; - bulletShrink = 0f; + width = 8f; + height = 8f; + shrinkY = 0f; drag = -0.003f; homingRange = 60f; keepVelocity = false; @@ -357,7 +396,7 @@ public class UnitTypes implements ContentList{ speed = 1.1f; accel = 0.02f; drag = 0.05f; - rotateSpeed = 0.5f; + rotateSpeed = 2.5f; flying = true; lowAltitude = true; health = 75000; @@ -375,6 +414,27 @@ public class UnitTypes implements ContentList{ }}); }}; + lich = new UnitType("lich"){{ + speed = 1.1f; + accel = 0.02f; + drag = 0.05f; + rotateSpeed = 2.5f; + flying = true; + lowAltitude = true; + health = 75000; + engineOffset = 38; + engineSize = 7.3f; + hitsize = 58f; + + weapons.add(new Weapon(){{ + y = 1.5f; + reload = 28f; + alternate = true; + ejectEffect = Fx.shellEjectSmall; + bullet = Bullets.standardCopper; + shootSound = Sounds.shoot; + }}); + }}; vanguard = new UnitType("vanguard"){{ speed = 1.3f; @@ -427,6 +487,10 @@ public class UnitTypes implements ContentList{ }}; alpha = new UnitType("alpha"){{ + //TODO maybe these should be changed + defaultController = BuilderAI::new; + isCounted = false; + flying = true; mineSpeed = 2f; buildSpeed = 0.5f; @@ -448,13 +512,12 @@ public class UnitTypes implements ContentList{ alternate = true; bullet = new BasicBulletType(2.5f, 9){{ - bulletWidth = 7f; - bulletHeight = 9f; + width = 7f; + height = 9f; lifetime = 60f; shootEffect = Fx.shootSmall; smokeEffect = Fx.shootSmallSmoke; - tileDamageMultiplier = 0.15f; - ammoMultiplier = 2; + tileDamageMultiplier = 0.1f; }}; }}); }}; @@ -470,42 +533,11 @@ public class UnitTypes implements ContentList{ range = 70f; itemCapacity = 70; health = 400; - buildSpeed = 0.6f; + buildSpeed = 0.5f; engineOffset = 6.5f; hitsize = 8f; }}; - oculon = new UnitType("oculon"){{ - drillTier = -1; - speed = 0.6f; - hitsize = 9f; - boostMultiplier = 2f; - itemCapacity = 15; - health = 160f; - buildSpeed = 0.9f; - canBoost = true; - - weapons.add(new Weapon("beam-weapon"){{ - shake = 2f; - shootY = 1f; - x = 1f; - shootX = 3f; - reload = 50f; - alternate = true; - recoil = 4f; - shootSound = Sounds.laser; - - bullet = new LaserBulletType(){{ - damage = 20f; - recoil = 1f; - sideAngle = 45f; - sideWidth = 1f; - sideLength = 70f; - colors = new Color[]{Pal.heal.cpy().a(0.4f), Pal.heal, Color.white}; - }}; - }}); - }}; - trident = new UnitType("trident"){{ health = 500; diff --git a/core/src/mindustry/content/Weathers.java b/core/src/mindustry/content/Weathers.java index 2fc40aa169..d14c3a63e8 100644 --- a/core/src/mindustry/content/Weathers.java +++ b/core/src/mindustry/content/Weathers.java @@ -4,6 +4,7 @@ import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; +import arc.math.geom.*; import arc.util.*; import mindustry.ctype.*; import mindustry.gen.*; @@ -15,7 +16,8 @@ import static mindustry.Vars.*; public class Weathers implements ContentList{ public static Weather rain, - snow; + snow, + sandstorm; @Override public void load(){ @@ -61,6 +63,7 @@ public class Weathers implements ContentList{ } }; + //TODO should apply wet effect rain = new Weather("rain"){ float yspeed = 5f, xspeed = 1.5f, padding = 16f, size = 40f, density = 1200f; TextureRegion[] splashes = new TextureRegion[12]; @@ -81,8 +84,8 @@ public class Weathers implements ContentList{ Core.camera.bounds(Tmp.r2); int total = (int)(Tmp.r1.area() / density * state.intensity()); Lines.stroke(0.75f); - Draw.color(Color.royal, Color.white, 0.3f); float alpha = Draw.getColor().a; + Draw.color(Color.royal, Color.white, 0.3f); for(int i = 0; i < total; i++){ float scl = rand.random(0.5f, 1f); @@ -112,6 +115,7 @@ public class Weathers implements ContentList{ Tmp.r1.grow(padding); Core.camera.bounds(Tmp.r2); int total = (int)(Tmp.r1.area() / density * state.intensity()) / 2; + Lines.stroke(0.75f); float t = Time.time() / 22f; @@ -133,15 +137,76 @@ public class Weathers implements ContentList{ if(Tmp.r3.setCentered(x, y, life * 4f).overlaps(Tmp.r2)){ Tile tile = world.tileWorld(x, y); + if(tile != null && tile.floor().liquidDrop == Liquids.water){ - Draw.tint(Tmp.c1.set(tile.floor().mapColor).mul(1.5f)); + Draw.color(Tmp.c1.set(tile.floor().mapColor).mul(1.5f).a(state.opacity())); Draw.rect(splashes[(int)(life * (splashes.length - 1))], x, y); - //Lines.stroke((1f - life) * 2f); - //Lines.circle(x, y, life * 4f); + }else{ + Draw.color(Color.royal, Color.white, 0.3f); + Draw.alpha(Mathf.slope(life) * state.opacity()); + + float space = 45f; + for(int j : new int[]{-1, 1}){ + Tmp.v1.trns(90f + j*space, 1f + 5f * life); + Lines.lineAngle(x + Tmp.v1.x, y + Tmp.v1.y, 90f + j*space, 3f * (1f - life)); + } } } } } }; + + sandstorm = new Weather("sandstorm"){ + TextureRegion region; + float yspeed = 0.3f, xspeed = 6f, padding = 110f, size = 110f, invDensity = 800f; + Vec2 force = new Vec2(0.4f, 0.01f); + Color color = Color.valueOf("f7cba4"); + + @Override + public void load(){ + super.load(); + + region = Core.atlas.find("circle-shadow"); + } + + @Override + public void drawOver(Weatherc state){ + rand.setSeed(0); + Tmp.r1.setCentered(Core.camera.position.x, Core.camera.position.y, Core.graphics.getWidth() / renderer.minScale(), Core.graphics.getHeight() / renderer.minScale()); + Tmp.r1.grow(padding); + Core.camera.bounds(Tmp.r2); + int total = (int)(Tmp.r1.area() / invDensity * state.intensity()); + Draw.tint(color); + float baseAlpha = Draw.getColor().a; + + for(Unitc unit : Groups.unit){ + unit.impulse(force.x * state.intensity(), force.y * state.intensity()); + } + + for(int i = 0; i < total; i++){ + 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 alpha = rand.random(0.2f); + + x += Mathf.sin(y, rand.random(30f, 80f), rand.random(1f, 7f)); + + x -= Tmp.r1.x; + y -= Tmp.r1.y; + x = Mathf.mod(x, Tmp.r1.width); + y = Mathf.mod(y, Tmp.r1.height); + x += Tmp.r1.x; + y += Tmp.r1.y; + + if(Tmp.r3.setCentered(x, y, size * sscl).overlaps(Tmp.r2)){ + Draw.alpha(alpha * baseAlpha); + //Fill.circle(x, y, size * sscl / 2f); + Draw.rect(region, x, y, size * sscl, size * sscl); + } + } + } + }; } } diff --git a/core/src/mindustry/core/ContentLoader.java b/core/src/mindustry/core/ContentLoader.java index e0adf6f89a..16897778c1 100644 --- a/core/src/mindustry/core/ContentLoader.java +++ b/core/src/mindustry/core/ContentLoader.java @@ -23,7 +23,7 @@ import static mindustry.Vars.mods; @SuppressWarnings("unchecked") public class ContentLoader{ private ObjectMap[] contentNameMap = new ObjectMap[ContentType.values().length]; - private Array[] contentMap = new Array[ContentType.values().length]; + private Seq[] contentMap = new Seq[ContentType.values().length]; private MappableContent[][] temporaryMapper; private @Nullable LoadedMod currentMod; private @Nullable Content lastAdded; @@ -49,11 +49,11 @@ public class ContentLoader{ /** Clears all initialized content.*/ public void clear(){ contentNameMap = new ObjectMap[ContentType.values().length]; - contentMap = new Array[ContentType.values().length]; + contentMap = new Seq[ContentType.values().length]; initialization = new ObjectSet<>(); for(ContentType type : ContentType.values()){ - contentMap[type.ordinal()] = new Array<>(); + contentMap[type.ordinal()] = new Seq<>(); contentNameMap[type.ordinal()] = new ObjectMap<>(); } } @@ -76,7 +76,7 @@ public class ContentLoader{ /** Logs content statistics.*/ public void logContent(){ //check up ID mapping, make sure it's linear (debug only) - for(Array arr : contentMap){ + for(Seq arr : contentMap){ for(int i = 0; i < arr.size; i++){ int id = arr.get(i).id; if(id != i){ @@ -89,7 +89,7 @@ public class ContentLoader{ for(int k = 0; k < contentMap.length; k++){ Log.debug("[@]: loaded @", ContentType.values()[k].name(), contentMap[k].size); } - Log.debug("Total content loaded: @", Array.with(ContentType.values()).mapInt(c -> contentMap[c.ordinal()].size).sum()); + Log.debug("Total content loaded: @", Seq.with(ContentType.values()).mapInt(c -> contentMap[c.ordinal()].size).sum()); Log.debug("-------------------"); } @@ -196,10 +196,16 @@ public class ContentLoader{ this.temporaryMapper = temporaryMapper; } - public Array[] getContentMap(){ + public Seq[] getContentMap(){ return contentMap; } + public void each(Cons cons){ + for(Seq seq : contentMap){ + seq.each(cons); + } + } + public T getByName(ContentType type, String name){ if(contentNameMap[type.ordinal()] == null){ return null; @@ -226,13 +232,13 @@ public class ContentLoader{ return (T)contentMap[type.ordinal()].get(id); } - public Array getBy(ContentType type){ - return (Array)contentMap[type.ordinal()]; + public Seq getBy(ContentType type){ + return (Seq)contentMap[type.ordinal()]; } //utility methods, just makes things a bit shorter - public Array blocks(){ + public Seq blocks(){ return getBy(ContentType.block); } @@ -244,7 +250,7 @@ public class ContentLoader{ return (Block)getByName(ContentType.block, name); } - public Array items(){ + public Seq items(){ return getBy(ContentType.item); } @@ -252,7 +258,7 @@ public class ContentLoader{ return (Item)getByID(ContentType.item, id); } - public Array liquids(){ + public Seq liquids(){ return getBy(ContentType.liquid); } @@ -260,7 +266,7 @@ public class ContentLoader{ return (Liquid)getByID(ContentType.liquid, id); } - public Array bullets(){ + public Seq bullets(){ return getBy(ContentType.bullet); } @@ -268,15 +274,15 @@ public class ContentLoader{ return (BulletType)getByID(ContentType.bullet, id); } - public Array sectors(){ + public Seq sectors(){ return getBy(ContentType.sector); } - public Array units(){ + public Seq units(){ return getBy(ContentType.unit); } - public Array planets(){ + public Seq planets(){ return getBy(ContentType.planet); } } diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index f744a16b4f..e704148ae5 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -9,6 +9,7 @@ import arc.math.*; import arc.scene.ui.*; import arc.struct.*; import arc.util.*; +import mindustry.*; import mindustry.audio.*; import mindustry.content.*; import mindustry.core.GameState.*; @@ -57,7 +58,7 @@ public class Control implements ApplicationListener, Loadable{ Events.on(StateChangeEvent.class, event -> { if((event.from == State.playing && event.to == State.menu) || (event.from == State.menu && event.to != State.menu)){ Time.runTask(5f, platform::updateRPC); - for(Sound sound : assets.getAll(Sound.class, new Array<>())){ + for(Sound sound : assets.getAll(Sound.class, new Seq<>())){ sound.stop(); } } @@ -183,8 +184,6 @@ public class Control implements ApplicationListener, Loadable{ Core.input.setCatch(KeyCode.back, true); - data.load(); - Core.settings.defaults( "ip", "localhost", "color-0", playerColors[8].rgba(), @@ -241,6 +240,15 @@ public class Control implements ApplicationListener, Loadable{ }); } + //TODO move + public void handleLaunch(Tilec tile){ + LaunchCorec ent = LaunchCoreEntity.create(); + ent.set(tile); + ent.block(Blocks.coreShard); + ent.lifetime(Vars.launchDuration); + ent.add(); + } + public void playSector(Sector sector){ ui.loadAnd(() -> { ui.planet.hide(); @@ -278,7 +286,7 @@ public class Control implements ApplicationListener, Loadable{ }catch(SaveException e){ Log.err(e); sector.save = null; - ui.showErrorMessage("$save.corrupted"); + Time.runTask(10f, () -> ui.showErrorMessage("$save.corrupted")); slot.delete(); playSector(sector); } @@ -459,9 +467,6 @@ public class Control implements ApplicationListener, Loadable{ input.updateState(); - //autosave global data if it's modified - data.checkSave(); - music.update(); loops.update(); Time.updateGlobal(); @@ -479,16 +484,6 @@ public class Control implements ApplicationListener, Loadable{ if(state.isGame()){ input.update(); - if(state.isCampaign()){ - for(Tilec tile : state.teams.cores(player.team())){ - for(Item item : content.items()){ - if(tile.items().has(item)){ - data.unlockContent(item); - } - } - } - } - if(state.rules.tutorial){ tutorial.update(); } diff --git a/core/src/mindustry/core/Logic.java b/core/src/mindustry/core/Logic.java index 871979bcaf..fc10df0b9b 100644 --- a/core/src/mindustry/core/Logic.java +++ b/core/src/mindustry/core/Logic.java @@ -6,7 +6,6 @@ import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.core.GameState.*; -import mindustry.ctype.*; import mindustry.game.EventType.*; import mindustry.game.*; import mindustry.game.Teams.*; @@ -98,6 +97,9 @@ public class Logic implements ApplicationListener{ SectorDamage.apply(state.rules.sector.getTurnsPassed()); state.rules.sector.setTurnsPassed(0); } + + //enable infinite ammo for wave team by default + state.rules.waveTeam.rules().infiniteAmmo = true; }); //TODO dying takes up a turn (?) @@ -109,21 +111,6 @@ public class Logic implements ApplicationListener{ } });*/ - //disable new waves after the boss spawns - Events.on(WaveEvent.class, e -> { - //only works for non-attack sectors - if(state.isCampaign() && state.boss() != null && !state.rules.attackMode){ - state.rules.waitEnemies = true; - } - }); - - } - - /** Handles the event of content being used by either the player or some block. */ - public void handleContent(UnlockableContent content){ - if(!headless){ - data.unlockContent(content); - } } /** Adds starting items, resets wave time, and sets state to playing. */ @@ -137,10 +124,10 @@ public class Logic implements ApplicationListener{ if(!state.isCampaign()){ for(TeamData team : state.teams.getActive()){ if(team.hasCore()){ - Tilec entity = team.core(); - entity.items().clear(); + TileEntity entity = team.core(); + entity.items.clear(); for(ItemStack stack : state.rules.loadout){ - entity.items().add(stack.item, stack.amount); + entity.items.add(stack.item, stack.amount); } } } @@ -182,10 +169,8 @@ public class Logic implements ApplicationListener{ state.rules.waves = false; } - //check if there is a boss present - Unitc boss = state.boss(); - //if this was a boss wave and there is no boss anymore, then it's a victory - if(boss == null && state.rules.waves && state.rules.waitEnemies){ + //if there's a "win" wave and no enemies are present, win automatically + if(state.rules.waves && state.enemies == 0 && state.rules.winWave > 0 && state.wave >= state.rules.winWave && !spawner.isSpawning()){ //the sector has been conquered - waves get disabled state.rules.waves = false; @@ -219,8 +204,6 @@ public class Logic implements ApplicationListener{ } } } - - } private void updateWeather(){ @@ -260,8 +243,9 @@ public class Logic implements ApplicationListener{ Time.runTask(30f, () -> { for(Tilec entity : state.teams.playerCores()){ for(Item item : content.items()){ - data.addItem(item, entity.items().get(item)); - Events.fire(new LaunchItemEvent(new ItemStack(item, entity.items().get(item)))); + //TODO where do the items go? + //data.addItem(item, entity.items().get(item)); + //Events.fire(new LaunchItemEvent(new ItemStack(item, entity.items().get(item)))); } entity.tile().remove(); } @@ -311,22 +295,14 @@ public class Logic implements ApplicationListener{ updateWeather(); for(TeamData data : state.teams.getActive()){ - if(data.hasAI() && data.hasCore()){ + if(data.hasAI()){ data.ai.update(); } - - //TODO this is terrible - //fills enemy core with resources - if(state.rules.enemyInfiniteResources && state.rules.waves && data.team == state.rules.waveTeam && data.hasCore()){ - for(Item item : content.items()){ - data.core().items.set(item, data.core().block.itemCapacity); - } - } } } if(state.rules.waves && state.rules.waveTimer && !state.gameOver){ - if(!state.rules.waitEnemies || state.enemies == 0){ + if(!isWaitingWave()){ state.wavetime = Math.max(state.wavetime - Time.delta(), 0); } } @@ -344,4 +320,9 @@ public class Logic implements ApplicationListener{ } } + /** @return whether the wave timer is paused due to enemies */ + public boolean isWaitingWave(){ + return (state.rules.waitEnemies || (state.wave >= state.rules.winWave && state.rules.winWave > 0)) && state.enemies > 0; + } + } diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index 8117bedd62..2cb3719ecf 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -51,7 +51,7 @@ public class NetClient implements ApplicationListener{ private ReusableByteInStream byteStream = new ReusableByteInStream(); private DataInputStream dataStream = new DataInputStream(byteStream); /** Packet handlers for custom types of messages. */ - private ObjectMap>> customPacketHandlers = new ObjectMap<>(); + private ObjectMap>> customPacketHandlers = new ObjectMap<>(); public NetClient(){ @@ -130,11 +130,11 @@ public class NetClient implements ApplicationListener{ } public void addPacketHandler(String type, Cons handler){ - customPacketHandlers.get(type, Array::new).add(handler); + customPacketHandlers.get(type, Seq::new).add(handler); } - public Array> getPacketHandlers(String type){ - return customPacketHandlers.get(type, Array::new); + public Seq> getPacketHandlers(String type){ + return customPacketHandlers.get(type, Seq::new); } @Remote(targets = Loc.server, variants = Variant.both) @@ -552,14 +552,14 @@ public class NetClient implements ApplicationListener{ void sync(){ if(timer.get(0, playerSyncTime)){ - BuildRequest[] requests = null; + BuildPlan[] requests = null; if(player.isBuilder() && control.input.isBuilding){ //limit to 10 to prevent buffer overflows - int usedRequests = Math.min(player.builder().requests().size, 10); + int usedRequests = Math.min(player.builder().plans().size, 10); - requests = new BuildRequest[usedRequests]; + requests = new BuildPlan[usedRequests]; for(int i = 0; i < usedRequests; i++){ - requests[i] = player.builder().requests().get(i); + requests[i] = player.builder().plans().get(i); } } diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 6c3f51e803..5eb1d6f9c0 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -75,7 +75,7 @@ public class NetServer implements ApplicationListener{ /** Data stream for writing player sync data to. */ private DataOutputStream dataStream = new DataOutputStream(syncStream); /** Packet handlers for custom types of messages. */ - private ObjectMap>> customPacketHandlers = new ObjectMap<>(); + private ObjectMap>> customPacketHandlers = new ObjectMap<>(); public NetServer(){ @@ -140,8 +140,8 @@ public class NetServer implements ApplicationListener{ return; } - Array extraMods = packet.mods.copy(); - Array missingMods = mods.getIncompatibility(extraMods); + Seq extraMods = packet.mods.copy(); + Seq missingMods = mods.getIncompatibility(extraMods); if(!extraMods.isEmpty() || !missingMods.isEmpty()){ //can't easily be localized since kick reasons can't have formatted text with them @@ -481,11 +481,11 @@ public class NetServer implements ApplicationListener{ } public void addPacketHandler(String type, Cons2 handler){ - customPacketHandlers.get(type, Array::new).add(handler); + customPacketHandlers.get(type, Seq::new).add(handler); } - public Array> getPacketHandlers(String type){ - return customPacketHandlers.get(type, Array::new); + public Seq> getPacketHandlers(String type){ + return customPacketHandlers.get(type, Seq::new); } public static void onDisconnect(Playerc player, String reason){ @@ -533,7 +533,7 @@ public class NetServer implements ApplicationListener{ float xVelocity, float yVelocity, Tile mining, boolean boosting, boolean shooting, boolean chatting, - @Nullable BuildRequest[] requests, + @Nullable BuildPlan[] requests, float viewX, float viewY, float viewWidth, float viewHeight ){ NetConnection connection = player.con(); @@ -571,7 +571,7 @@ public class NetServer implements ApplicationListener{ } if(requests != null){ - for(BuildRequest req : requests){ + 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; @@ -592,7 +592,7 @@ public class NetServer implements ApplicationListener{ connection.rejectedRequests.add(req); continue; } - player.builder().requests().addLast(req); + player.builder().plans().addLast(req); } } @@ -797,7 +797,7 @@ public class NetServer implements ApplicationListener{ public void writeEntitySnapshot(Playerc player) throws IOException{ syncStream.reset(); - Array cores = state.teams.cores(player.team()); + Seq cores = state.teams.cores(player.team()); dataStream.writeByte(cores.size); diff --git a/core/src/mindustry/core/Platform.java b/core/src/mindustry/core/Platform.java index 234f0bea0d..767bfa993d 100644 --- a/core/src/mindustry/core/Platform.java +++ b/core/src/mindustry/core/Platform.java @@ -14,7 +14,7 @@ import mindustry.net.*; import mindustry.net.Net.*; import mindustry.type.*; import mindustry.ui.dialogs.*; -import org.mozilla.javascript.*; +import rhino.*; import static mindustry.Vars.*; @@ -36,8 +36,8 @@ public interface Platform{ default void viewListingID(String mapid){} /** Steam: Return external workshop maps to be loaded.*/ - default Array getWorkshopContent(Class type){ - return new Array<>(0); + default Seq getWorkshopContent(Class type){ + return new Seq<>(0); } /** Steam: Open workshop for maps.*/ diff --git a/core/src/mindustry/core/Renderer.java b/core/src/mindustry/core/Renderer.java index 612131cf0e..cf0c911d52 100644 --- a/core/src/mindustry/core/Renderer.java +++ b/core/src/mindustry/core/Renderer.java @@ -222,7 +222,7 @@ public class Renderer implements ApplicationListener{ Draw.draw(Layer.light, lights::draw); } - if(state.rules.drawDarkness){ + if(enableDarkness){ Draw.draw(Layer.darkness, blocks::drawDarkness); } @@ -231,18 +231,12 @@ public class Renderer implements ApplicationListener{ Draw.draw(Layer.effect + 0.01f, bloom::render); } - Draw.z(Layer.plans); Draw.draw(Layer.plans, overlays::drawBottom); if(settings.getBool("animatedshields")){ Draw.drawRange(Layer.shields, 1f, () -> effectBuffer.begin(Color.clear), () -> { effectBuffer.end(); - - Draw.shader(Shaders.shield); - Draw.color(Pal.accent); - Draw.rect(effectBuffer); - Draw.color(); - Draw.shader(); + effectBuffer.blit(Shaders.shield); }); } @@ -345,7 +339,7 @@ public class Renderer implements ApplicationListener{ lines[i + 3] = (byte)255; } buffer.end(); - Pixmap fullPixmap = new Pixmap(w, h, Pixmap.Format.RGBA8888); + Pixmap fullPixmap = new Pixmap(w, h, Pixmap.Format.rgba8888); Buffers.copy(lines, 0, fullPixmap.getPixels(), lines.length); Fi file = screenshotDirectory.child("screenshot-" + Time.millis() + ".png"); PixmapIO.writePNG(file, fullPixmap); diff --git a/core/src/mindustry/core/UI.java b/core/src/mindustry/core/UI.java index db7439faa0..f26c2cd498 100644 --- a/core/src/mindustry/core/UI.java +++ b/core/src/mindustry/core/UI.java @@ -86,7 +86,7 @@ public class UI implements ApplicationListener, Loadable{ Fonts.def.getData().markupEnabled = true; Fonts.def.setOwnsTexture(false); - Core.assets.getAll(BitmapFont.class, new Array<>()).each(font -> font.setUseIntegerPositions(true)); + Core.assets.getAll(BitmapFont.class, new Seq<>()).each(font -> font.setUseIntegerPositions(true)); Core.scene = new Scene(); Core.input.addProcessor(Core.scene); @@ -118,8 +118,8 @@ public class UI implements ApplicationListener, Loadable{ } @Override - public Array getDependencies(){ - return Array.with(new AssetDescriptor<>(Control.class), new AssetDescriptor<>("outline", BitmapFont.class), new AssetDescriptor<>("default", BitmapFont.class), new AssetDescriptor<>("chat", BitmapFont.class)); + public Seq getDependencies(){ + return Seq.with(new AssetDescriptor<>(Control.class), new AssetDescriptor<>("outline", BitmapFont.class), new AssetDescriptor<>("default", BitmapFont.class), new AssetDescriptor<>("chat", BitmapFont.class)); } @Override @@ -373,7 +373,7 @@ public class UI implements ApplicationListener, Loadable{ cont.add((text.startsWith("$") ? Core.bundle.get(text.substring(1)) : text) + (message == null ? "" : "\n[lightgray](" + message + ")")).colspan(2).wrap().growX().center().get().setAlignment(Align.center); cont.row(); - Collapser col = new Collapser(base -> base.pane(t -> t.margin(14f).add(Strings.parseException(exc, true)).color(Color.lightGray).left()), true); + Collapser col = new Collapser(base -> base.pane(t -> t.margin(14f).add(Strings.neatError(exc)).color(Color.lightGray).left()), true); cont.button("$details", Styles.togglet, col::toggle).size(180f, 50f).checked(b -> !col.isCollapsed()).fillX().right(); cont.button("$ok", this::hide).size(110, 50).fillX().left(); @@ -382,37 +382,6 @@ public class UI implements ApplicationListener, Loadable{ }}.show(); } - public void showExceptions(String text, String... messages){ - loadfrag.hide(); - new Dialog(""){{ - - setFillParent(true); - cont.margin(15); - cont.add("$error.title").colspan(2); - cont.row(); - cont.image().width(300f).pad(2).colspan(2).height(4f).color(Color.scarlet); - cont.row(); - cont.add(text).colspan(2).wrap().growX().center().get().setAlignment(Align.center); - cont.row(); - - //cont.pane(p -> { - for(int i = 0; i < messages.length; i += 2){ - String btext = messages[i]; - String details = messages[i + 1]; - Collapser col = new Collapser(base -> base.pane(t -> t.margin(14f).add(details).color(Color.lightGray).left()), true); - - cont.add(btext).right(); - cont.button("$details", Styles.togglet, col::toggle).size(180f, 50f).checked(b -> !col.isCollapsed()).fillX().left(); - cont.row(); - cont.add(col).colspan(2).pad(2); - cont.row(); - } - //}).colspan(2); - - cont.button("$ok", this::hide).size(300, 50).fillX().colspan(2); - }}.show(); - } - public void showText(String titleText, String text){ showText(titleText, text, Align.center); } diff --git a/core/src/mindustry/core/World.java b/core/src/mindustry/core/World.java index 00dc23c333..415619bf94 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -230,9 +230,12 @@ public class World{ loadGenerator(size, size, tiles -> { if(sector.preset != null){ sector.preset.generator.generate(tiles); + sector.preset.rules.get(state.rules); //apply extra rules }else{ sector.planet.generator.generate(tiles, sector); } + //just in case + state.rules.sector = sector; }); //postgenerate for bases @@ -254,13 +257,10 @@ public class World{ state.rules.weather.clear(); - if(sector.is(SectorAttribute.rainy)){ - state.rules.weather.add(new WeatherEntry(Weathers.rain)); - } + 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)); - if(sector.is(SectorAttribute.snowy)){ - state.rules.weather.add(new WeatherEntry(Weathers.snow)); - } } public Context filterContext(Map map){ @@ -458,13 +458,13 @@ public class World{ float prev = Mathf.round(angle, step); float next = prev + step; //raw line length to be translated - float length = tiles.width/2f; + float length = state.getSector().getSize()/2f; float rawDst = Intersector.distanceLinePoint(Tmp.v1.trns(prev, length), Tmp.v2.trns(next, length), Tmp.v3.set(x - tiles.width/2, y - tiles.height/2).rotate(offset)) / Mathf.sqrt3 - 1; //noise rawDst += Noise.noise(x, y, 11f, 7f) + Noise.noise(x, y, 22f, 15f); - int circleDst = (int)(rawDst - (tiles.width / 2 - circleBlend)); + int circleDst = (int)(rawDst - (length - circleBlend)); if(circleDst > 0){ dark = Math.max(circleDst / 1f, dark); } @@ -527,7 +527,7 @@ public class World{ @Override public void end(){ - Array filters = map.filters(); + Seq filters = map.filters(); if(!filters.isEmpty()){ //input for filter queries diff --git a/core/src/mindustry/ctype/UnlockableContent.java b/core/src/mindustry/ctype/UnlockableContent.java index 01881c8b64..a74241a518 100644 --- a/core/src/mindustry/ctype/UnlockableContent.java +++ b/core/src/mindustry/ctype/UnlockableContent.java @@ -1,13 +1,15 @@ package mindustry.ctype; import arc.*; -import arc.util.ArcAnnotate.*; -import mindustry.annotations.Annotations.*; import arc.graphics.g2d.*; import arc.scene.ui.layout.*; -import mindustry.*; +import arc.util.ArcAnnotate.*; +import mindustry.annotations.Annotations.*; +import mindustry.game.EventType.*; import mindustry.graphics.*; -import mindustry.ui.Cicon; +import mindustry.ui.*; + +import static mindustry.Vars.*; /** Base interface for an unlockable content type. */ public abstract class UnlockableContent extends MappableContent{ @@ -19,12 +21,15 @@ public abstract class UnlockableContent extends MappableContent{ public boolean alwaysUnlocked = false; /** Icons by Cicon ID.*/ protected TextureRegion[] cicons = new TextureRegion[mindustry.ui.Cicon.all.length]; + /** Unlock state. Loaded from settings. Do not modify outside of the constructor. */ + protected boolean unlocked; public UnlockableContent(String name){ super(name); 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); } public String displayDescription(){ @@ -62,13 +67,24 @@ public abstract class UnlockableContent extends MappableContent{ return false; } - public final boolean unlocked(){ - return Vars.data.isUnlocked(this); + /** Makes this piece of content unlocked; if it already unlocked, nothing happens. */ + public void unlock(){ + if(!unlocked()){ + unlocked = true; + Core.settings.put(name + "-unlocked", true); + + onUnlock(); + Events.fire(new UnlockEvent(this)); + } } - /** @return whether this content is unlocked, or the player is in a custom game. */ - public final boolean unlockedCur(){ - return Vars.data.isUnlocked(this) || !Vars.state.isCampaign(); + public final boolean unlocked(){ + return unlocked || alwaysUnlocked; + } + + /** @return whether this content is unlocked, or the player is in a custom (non-campaign) game. */ + public final boolean unlockedNow(){ + return unlocked || alwaysUnlocked || !state.isCampaign(); } public final boolean locked(){ diff --git a/core/src/mindustry/editor/DrawOperation.java b/core/src/mindustry/editor/DrawOperation.java index 17e84715db..0d6607e8ff 100755 --- a/core/src/mindustry/editor/DrawOperation.java +++ b/core/src/mindustry/editor/DrawOperation.java @@ -1,7 +1,7 @@ package mindustry.editor; import mindustry.annotations.Annotations.*; -import arc.struct.LongArray; +import arc.struct.LongSeq; import mindustry.game.Team; import mindustry.gen.TileOp; import mindustry.world.Block; @@ -12,7 +12,7 @@ import static mindustry.Vars.content; public class DrawOperation{ private MapEditor editor; - private LongArray array = new LongArray(); + private LongSeq array = new LongSeq(); public DrawOperation(MapEditor editor) { this.editor = editor; diff --git a/core/src/mindustry/editor/EditorTool.java b/core/src/mindustry/editor/EditorTool.java index 26820d3c78..a6493d4401 100644 --- a/core/src/mindustry/editor/EditorTool.java +++ b/core/src/mindustry/editor/EditorTool.java @@ -91,7 +91,7 @@ public enum EditorTool{ edit = true; } - IntArray stack = new IntArray(); + IntSeq stack = new IntSeq(); @Override public void touched(MapEditor editor, int x, int y){ @@ -200,7 +200,7 @@ public enum EditorTool{ stack = null; System.gc(); e.printStackTrace(); - stack = new IntArray(); + stack = new IntSeq(); } } } diff --git a/core/src/mindustry/editor/MapEditorDialog.java b/core/src/mindustry/editor/MapEditorDialog.java index 96792a7cc2..7c5dd8d321 100644 --- a/core/src/mindustry/editor/MapEditorDialog.java +++ b/core/src/mindustry/editor/MapEditorDialog.java @@ -46,7 +46,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ private Rules lastSavedRules; private boolean saved = false; private boolean shownWithMap = false; - private Array blocksOut = new Array<>(); + private Seq blocksOut = new Seq<>(); public MapEditorDialog(){ super(""); diff --git a/core/src/mindustry/editor/MapGenerateDialog.java b/core/src/mindustry/editor/MapGenerateDialog.java index ac84bbf24d..1517a63db8 100644 --- a/core/src/mindustry/editor/MapGenerateDialog.java +++ b/core/src/mindustry/editor/MapGenerateDialog.java @@ -1,15 +1,14 @@ package mindustry.editor; import arc.*; -import arc.struct.*; import arc.func.*; import arc.graphics.*; -import arc.graphics.Pixmap.*; import arc.math.*; import arc.math.geom.*; import arc.scene.ui.*; import arc.scene.ui.ImageButton.*; import arc.scene.ui.layout.*; +import arc.struct.*; import arc.util.*; import arc.util.async.*; import mindustry.game.*; @@ -38,7 +37,7 @@ public class MapGenerateDialog extends BaseDialog{ private Pixmap pixmap; private Texture texture; private GenerateInput input = new GenerateInput(); - private Array filters = new Array<>(); + private Seq filters = new Seq<>(); private int scaling = mobile ? 3 : 1; private Table filterTable; @@ -48,7 +47,7 @@ public class MapGenerateDialog extends BaseDialog{ private GenTile returnTile = new GenTile(); private GenTile[][] buffer1, buffer2; - private Cons> applier; + private Cons> applier; private CachedTile ctile = new CachedTile(){ //nothing. @Override @@ -95,18 +94,18 @@ public class MapGenerateDialog extends BaseDialog{ onResize(this::rebuildFilters); } - public void show(Array filters, Cons> applier){ + public void show(Seq filters, Cons> applier){ this.filters = filters; this.applier = applier; show(); } - public void show(Cons> applier){ + public void show(Cons> applier){ show(this.filters, applier); } /** Applies the specified filters to the editor. */ - public void applyToEditor(Array filters){ + public void applyToEditor(Seq filters){ //writeback buffer GenTile[][] writeTiles = new GenTile[editor.width()][editor.height()]; @@ -158,7 +157,7 @@ public class MapGenerateDialog extends BaseDialog{ texture = null; } - pixmap = new Pixmap(editor.width() / scaling, editor.height() / scaling, Format.RGBA8888); + pixmap = new Pixmap(editor.width() / scaling, editor.height() / scaling); texture = new Texture(pixmap); cont.clear(); @@ -342,7 +341,7 @@ public class MapGenerateDialog extends BaseDialog{ return; } - Array copy = new Array<>(filters); + Seq copy = new Seq<>(filters); result = executor.submit(() -> { try{ @@ -391,7 +390,7 @@ public class MapGenerateDialog extends BaseDialog{ if(pixmap == null || texture == null){ return; } - texture.draw(pixmap, 0, 0); + texture.draw(pixmap); generating = false; }); }catch(Exception e){ diff --git a/core/src/mindustry/editor/MapRenderer.java b/core/src/mindustry/editor/MapRenderer.java index 90bb2ed4a2..4cf969a5dd 100644 --- a/core/src/mindustry/editor/MapRenderer.java +++ b/core/src/mindustry/editor/MapRenderer.java @@ -1,22 +1,18 @@ package mindustry.editor; import arc.*; -import arc.struct.IntSet; -import arc.struct.IntSet.IntSetIterator; -import arc.graphics.Color; -import arc.graphics.Texture; -import arc.graphics.g2d.Draw; -import arc.graphics.g2d.TextureRegion; -import arc.math.Mathf; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.struct.*; import arc.util.*; -import mindustry.content.Blocks; +import mindustry.content.*; import mindustry.game.EventType.*; -import mindustry.game.Team; -import mindustry.graphics.IndexedRenderer; -import mindustry.world.Block; -import mindustry.world.Tile; +import mindustry.game.*; +import mindustry.graphics.*; +import mindustry.world.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class MapRenderer implements Disposable{ private static final int chunkSize = 64; @@ -62,13 +58,7 @@ public class MapRenderer implements Disposable{ public void draw(float tx, float ty, float tw, float th){ Draw.flush(); - IntSetIterator it = updates.iterator(); - while(it.hasNext){ - int i = it.next(); - int x = i % width; - int y = i / width; - render(x, y); - } + updates.each(i -> render(i % width, i / width)); updates.clear(); updates.addAll(delayedUpdates); @@ -152,7 +142,7 @@ public class MapRenderer implements Disposable{ 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; - }else if(wall == Blocks.air){ + }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"); diff --git a/core/src/mindustry/editor/MapResizeDialog.java b/core/src/mindustry/editor/MapResizeDialog.java index bd8b758e61..0b493fc477 100644 --- a/core/src/mindustry/editor/MapResizeDialog.java +++ b/core/src/mindustry/editor/MapResizeDialog.java @@ -2,8 +2,10 @@ package mindustry.editor; import arc.func.*; import arc.math.*; +import arc.scene.ui.TextField.*; import arc.scene.ui.layout.*; -import mindustry.gen.*; +import arc.util.*; +import mindustry.*; import mindustry.ui.dialogs.*; public class MapResizeDialog extends BaseDialog{ @@ -22,21 +24,12 @@ public class MapResizeDialog extends BaseDialog{ for(boolean w : Mathf.booleans){ table.add(w ? "$width" : "$height").padRight(8f); table.defaults().height(60f).padTop(8); - table.button("<", () -> { - if(w) - width = move(width, -1); - else - height = move(height, -1); - }).size(60f); - table.table(Tex.button, t -> t.label(() -> (w ? width : height) + "")).width(200); + Vars.platform.addDialog(table.field((w ? width : height) + "", TextFieldFilter.digitsOnly, value -> { + int val = Integer.parseInt(value); + if(w) width = val; else height = val; + }).valid(value -> Strings.canParsePostiveInt(value) && Integer.parseInt(value) <= maxSize && Integer.parseInt(value) >= minSize).get()); - table.button(">", () -> { - if(w) - width = move(width, 1); - else - height = move(height, 1); - }).size(60f); table.row(); } cont.row(); @@ -51,8 +44,4 @@ public class MapResizeDialog extends BaseDialog{ hide(); }); } - - static int move(int value, int direction){ - return Mathf.clamp((value / increment + direction) * increment, minSize, maxSize); - } } diff --git a/core/src/mindustry/editor/OperationStack.java b/core/src/mindustry/editor/OperationStack.java index f21cde91b8..623bd1a3cd 100755 --- a/core/src/mindustry/editor/OperationStack.java +++ b/core/src/mindustry/editor/OperationStack.java @@ -1,10 +1,10 @@ package mindustry.editor; -import arc.struct.Array; +import arc.struct.Seq; public class OperationStack{ private final static int maxSize = 10; - private Array stack = new Array<>(); + private Seq stack = new Seq<>(); private int index = 0; public OperationStack(){ diff --git a/core/src/mindustry/editor/WaveInfoDialog.java b/core/src/mindustry/editor/WaveInfoDialog.java index e051c5d231..77574793af 100644 --- a/core/src/mindustry/editor/WaveInfoDialog.java +++ b/core/src/mindustry/editor/WaveInfoDialog.java @@ -26,7 +26,7 @@ import static mindustry.game.SpawnGroup.never; public class WaveInfoDialog extends BaseDialog{ private final static int displayed = 20; - private Array groups = new Array<>(); + private Seq groups = new Seq<>(); private Table table, preview; private int start = 0; @@ -87,7 +87,7 @@ public class WaveInfoDialog extends BaseDialog{ main.pane(t -> table = t).growX().growY().padRight(8f).get().setScrollingDisabled(true, false); main.row(); main.button("$add", () -> { - if(groups == null) groups = new Array<>(); + if(groups == null) groups = new Seq<>(); groups.add(new SpawnGroup(lastType)); buildGroups(); }).growX().height(70f); diff --git a/core/src/mindustry/entities/EntityCollisions.java b/core/src/mindustry/entities/EntityCollisions.java index 4aaf455f10..41a9f21276 100644 --- a/core/src/mindustry/entities/EntityCollisions.java +++ b/core/src/mindustry/entities/EntityCollisions.java @@ -22,7 +22,7 @@ public class EntityCollisions{ private Rect r2 = new Rect(); //entity collisions - private Array arrOut = new Array<>(); + private Seq arrOut = new Seq<>(); public void move(Hitboxc entity, float deltax, float deltay){ move(entity, deltax, deltay, EntityCollisions::solid); diff --git a/core/src/mindustry/entities/EntityGroup.java b/core/src/mindustry/entities/EntityGroup.java index 088f782349..80d01ea9cd 100644 --- a/core/src/mindustry/entities/EntityGroup.java +++ b/core/src/mindustry/entities/EntityGroup.java @@ -15,8 +15,8 @@ import static mindustry.Vars.collisions; public class EntityGroup implements Iterable{ private static int lastId = 0; - private final Array array; - private final Array intersectArray = new Array<>(); + private final Seq array; + private final Seq intersectArray = new Seq<>(); private final Rect viewport = new Rect(); private final Rect intersectRect = new Rect(); private IntMap map; @@ -30,7 +30,7 @@ public class EntityGroup implements Iterable{ } public EntityGroup(Class type, boolean spatial, boolean mapping){ - array = new Array<>(false, 32, type); + array = new Seq<>(false, 32, type); if(spatial){ tree = new QuadTree<>(new Rect(0, 0, 0, 0)); @@ -57,7 +57,7 @@ public class EntityGroup implements Iterable{ each(Entityc::update); } - public void copy(Array arr){ + public void copy(Seq arr){ arr.addAll(array); } @@ -108,10 +108,10 @@ public class EntityGroup implements Iterable{ public void intersect(float x, float y, float width, float height, Cons out){ //don't waste time for empty groups if(isEmpty()) return; - tree.intersect(height, x, y, width, out); + tree.intersect(x, y, width, height, out); } - public Array intersect(float x, float y, float width, float height){ + public Seq intersect(float x, float y, float width, float height){ intersectArray.clear(); //don't waste time for empty groups if(isEmpty()) return intersectArray; diff --git a/core/src/mindustry/entities/Leg.java b/core/src/mindustry/entities/Leg.java index 24e032e482..248c5d2af0 100644 --- a/core/src/mindustry/entities/Leg.java +++ b/core/src/mindustry/entities/Leg.java @@ -4,4 +4,7 @@ import arc.math.geom.*; public class Leg{ public final Vec2 joint = new Vec2(), base = new Vec2(); + public int group; + public boolean moving; + public float stage; } diff --git a/core/src/mindustry/entities/Lightning.java b/core/src/mindustry/entities/Lightning.java index c0cd8aab85..db37d6c39b 100644 --- a/core/src/mindustry/entities/Lightning.java +++ b/core/src/mindustry/entities/Lightning.java @@ -14,7 +14,7 @@ import static mindustry.Vars.*; public class Lightning{ private static final Rand random = new Rand(); private static final Rect rect = new Rect(); - private static final Array entities = new Array<>(); + private static final Seq entities = new Seq<>(); private static final IntSet hit = new IntSet(); private static final int maxChain = 8; private static final float hitRange = 30f; @@ -32,7 +32,7 @@ public class Lightning{ random.setSeed(seed); hit.clear(); - Array lines = new Array<>(); + Seq lines = new Seq<>(); bhit = false; for(int i = 0; i < length / 2; i++){ diff --git a/core/src/mindustry/entities/Puddles.java b/core/src/mindustry/entities/Puddles.java index 305ddb1498..9d10b84213 100644 --- a/core/src/mindustry/entities/Puddles.java +++ b/core/src/mindustry/entities/Puddles.java @@ -39,7 +39,7 @@ public class Puddles{ Puddlec p = map.get(tile.pos()); if(generation == 0 && p != null && p.lastRipple() <= Time.time() - 40f){ - Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, tile.floor().liquidDrop.color); + Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, 1f, tile.floor().liquidDrop.color); p.lastRipple(Time.time()); } return; @@ -59,7 +59,7 @@ public class Puddles{ p.accepting(Math.max(amount, p.accepting())); if(generation == 0 && p.lastRipple() <= Time.time() - 40f && p.amount() >= maxLiquid / 2f){ - Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, p.liquid().color); + Fx.ripple.at((tile.worldx() + source.worldx()) / 2f, (tile.worldy() + source.worldy()) / 2f, 1f, p.liquid().color); p.lastRipple(Time.time()); } }else{ diff --git a/core/src/mindustry/entities/Units.java b/core/src/mindustry/entities/Units.java index e6c4559b0e..07a31a4368 100644 --- a/core/src/mindustry/entities/Units.java +++ b/core/src/mindustry/entities/Units.java @@ -180,9 +180,28 @@ public class Units{ return result; } + /** Returns the closest ally of this team. Filter by predicate. + * Unlike the closest() function, this only guarantees that unit hitboxes overlap the range. */ + public static Unitc closestOverlap(Team team, float x, float y, float range, Boolf predicate){ + result = null; + cdist = 0f; + + nearby(team, x - range, y - range, range*2f, range*2f, e -> { + if(!predicate.get(e)) return; + + float dist = e.dst2(x, y); + if(result == null || dist < cdist){ + result = e; + cdist = dist; + } + }); + + return result; + } + /** Iterates over all units in a rectangle. */ public static void nearby(Team team, float x, float y, float width, float height, Cons cons){ - teamIndex.tree(team).intersect(height, x, y, width, cons); + teamIndex.tree(team).intersect(x, y, width, height, cons); } /** Iterates over all units in a circle around this position. */ diff --git a/core/src/mindustry/entities/bullet/ArtilleryBulletType.java b/core/src/mindustry/entities/bullet/ArtilleryBulletType.java index 1894b4c911..c000ed470a 100644 --- a/core/src/mindustry/entities/bullet/ArtilleryBulletType.java +++ b/core/src/mindustry/entities/bullet/ArtilleryBulletType.java @@ -37,12 +37,12 @@ public class ArtilleryBulletType extends BasicBulletType{ float baseScale = 0.7f; float scale = (baseScale + b.fslope() * (1f - baseScale)); - float height = bulletHeight * ((1f - bulletShrink) + bulletShrink * b.fout()); + float height = this.height * ((1f - shrinkY) + shrinkY * b.fout()); Draw.color(backColor); - Draw.rect(backRegion, b.x(), b.y(), bulletWidth * scale, height * scale, b.rotation() - 90); + Draw.rect(backRegion, b.x(), b.y(), width * scale, height * scale, b.rotation() - 90); Draw.color(frontColor); - Draw.rect(frontRegion, b.x(), b.y(), bulletWidth * scale, height * scale, b.rotation() - 90); + Draw.rect(frontRegion, b.x(), b.y(), width * scale, height * scale, b.rotation() - 90); Draw.color(); } } diff --git a/core/src/mindustry/entities/bullet/BasicBulletType.java b/core/src/mindustry/entities/bullet/BasicBulletType.java index 0fc8fe05c9..becfc69ec8 100644 --- a/core/src/mindustry/entities/bullet/BasicBulletType.java +++ b/core/src/mindustry/entities/bullet/BasicBulletType.java @@ -10,16 +10,16 @@ import mindustry.graphics.Pal; /** 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 float bulletWidth = 5f, bulletHeight = 7f; - public float bulletShrink = 0.5f; - public String bulletSprite; + public float width = 5f, height = 7f; + public float shrinkX = 0f, shrinkY = 0.5f; + public String sprite; public TextureRegion backRegion; public TextureRegion frontRegion; public BasicBulletType(float speed, float damage, String bulletSprite){ super(speed, damage); - this.bulletSprite = bulletSprite; + this.sprite = bulletSprite; } @@ -34,18 +34,19 @@ public class BasicBulletType extends BulletType{ @Override public void load(){ - backRegion = Core.atlas.find(bulletSprite + "-back"); - frontRegion = Core.atlas.find(bulletSprite); + backRegion = Core.atlas.find(sprite + "-back"); + frontRegion = Core.atlas.find(sprite); } @Override public void draw(Bulletc b){ - float height = bulletHeight * ((1f - bulletShrink) + bulletShrink * b.fout()); + float height = this.height * ((1f - shrinkY) + shrinkY * b.fout()); + float width = this.width * ((1f - shrinkX) + shrinkX * b.fout()); Draw.color(backColor); - Draw.rect(backRegion, b.x(), b.y(), bulletWidth, height, b.rotation() - 90); + Draw.rect(backRegion, b.x(), b.y(), width, height, b.rotation() - 90); Draw.color(frontColor); - Draw.rect(frontRegion, b.x(), b.y(), bulletWidth, height, b.rotation() - 90); + Draw.rect(frontRegion, b.x(), b.y(), width, height, b.rotation() - 90); Draw.color(); } } diff --git a/core/src/mindustry/entities/bullet/BombBulletType.java b/core/src/mindustry/entities/bullet/BombBulletType.java index 50ff842780..4dd18a7750 100644 --- a/core/src/mindustry/entities/bullet/BombBulletType.java +++ b/core/src/mindustry/entities/bullet/BombBulletType.java @@ -10,7 +10,7 @@ public class BombBulletType extends BasicBulletType{ splashDamage = damage; collidesTiles = false; collides = false; - bulletShrink = 0.7f; + shrinkY = 0.7f; lifetime = 30f; drag = 0.05f; keepVelocity = false; diff --git a/core/src/mindustry/entities/bullet/BulletType.java b/core/src/mindustry/entities/bullet/BulletType.java index 14b33712b5..ea9babae9c 100644 --- a/core/src/mindustry/entities/bullet/BulletType.java +++ b/core/src/mindustry/entities/bullet/BulletType.java @@ -93,6 +93,10 @@ public abstract class BulletType extends Content{ public float weaveMag = -1f; public float hitShake = 0f; + public float lightRadius = 16f; + public float lightOpacity = 0.3f; + public Color lightColor = Pal.powerLight; + public BulletType(float speed, float damage){ this.speed = speed; this.damage = damage; @@ -161,6 +165,10 @@ public abstract class BulletType extends Content{ public void draw(Bulletc b){ } + public void drawLight(Bulletc b){ + Drawf.light(b.team(), b, lightRadius, lightColor, lightOpacity); + } + public void init(Bulletc b){ if(killShooter && b.owner() instanceof Healthc){ ((Healthc)b.owner()).kill(); diff --git a/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java b/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java index 5332453b78..ea77877b76 100644 --- a/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java +++ b/core/src/mindustry/entities/bullet/ContinuousLaserBulletType.java @@ -28,6 +28,9 @@ public class ContinuousLaserBulletType extends BulletType{ pierce = true; hittable = false; hitColor = colors[2]; + incendAmount = 1; + incendSpread = 5; + incendChance = 0.4f; } protected ContinuousLaserBulletType(){ @@ -53,15 +56,6 @@ public class ContinuousLaserBulletType extends BulletType{ } } - /* - @Override - public void hit(Bulletc b, float hitx, float hity){ - hitEffect.at(hitx, hity, colors[2]); - if(Mathf.chance(0.4)){ - Fires.create(world.tileWorld(hitx + Mathf.range(5f), hity + Mathf.range(5f))); - } - }*/ - @Override public void draw(Bulletc b){ float baseLen = length * b.fout(); @@ -78,8 +72,13 @@ public class ContinuousLaserBulletType extends BulletType{ Tmp.v1.trns(b.rotation(), baseLen * 1.1f); - Drawf.light(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, Color.orange, 0.7f); Draw.reset(); } + @Override + public void drawLight(Bulletc b){ + //no light drawn here + } + } diff --git a/core/src/mindustry/entities/bullet/FlakBulletType.java b/core/src/mindustry/entities/bullet/FlakBulletType.java index 0104185290..689e185d7b 100644 --- a/core/src/mindustry/entities/bullet/FlakBulletType.java +++ b/core/src/mindustry/entities/bullet/FlakBulletType.java @@ -13,8 +13,8 @@ public class FlakBulletType extends BasicBulletType{ splashDamage = 15f; splashDamageRadius = 34f; hitEffect = Fx.flakExplosionBig; - bulletWidth = 8f; - bulletHeight = 10f; + width = 8f; + height = 10f; collidesGround = false; } diff --git a/core/src/mindustry/entities/bullet/LaserBulletType.java b/core/src/mindustry/entities/bullet/LaserBulletType.java index 606d0a3f1c..c9a3977f77 100644 --- a/core/src/mindustry/entities/bullet/LaserBulletType.java +++ b/core/src/mindustry/entities/bullet/LaserBulletType.java @@ -31,6 +31,7 @@ public class LaserBulletType extends BulletType{ despawnEffect = Fx.none; shootEffect = Fx.hitLancer; smokeEffect = Fx.none; + collides = false; hitSize = 4; lifetime = 16f; pierce = true; @@ -92,6 +93,11 @@ public class LaserBulletType extends BulletType{ Draw.reset(); Tmp.v1.trns(b.rotation(), baseLen * 1.1f); - Drawf.light(b.x(), b.y(), b.x() + Tmp.v1.x, b.y() + Tmp.v1.y, width * 1.4f * b.fout(), colors[0], 0.6f); + Drawf.light(b.team(), b.x(), b.y(), b.x() + Tmp.v1.x, b.y() + Tmp.v1.y, width * 1.4f * b.fout(), colors[0], 0.6f); + } + + @Override + public void drawLight(Bulletc b){ + //no light drawn here } } diff --git a/core/src/mindustry/entities/comp/BuilderComp.java b/core/src/mindustry/entities/comp/BuilderComp.java index 003536df39..e13d5f12bc 100644 --- a/core/src/mindustry/entities/comp/BuilderComp.java +++ b/core/src/mindustry/entities/comp/BuilderComp.java @@ -28,8 +28,7 @@ abstract class BuilderComp implements Unitc{ @Import float x, y, rotation; - Queue requests = new Queue<>(); - transient float buildSpeed = 1f; + Queue plans = new Queue<>(); transient boolean building = true; @Override @@ -44,32 +43,34 @@ abstract class BuilderComp implements Unitc{ float finalPlaceDst = state.rules.infiniteResources ? Float.MAX_VALUE : buildingRange; - Iterator it = requests.iterator(); + boolean infinite = state.rules.infiniteResources || team().rules().infiniteResources; + + Iterator it = plans.iterator(); while(it.hasNext()){ - BuildRequest req = it.next(); + BuildPlan req = it.next(); Tile tile = world.tile(req.x, req.y); if(tile == null || (req.breaking && tile.block() == Blocks.air) || (!req.breaking && (tile.rotation() == req.rotation || !req.block.rotate) && tile.block() == req.block)){ it.remove(); } } - Tilec core = closestCore(); + Tilec core = core(); //nothing to build. - if(buildRequest() == null) return; + if(buildPlan() == null) return; //find the next build request - if(requests.size > 1){ + if(plans.size > 1){ int total = 0; - BuildRequest req; - while((dst((req = buildRequest()).tile()) > finalPlaceDst || shouldSkip(req, core)) && total < requests.size){ - requests.removeFirst(); - requests.addLast(req); + BuildPlan req; + while((dst((req = buildPlan()).tile()) > finalPlaceDst || shouldSkip(req, core)) && total < plans.size){ + plans.removeFirst(); + plans.addLast(req); total++; } } - BuildRequest current = buildRequest(); + BuildPlan current = buildPlan(); if(dst(current.tile()) > finalPlaceDst) return; @@ -83,7 +84,7 @@ abstract class BuilderComp implements Unitc{ if(!current.initialized && !current.breaking && Build.validPlace(current.block, team(), current.x, current.y, current.rotation)){ boolean hasAll = !Structs.contains(current.block.requirements, i -> !core.items().has(i.item)); - if(hasAll || state.rules.infiniteResources){ + if(hasAll || infinite){ Build.beginPlace(current.block, team(), current.x, current.y, current.rotation); }else{ current.stuck = true; @@ -91,11 +92,11 @@ abstract class BuilderComp implements Unitc{ }else if(!current.initialized && current.breaking && Build.validBreak(team(), current.x, current.y)){ Build.beginBreak(team(), current.x, current.y); }else{ - requests.removeFirst(); + plans.removeFirst(); return; } }else if(tile.team() != team()){ - requests.removeFirst(); + plans.removeFirst(); return; } @@ -105,7 +106,7 @@ abstract class BuilderComp implements Unitc{ } //if there is no core to build with or no build entity, stop building! - if((core == null && !state.rules.infiniteResources) || !(tile.entity instanceof BuildEntity)){ + if((core == null && !infinite) || !(tile.entity instanceof BuildEntity)){ return; } @@ -113,9 +114,9 @@ abstract class BuilderComp implements Unitc{ BuildEntity entity = tile.ent(); if(current.breaking){ - entity.deconstruct(this, core, 1f / entity.buildCost * Time.delta() * buildSpeed * state.rules.buildSpeedMultiplier); + entity.deconstruct(this, core, 1f / entity.buildCost * Time.delta() * type().buildSpeed * state.rules.buildSpeedMultiplier); }else{ - if(entity.construct(this, core, 1f / entity.buildCost * Time.delta() * buildSpeed * state.rules.buildSpeedMultiplier, current.hasConfig)){ + if(entity.construct(this, core, 1f / entity.buildCost * Time.delta() * type().buildSpeed * state.rules.buildSpeedMultiplier, current.hasConfig)){ if(current.hasConfig){ Call.onTileConfig(null, tile.entity, current.config); } @@ -130,8 +131,8 @@ abstract class BuilderComp implements Unitc{ /** Draw all current build requests. Does not draw the beam effect, only the positions. */ void drawBuildRequests(){ - for(BuildRequest request : requests){ - if(request.progress > 0.01f || (buildRequest() == request && request.initialized && (dst(request.x * tilesize, request.y * tilesize) <= buildingRange || state.isEditor()))) continue; + for(BuildPlan request : plans){ + if(request.progress > 0.01f || (buildPlan() == request && request.initialized && (dst(request.x * tilesize, request.y * tilesize) <= buildingRange || state.isEditor()))) continue; request.animScale = 1f; if(request.breaking){ @@ -146,62 +147,63 @@ abstract class BuilderComp implements Unitc{ } /** @return whether this request should be skipped, in favor of the next one. */ - boolean shouldSkip(BuildRequest request, @Nullable Tilec core){ + boolean shouldSkip(BuildPlan request, @Nullable Tilec core){ //requests that you have at least *started* are considered - if(state.rules.infiniteResources || request.breaking || core == null) return false; + 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); } void removeBuild(int x, int y, boolean breaking){ //remove matching request - int idx = requests.indexOf(req -> req.breaking == breaking && req.x == x && req.y == y); + int idx = plans.indexOf(req -> req.breaking == breaking && req.x == x && req.y == y); if(idx != -1){ - requests.removeIndex(idx); + plans.removeIndex(idx); } } /** Return whether this builder's place queue contains items. */ boolean isBuilding(){ - return requests.size != 0; + return plans.size != 0; } /** Clears the placement queue. */ void clearBuilding(){ - requests.clear(); + plans.clear(); } /** Add another build requests to the tail of the queue, if it doesn't exist there yet. */ - void addBuild(BuildRequest place){ + void addBuild(BuildPlan place){ addBuild(place, true); } /** Add another build requests to the queue, if it doesn't exist there yet. */ - void addBuild(BuildRequest place, boolean tail){ - BuildRequest replace = null; - for(BuildRequest request : requests){ + void addBuild(BuildPlan place, boolean tail){ + BuildPlan replace = null; + for(BuildPlan request : plans){ if(request.x == place.x && request.y == place.y){ replace = request; break; } } if(replace != null){ - requests.remove(replace); + plans.remove(replace); } Tile tile = world.tile(place.x, place.y); if(tile != null && tile.entity instanceof BuildEntity){ place.progress = tile.ent().progress; } if(tail){ - requests.addLast(place); + plans.addLast(place); }else{ - requests.addFirst(place); + plans.addFirst(place); } } - /** Return the build requests currently active, or the one at the top of the queue.*/ - @Nullable BuildRequest buildRequest(){ - return requests.size == 0 ? null : requests.first(); + /** Return the build request currently active, or the one at the top of the queue.*/ + @Nullable + BuildPlan buildPlan(){ + return plans.size == 0 ? null : plans.first(); } @Override @@ -211,15 +213,15 @@ abstract class BuilderComp implements Unitc{ //TODO check correctness Draw.z(Layer.flyingUnit); - BuildRequest request = buildRequest(); - Tile tile = world.tile(request.x, request.y); + BuildPlan plan = buildPlan(); + Tile tile = world.tile(plan.x, plan.y); if(dst(tile) > buildingRange && !state.isEditor()){ return; } - int size = request.breaking ? tile.block().size : request.block.size; - float tx = request.drawx(), ty = request.drawy(); + int size = plan.breaking ? tile.block().size : plan.block.size; + float tx = plan.drawx(), ty = plan.drawy(); Lines.stroke(1f, Pal.accent); float focusLen = 3.8f + Mathf.absin(Time.time(), 1.1f, 0.6f); diff --git a/core/src/mindustry/entities/comp/BulletComp.java b/core/src/mindustry/entities/comp/BulletComp.java index 909dde051f..70415cb415 100644 --- a/core/src/mindustry/entities/comp/BulletComp.java +++ b/core/src/mindustry/entities/comp/BulletComp.java @@ -18,8 +18,9 @@ import static mindustry.Vars.*; @Component abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Drawc, Shielderc, Ownerc, Velc, Bulletc, Timerc{ @Import Team team; + @Import Entityc owner; - IntArray collided = new IntArray(6); + IntSeq collided = new IntSeq(6); Object data; BulletType type; float damage; @@ -49,15 +50,14 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw @Override public float damageMultiplier(){ - if(owner() instanceof Unitc){ - return ((Unitc)owner()).damageMultiplier(); - } + if(owner instanceof Unitc) return ((Unitc)owner).damageMultiplier() * state.rules.unitDamageMultiplier; + if(owner instanceof Tilec) return state.rules.blockDamageMultiplier; + return 1f; } @Override public void absorb(){ - //TODO remove(); } @@ -107,7 +107,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw public void update(){ type.update(this); - if(type.collidesTiles){ + if(type.collidesTiles && type.collides){ world.raycastEach(world.toTile(lastX()), world.toTile(lastY()), tileX(), tileY(), (x, y) -> { Tilec tile = world.ent(x, y); @@ -133,8 +133,7 @@ abstract class BulletComp implements Timedc, Damagec, Hitboxc, Teamc, Posc, Draw Draw.z(Layer.bullet); type.draw(this); - //TODO refactor - Drawf.light(x(), y(), 16f, Pal.powerLight, 0.3f); + type.drawLight(this); } /** 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 94c4c8dfb2..607b0968bf 100644 --- a/core/src/mindustry/entities/comp/CommanderComp.java +++ b/core/src/mindustry/entities/comp/CommanderComp.java @@ -11,12 +11,12 @@ import mindustry.gen.*; /** A unit that can command other units. */ @Component abstract class CommanderComp implements Unitc{ - private static final Array members = new Array<>(); + private static final Seq members = new Seq<>(); @Import float x, y, rotation; transient @Nullable Formation formation; - transient Array controlling = new Array<>(); + transient Seq controlling = new Seq<>(); @Override public void update(){ @@ -42,7 +42,7 @@ abstract class CommanderComp implements Unitc{ clearCommand(); } - void command(Formation formation, Array units){ + void command(Formation formation, Seq units){ clearCommand(); controlling.addAll(units); diff --git a/core/src/mindustry/entities/comp/FlyingComp.java b/core/src/mindustry/entities/comp/FlyingComp.java index c0b4865ed7..f79fd3c3a1 100644 --- a/core/src/mindustry/entities/comp/FlyingComp.java +++ b/core/src/mindustry/entities/comp/FlyingComp.java @@ -70,7 +70,7 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ if(isGrounded() && floor.isLiquid){ if((splashTimer += Mathf.dst(deltaX(), deltaY())) >= 7f){ - floor.walkEffect.at(x, y, 0, floor.mapColor); + floor.walkEffect.at(x, y, 1f, floor.mapColor); splashTimer = 0f; } } @@ -79,7 +79,7 @@ abstract class FlyingComp implements Posc, Velc, Healthc, Hitboxc{ drownTime += Time.delta() * 1f / floor.drownTime; drownTime = Mathf.clamp(drownTime); if(Mathf.chanceDelta(0.05f)){ - floor.drownUpdateEffect.at(x, y, 0f, floor.mapColor); + floor.drownUpdateEffect.at(x, y, 1f, floor.mapColor); } //TODO is the netClient check necessary? diff --git a/core/src/mindustry/entities/comp/LaunchCoreComp.java b/core/src/mindustry/entities/comp/LaunchCoreComp.java new file mode 100644 index 0000000000..186cff2b2e --- /dev/null +++ b/core/src/mindustry/entities/comp/LaunchCoreComp.java @@ -0,0 +1,76 @@ +package mindustry.entities.comp; + +import arc.graphics.g2d.*; +import arc.math.*; +import arc.util.*; +import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.ui.*; +import mindustry.world.*; + +@EntityDef(value = LaunchCorec.class, serialize = false) +@Component +abstract class LaunchCoreComp implements Drawc, Timedc{ + @Import float x, y; + + transient Interval in = new Interval(); + Block block; + + @Override + public void draw(){ + float alpha = fout(Interp.pow5Out); + float scale = (1f - alpha) * 1.4f + 1f; + float cx = cx(), cy = cy(); + float rotation = fin() * (140f + Mathf.randomSeedRange(id(), 50f)); + + Draw.z(Layer.effect + 0.001f); + + Draw.color(Pal.engine); + + float rad = 0.2f + fslope(); + float rscl = (block.size - 1) * 0.85f; + + Fill.light(cx, cy, 10, 25f * (rad + scale-1f) * rscl, Tmp.c2.set(Pal.engine).a(alpha), Tmp.c1.set(Pal.engine).a(0f)); + + Draw.alpha(alpha); + for(int i = 0; i < 4; i++){ + Drawf.tri(cx, cy, 6f * rscl, 40f * (rad + scale-1f) * rscl, i * 90f + rotation); + } + + Draw.color(); + + Draw.z(Layer.weather - 1); + + TextureRegion region = block.icon(Cicon.full); + float rw = region.getWidth() * Draw.scl * scale, rh = region.getHeight() * Draw.scl * scale; + + Draw.alpha(alpha); + Draw.rect(region, cx, cy, rw, rh, rotation - 45); + + Tmp.v1.trns(225f, fin(Interp.pow3In) * 250f); + + Draw.z(Layer.flyingUnit + 1); + Draw.color(0, 0, 0, 0.22f * alpha); + Draw.rect(region, cx + Tmp.v1.x, cy + Tmp.v1.y, rw, rh, rotation - 45); + + Draw.reset(); + } + + float cx(){ + return x + fin(Interp.pow2In) * (12f + Mathf.randomSeedRange(id() + 3, 4f)); + } + + float cy(){ + return y + fin(Interp.pow5In) * (100f + Mathf.randomSeedRange(id() + 2, 30f)); + } + + @Override + public void update(){ + float r = 4f; + if(in.get(3f - fin()*2f)){ + Fx.rocketSmokeLarge.at(cx() + Mathf.range(r), cy() + Mathf.range(r), fin()); + } + } +} \ No newline at end of file diff --git a/core/src/mindustry/entities/comp/LegsComp.java b/core/src/mindustry/entities/comp/LegsComp.java index 4791739786..452452b844 100644 --- a/core/src/mindustry/entities/comp/LegsComp.java +++ b/core/src/mindustry/entities/comp/LegsComp.java @@ -1,12 +1,14 @@ package mindustry.entities.comp; import arc.math.*; +import arc.math.geom.*; import arc.util.*; import mindustry.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.blocks.environment.*; @@ -17,7 +19,7 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc, Elevatio transient Leg[] legs = {}; transient float totalLength; - transient int lastGroup; + transient float moveSpace; transient float baseRotation; @Override @@ -47,59 +49,77 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc, Elevatio } float moveSpeed = type.legSpeed; - int div = Math.max(legs.length / 2, 2); - float moveSpace = legLength / 1.6f / (div / 2f) * type.legMoveSpace; - + int div = Math.max(legs.length / type.legGroupSize, 2); + moveSpace = legLength / 1.6f / (div / 2f) * type.legMoveSpace; totalLength += Mathf.dst(deltaX(), deltaY()); - int stage = (int)(totalLength / moveSpace); - int group = stage % div; + float trns = moveSpace * 0.85f * type.legTrns; - if(lastGroup != group){ - //create ripple effects when switching leg groups - int i = 0; - for(Leg l : legs){ - if(i++ % div == lastGroup){ + //rotation + offset vector + Vec2 moveOffset = Tmp.v4.trns(rot, trns); + boolean moving = moving(); + + for(int i = 0; i < legs.length; i++){ + float dstRot = legAngle(rot, i); + Vec2 baseOffset = Tmp.v5.trns(dstRot, type.legBaseOffset).add(x, y); + Leg l = legs[i]; + + l.joint.sub(baseOffset).limit(type.maxStretch * legLength/2f).add(baseOffset); + l.base.sub(baseOffset).limit(type.maxStretch * legLength).add(baseOffset); + + float stageF = (totalLength + i*type.legPairOffset) / moveSpace; + int stage = (int)stageF; + int group = stage % div; + boolean move = i % div == group; + boolean side = i < legs.length/2; + //back legs have reversed directions + boolean backLeg = Math.abs((i + 0.5f) - legs.length/2f) <= 0.501f; + if(backLeg && type.flipBackLegs) side = !side; + + l.moving = move; + l.stage = moving ? stageF % 1f : Mathf.lerpDelta(l.stage, 0f, 0.1f); + + if(l.group != group){ + + //create effect when transitioning to a group it can't move in + if(!move && i % div == l.group){ Floor floor = Vars.world.floorWorld(l.base.x, l.base.y); if(floor.isLiquid){ - floor.walkEffect.at(l.base.x, l.base.y, 0, floor.mapColor); + floor.walkEffect.at(l.base.x, l.base.y, type.rippleScale, floor.mapColor); }else{ - Fx.unitLandSmall.at(l.base.x, l.base.y, 0.5f, floor.mapColor); + Fx.unitLandSmall.at(l.base.x, l.base.y, type.rippleScale, floor.mapColor); } //shake when legs contact ground if(type.landShake > 0){ - Effects.shake(type.landShake, type.landShake, this); + Effects.shake(type.landShake, type.landShake, l.base); + } + + if(type.legSplashDamage > 0){ + Damage.damage(team(), l.base.x, l.base.y, type.legSplashRange, type.legSplashDamage, false, true); } } + + l.group = group; } - lastGroup = group; - } - - float movespace = 360f / legs.length / 4f; - float trns = vel().len() * 12.5f * div/1.5f * type.legTrns; - - //rotation + offset vector - Tmp.v4.trns(rot, trns); - - for(int i = 0; i < legs.length; i++){ - float dstRot = legAngle(rot, i); - float rot2 = Angles.moveToward(dstRot, rot + (Angles.angleDist(dstRot, rot) < 90f ? 180f : 0), movespace); - - Leg l = legs[i]; - //leg destination - Tmp.v1.trns(dstRot, legLength + type.legBaseOffset).add(x, y).add(Tmp.v4); + Vec2 legDest = Tmp.v1.trns(dstRot, legLength * type.legLengthScl).add(baseOffset).add(moveOffset); //join destination - Tmp.v2.trns(rot2, legLength / 2f + type.legBaseOffset).add(x, y).add(Tmp.v4); + Vec2 jointDest = Tmp.v2;//.trns(rot2, legLength / 2f + type.legBaseOffset).add(moveOffset); + InverseKinematics.solve(legLength/2f, legLength/2f, Tmp.v6.set(l.base).sub(baseOffset), side, jointDest); + jointDest.add(baseOffset); + //lerp between kinematic and linear + jointDest.lerp(Tmp.v6.set(baseOffset).lerp(l.base, 0.5f), 1f - type.kinematicScl); - if(i % div == group){ - l.base.lerpDelta(Tmp.v1, moveSpeed); - l.joint.lerpDelta(Tmp.v2, moveSpeed / 4f); + if(move){ + float moveFract = stageF % 1f; + + l.base.lerpDelta(legDest, moveFract); + l.joint.lerpDelta(jointDest, moveFract / 2f); } - l.joint.lerpDelta(Tmp.v2, moveSpeed / 4f); + l.joint.lerpDelta(jointDest, moveSpeed / 4f); } } @@ -108,14 +128,4 @@ abstract class LegsComp implements Posc, Rotc, Hitboxc, Flyingc, Unitc, Elevatio return rotation + 360f / legs.length * index + (360f / legs.length / 2f); } - /* - @Replace - public boolean isGrounded(){ - return true; - } - - @Replace - public boolean isFlying(){ - return false; - }*/ } diff --git a/core/src/mindustry/entities/comp/MinerComp.java b/core/src/mindustry/entities/comp/MinerComp.java index dff81a95a1..eca9ef3ef6 100644 --- a/core/src/mindustry/entities/comp/MinerComp.java +++ b/core/src/mindustry/entities/comp/MinerComp.java @@ -94,7 +94,7 @@ abstract class MinerComp implements Itemsc, Posc, Teamc, Rotc, Drawc{ Draw.color(Color.lightGray, Color.white, 1f - flashScl + Mathf.absin(Time.time(), 0.5f, flashScl)); - Drawf.laser(Core.atlas.find("minelaser"), Core.atlas.find("minelaser-end"), px, py, ex, ey, 0.75f); + Drawf.laser(team(), Core.atlas.find("minelaser"), Core.atlas.find("minelaser-end"), px, py, ex, ey, 0.75f); //TODO hack? if(isLocal()){ diff --git a/core/src/mindustry/entities/comp/PayloadComp.java b/core/src/mindustry/entities/comp/PayloadComp.java index 3a02a6ae25..fafbc99532 100644 --- a/core/src/mindustry/entities/comp/PayloadComp.java +++ b/core/src/mindustry/entities/comp/PayloadComp.java @@ -15,7 +15,7 @@ import mindustry.world.blocks.payloads.*; abstract class PayloadComp implements Posc, Rotc{ @Import float x, y, rotation; - Array payloads = new Array<>(); + Seq payloads = new Seq<>(); boolean hasPayload(){ return payloads.size > 0; diff --git a/core/src/mindustry/entities/comp/PlayerComp.java b/core/src/mindustry/entities/comp/PlayerComp.java index 99248a0d14..63d27a8e95 100644 --- a/core/src/mindustry/entities/comp/PlayerComp.java +++ b/core/src/mindustry/entities/comp/PlayerComp.java @@ -54,6 +54,10 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra return state.teams.closestCore(x(), y(), team); } + public @Nullable CoreEntity core(){ + return team.core(); + } + public void reset(){ team = state.rules.defaultTeam; admin = typing = false; @@ -87,8 +91,7 @@ abstract class PlayerComp implements UnitController, Entityc, Syncc, Timerc, Dra CoreEntity core = closestCore(); if(!dead()){ - x(unit.x()); - y(unit.y()); + set(unit); unit.team(team); deathTimer = 0; diff --git a/core/src/mindustry/entities/comp/PuddleComp.java b/core/src/mindustry/entities/comp/PuddleComp.java index 531edba276..909d074f19 100644 --- a/core/src/mindustry/entities/comp/PuddleComp.java +++ b/core/src/mindustry/entities/comp/PuddleComp.java @@ -8,13 +8,14 @@ import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.world.*; -import static mindustry.Vars.world; -import static mindustry.entities.Puddles.maxLiquid; +import static mindustry.Vars.*; +import static mindustry.entities.Puddles.*; @EntityDef(value = {Puddlec.class}, pooled = true) @Component @@ -73,7 +74,7 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{ unit.apply(liquid.effect, 60 * 2); if(unit.vel().len() > 0.1){ - Fx.ripple.at(unit.x(), unit.y(), liquid.color); + Fx.ripple.at(unit.x(), unit.y(), unit.type().rippleScale, liquid.color); } } } @@ -111,7 +112,7 @@ abstract class PuddleComp implements Posc, Puddlec, Drawc{ if(liquid.lightColor.a > 0.001f && f > 0){ Color color = liquid.lightColor; float opacity = color.a * f; - Drawf.light(tile.drawx(), tile.drawy(), 30f * f, color, opacity * 0.8f); + Drawf.light(Team.derelict, tile.drawx(), tile.drawy(), 30f * f, color, opacity * 0.8f); } } diff --git a/core/src/mindustry/entities/comp/StatusComp.java b/core/src/mindustry/entities/comp/StatusComp.java index e5b62135ec..53cefee8fd 100644 --- a/core/src/mindustry/entities/comp/StatusComp.java +++ b/core/src/mindustry/entities/comp/StatusComp.java @@ -17,7 +17,7 @@ import static mindustry.Vars.content; @Component abstract class StatusComp implements Posc, Flyingc{ - private Array statuses = new Array<>(); + private Seq statuses = new Seq<>(); private transient Bits applied = new Bits(content.getBy(ContentType.status).size); @ReadOnly transient float speedMultiplier, damageMultiplier, armorMultiplier; diff --git a/core/src/mindustry/entities/comp/TeamComp.java b/core/src/mindustry/entities/comp/TeamComp.java index 393b6158da..9f6791002d 100644 --- a/core/src/mindustry/entities/comp/TeamComp.java +++ b/core/src/mindustry/entities/comp/TeamComp.java @@ -13,6 +13,14 @@ abstract class TeamComp implements Posc{ Team team = Team.derelict; + public boolean cheating(){ + return team.rules().cheat; + } + + public @Nullable Tilec core(){ + return team.core(); + } + public @Nullable Tilec closestCore(){ return state.teams.closestCore(x, y, team); } diff --git a/core/src/mindustry/entities/comp/TileComp.java b/core/src/mindustry/entities/comp/TileComp.java index 039469162e..7f3f938c1b 100644 --- a/core/src/mindustry/entities/comp/TileComp.java +++ b/core/src/mindustry/entities/comp/TileComp.java @@ -9,6 +9,7 @@ import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; import arc.math.geom.QuadTree.*; +import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; @@ -17,7 +18,6 @@ import arc.util.io.*; import mindustry.annotations.Annotations.*; import mindustry.audio.*; import mindustry.content.*; -import mindustry.ctype.*; import mindustry.entities.*; import mindustry.game.EventType.*; import mindustry.game.*; @@ -37,12 +37,12 @@ import static mindustry.Vars.*; @EntityDef(value = {Tilec.class}, isFinal = false, genio = false, serialize = false) @Component -abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTreeObject{ +abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTreeObject, Displayable{ //region vars and initialization static final float timeToSleep = 60f * 1; static final ObjectSet tmpTiles = new ObjectSet<>(); - static final Array tempTileEnts = new Array<>(); - static final Array tempTiles = new Array<>(); + static final Seq tempTileEnts = new Seq<>(); + static final Seq tempTiles = new Seq<>(); static int sleepingEntities = 0; @Import float x, y, health; @@ -50,8 +50,9 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree transient Tile tile; transient Block block; - transient Array proximity = new Array<>(8); + transient Seq proximity = new Seq<>(8); transient boolean updateFlow; + transient byte dump; PowerModule power; ItemModule items; @@ -413,10 +414,10 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree * @return whether the payload was moved successfully */ public boolean dumpPayload(@NonNull Payload todump){ - int dump = tile.data; - if(proximity.size == 0) return false; + int dump = this.dump; + for(int i = 0; i < proximity.size; i++){ Tilec other = proximity.get((i + dump) % proximity.size); @@ -449,7 +450,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree } public void dumpLiquid(Liquid liquid){ - int dump = tile.data; + int dump = this.dump; for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); @@ -548,9 +549,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree * containers, it gets added to the block's inventory. */ public void offload(Item item){ - Array proximity = proximity(); - int dump = tile.data; - useContent(item); + int dump = this.dump; for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); @@ -568,9 +567,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree * Tries to put this item into a nearby container. Returns success. Unlike #offload(), this method does not change the block inventory. */ public boolean put(Item item){ - Array proximity = proximity(); - int dump = tile.data; - useContent(item); + int dump = this.dump; for(int i = 0; i < proximity.size; i++){ incrementDump(proximity.size); @@ -596,8 +593,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree public boolean dump(Item todump){ if(!block.hasItems || items.total() == 0 || (todump != null && !items.has(todump))) return false; - Array proximity = proximity(); - int dump = tile.data; + int dump = this.dump; if(proximity.size == 0) return false; @@ -632,7 +628,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree } public void incrementDump(int prox){ - tile.data = (byte)((tile.data + 1) % prox); + dump = (byte)((dump + 1) % prox); } /** Used for dumping items. */ @@ -683,11 +679,11 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree } } - public Array getPowerConnections(Array out){ + public Seq getPowerConnections(Seq out){ out.clear(); if(power == null) return out; - for(Tilec other : proximity()){ + for(Tilec other : proximity){ if(other != null && other.power() != null && !(block.consumesPower && other.block().consumesPower && !block.outputsPower && !other.block().outputsPower) && !power.links.contains(other.pos())){ @@ -745,6 +741,16 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree public void draw(){ Draw.rect(block.region, x, y, block.rotate ? rotdeg() : 0); + + drawTeamTop(); + } + + public void drawTeamTop(){ + if(block.teamRegion.found()){ + if(block.teamRegions[team.uid] == block.teamRegion) Draw.color(team.color); + Draw.rect(block.teamRegions[team.uid], x, y); + Draw.color(); + } } public void drawLight(){ @@ -759,13 +765,13 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree float fract = 1f; float opacity = color.a * fract; if(opacity > 0.001f){ - Drawf.light(x, y, block.size * 30f * fract, color, opacity); + Drawf.light(team, x, y, block.size * 30f * fract, color, opacity); } } } public void drawTeam(){ - Draw.color(team().color); + Draw.color(team.color); Draw.rect("block-border", x - block.size * tilesize / 2f + 4, y - block.size * tilesize / 2f + 4); Draw.color(); } @@ -789,7 +795,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree Geometry.circle(tileX(), tileY(), range, (x, y) -> { Tilec other = world.ent(x, y); if(other != null && other.block() instanceof PowerNode && ((PowerNode)other.block()).linkValid(other, this) && !PowerNode.insulated(other, this) && !other.proximity().contains(this) && - !(block.outputsPower && proximity().contains(p -> p.power() != null && p.power().graph == other.power().graph))){ + !(block.outputsPower && proximity.contains(p -> p.power() != null && p.power().graph == other.power().graph))){ tempTiles.add(other.tile()); } }); @@ -814,14 +820,6 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree public void unitRemoved(Unitc unit){ } - /** Call when some content is produced. This unlocks the content if it is applicable. */ - public void useContent(UnlockableContent content){ - //only unlocks content in zones - if(!headless && team() == player.team() && state.isCampaign()){ - logic.handleContent(content); - } - } - /** Called when arbitrary configuration is applied to a tile. */ public void configured(@Nullable Playerc player, @Nullable Object value){ //null is of type void.class; anonymous classes use their superclass. @@ -911,7 +909,18 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree return block.icon(Cicon.medium); } + @Override public void display(Table table){ + //display the block stuff + //TODO duplicated code? + table.table(t -> { + t.left(); + t.add(new Image(block.getDisplayIcon(tile))).size(8 * 4); + t.labelWrap(block.getDisplayName(tile)).left().width(190f).padLeft(5); + }).growX().left(); + + table.row(); + table.table(bars -> { bars.defaults().growX().height(18f).pad(4); @@ -927,12 +936,13 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree if(items != null){ table.row(); + table.left(); table.table(l -> { Bits current = new Bits(); - l.left(); Runnable rebuild = () -> { l.clearChildren(); + l.left(); for(Item item : content.items()){ if(items.hasFlowItem(item)){ l.image(item.icon(Cicon.small)).padRight(3f); @@ -951,7 +961,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree } } }); - }); + }).left(); } if(liquids != null){ @@ -995,7 +1005,7 @@ abstract class TileComp implements Posc, Teamc, Healthc, Tilec, Timerc, QuadTree /** Returns whether or not a hand cursor should be shown over this block. */ public Cursor getCursor(){ - return block.configurable && tile.team() == player.team() ? SystemCursor.hand : SystemCursor.arrow; + return block.configurable ? SystemCursor.hand : SystemCursor.arrow; } /** diff --git a/core/src/mindustry/entities/comp/UnitComp.java b/core/src/mindustry/entities/comp/UnitComp.java index bdc4e15ce4..c125cdb984 100644 --- a/core/src/mindustry/entities/comp/UnitComp.java +++ b/core/src/mindustry/entities/comp/UnitComp.java @@ -3,8 +3,9 @@ package mindustry.entities.comp; import arc.*; import arc.math.*; import arc.math.geom.*; -import arc.util.*; +import arc.scene.ui.layout.*; import arc.util.ArcAnnotate.*; +import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; @@ -13,13 +14,14 @@ import mindustry.game.EventType.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; +import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; @Component -abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc{ +abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, Itemsc, Rotc, Unitc, Weaponsc, Drawc, Boundedc, Syncc, Shieldc, Displayable{ @Import float x, y, rotation, elevation, maxHealth, drag, armor; @@ -187,6 +189,11 @@ abstract class UnitComp implements Healthc, Physicsc, Hitboxc, Statusc, Teamc, I } } + @Override + public void display(Table table){ + type.display(this, table); + } + @Override public boolean isImmune(StatusEffect effect){ return type.immunities.contains(effect); diff --git a/core/src/mindustry/entities/comp/WeaponsComp.java b/core/src/mindustry/entities/comp/WeaponsComp.java index 03bb238722..9eebad693f 100644 --- a/core/src/mindustry/entities/comp/WeaponsComp.java +++ b/core/src/mindustry/entities/comp/WeaponsComp.java @@ -10,11 +10,13 @@ import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.type.*; +import static mindustry.Vars.*; + @Component abstract class WeaponsComp implements Teamc, Posc, Rotc{ @Import float x, y, rotation; - /** minimum cursor distance from player, fixes 'cross-eyed' shooting */ + /** minimum cursor distance from unit, fixes 'cross-eyed' shooting */ static final float minAimDst = 20f; /** temporary weapon sequence number */ static int sequenceNum = 0; @@ -24,6 +26,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc{ @ReadOnly transient float range, aimX, aimY; @ReadOnly transient boolean isRotate; boolean isShooting; + int ammo; void setWeaponRotation(float rotation){ for(WeaponMount mount : mounts){ @@ -94,7 +97,7 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc{ mount.targetRotation = angleTo(mount.aimX, mount.aimY); } - if(mount.shoot){ + if(mount.shoot && (ammo > 0 || !state.rules.unitAmmo || team().rules().infiniteAmmo)){ float rotation = this.rotation - 90; //shoot if applicable @@ -115,12 +118,16 @@ abstract class WeaponsComp implements Teamc, Posc, Rotc{ if(mount.weapon.mirror) mount.side = !mount.side; mount.reload = weapon.reload; + + ammo --; + if(ammo < 0) ammo = 0; } } } } private void shoot(Weapon weapon, float x, float y, float aimX, float aimY, float rotation, int side){ + float baseX = this.x, baseY = this.y; weapon.shootSound.at(x, y, Mathf.random(0.8f, 1.0f)); diff --git a/core/src/mindustry/entities/units/BuildRequest.java b/core/src/mindustry/entities/units/BuildPlan.java similarity index 89% rename from core/src/mindustry/entities/units/BuildRequest.java rename to core/src/mindustry/entities/units/BuildPlan.java index 621871efb7..af7d760219 100644 --- a/core/src/mindustry/entities/units/BuildRequest.java +++ b/core/src/mindustry/entities/units/BuildPlan.java @@ -8,7 +8,7 @@ import mindustry.world.*; import static mindustry.Vars.*; /** Class for storing build requests. Can be either a place or remove request. */ -public class BuildRequest{ +public class BuildPlan{ /** Position and rotation of this request. */ public int x, y, rotation; /** Block being placed. If null, this is a breaking request.*/ @@ -31,7 +31,7 @@ public class BuildRequest{ public float animScale = 0f; /** This creates a build request. */ - public BuildRequest(int x, int y, int rotation, Block block){ + public BuildPlan(int x, int y, int rotation, Block block){ this.x = x; this.y = y; this.rotation = rotation; @@ -40,7 +40,7 @@ public class BuildRequest{ } /** This creates a remove request. */ - public BuildRequest(int x, int y){ + public BuildPlan(int x, int y){ this.x = x; this.y = y; this.rotation = -1; @@ -48,7 +48,7 @@ public class BuildRequest{ this.breaking = true; } - public BuildRequest(){ + public BuildPlan(){ } @@ -74,8 +74,8 @@ public class BuildRequest{ this.config = pointConfig(this.config, cons); } - public BuildRequest copy(){ - BuildRequest copy = new BuildRequest(); + public BuildPlan copy(){ + BuildPlan copy = new BuildPlan(); copy.x = x; copy.y = y; copy.rotation = rotation; @@ -91,7 +91,7 @@ public class BuildRequest{ return copy; } - public BuildRequest original(int x, int y, int originalWidth, int originalHeight){ + public BuildPlan original(int x, int y, int originalWidth, int originalHeight){ originalX = x; originalY = y; this.originalWidth = originalWidth; @@ -107,7 +107,7 @@ public class BuildRequest{ } } - public BuildRequest set(int x, int y, int rotation, Block block){ + public BuildPlan set(int x, int y, int rotation, Block block){ this.x = x; this.y = y; this.rotation = rotation; @@ -124,7 +124,7 @@ public class BuildRequest{ return y*tilesize + block.offset(); } - public BuildRequest configure(Object config){ + public BuildPlan configure(Object config){ this.config = config; this.hasConfig = true; return this; diff --git a/core/src/mindustry/game/DefaultWaves.java b/core/src/mindustry/game/DefaultWaves.java index 82fddd3a62..eac0714591 100644 --- a/core/src/mindustry/game/DefaultWaves.java +++ b/core/src/mindustry/game/DefaultWaves.java @@ -1,15 +1,15 @@ package mindustry.game; -import arc.struct.Array; +import arc.struct.Seq; import mindustry.content.*; import mindustry.type.ItemStack; public class DefaultWaves{ - private Array spawns; + private Seq spawns; - public Array get(){ + public Seq get(){ if(spawns == null && UnitTypes.dagger != null){ - spawns = Array.with( + spawns = Seq.with( new SpawnGroup(UnitTypes.dagger){{ end = 10; unitScaling = 2f; @@ -35,7 +35,7 @@ public class DefaultWaves{ max = 4; }}, - new SpawnGroup(UnitTypes.titan){{ + new SpawnGroup(UnitTypes.mace){{ begin = 7; spacing = 3; unitScaling = 2; @@ -50,21 +50,21 @@ public class DefaultWaves{ spacing = 2; }}, - new SpawnGroup(UnitTypes.titan){{ + new SpawnGroup(UnitTypes.mace){{ begin = 28; spacing = 3; unitScaling = 1; end = 40; }}, - new SpawnGroup(UnitTypes.titan){{ + new SpawnGroup(UnitTypes.mace){{ begin = 45; spacing = 3; unitScaling = 2; effect = StatusEffects.overdrive; }}, - new SpawnGroup(UnitTypes.titan){{ + new SpawnGroup(UnitTypes.mace){{ begin = 120; spacing = 2; unitScaling = 3; @@ -186,6 +186,6 @@ public class DefaultWaves{ }} ); } - return spawns == null ? new Array<>() : spawns; + return spawns == null ? new Seq<>() : spawns; } } diff --git a/core/src/mindustry/game/Gamemode.java b/core/src/mindustry/game/Gamemode.java index 55bd7e0249..9de5e71052 100644 --- a/core/src/mindustry/game/Gamemode.java +++ b/core/src/mindustry/game/Gamemode.java @@ -21,6 +21,10 @@ public enum Gamemode{ rules.attackMode = true; rules.waves = true; rules.waveTimer = true; + + rules.waveSpacing /= 2f; + rules.teams.get(rules.waveTeam).ai = true; + rules.teams.get(rules.waveTeam).infiniteResources = true; }, map -> map.teams.contains(state.rules.waveTeam.id)), pvp(rules -> { rules.pvp = true; diff --git a/core/src/mindustry/game/GlobalData.java b/core/src/mindustry/game/GlobalData.java deleted file mode 100644 index a10e91486b..0000000000 --- a/core/src/mindustry/game/GlobalData.java +++ /dev/null @@ -1,183 +0,0 @@ -package mindustry.game; - -import arc.*; -import arc.files.*; -import arc.math.*; -import arc.struct.*; -import arc.util.io.*; -import mindustry.*; -import mindustry.content.*; -import mindustry.ctype.*; -import mindustry.game.EventType.*; -import mindustry.type.*; - -import java.io.*; -import java.util.zip.*; - -import static mindustry.Vars.*; - -/** Stores player unlocks. Clientside only. */ -public class GlobalData{ - private ObjectSet unlocked = new ObjectSet<>(); - private ObjectIntMap items = new ObjectIntMap<>(); - private boolean modified; - - public void exportData(Fi file) throws IOException{ - Array files = new Array<>(); - files.add(Core.settings.getSettingsFile()); - files.addAll(customMapDirectory.list()); - files.addAll(saveDirectory.list()); - files.addAll(screenshotDirectory.list()); - files.addAll(modDirectory.list()); - files.addAll(schematicDirectory.list()); - String base = Core.settings.getDataDirectory().path(); - - try(OutputStream fos = file.write(false, 2048); ZipOutputStream zos = new ZipOutputStream(fos)){ - for(Fi add : files){ - if(add.isDirectory()) continue; - zos.putNextEntry(new ZipEntry(add.path().substring(base.length()))); - Streams.copy(add.read(), zos); - zos.closeEntry(); - } - } - } - - public void importData(Fi file){ - Fi dest = Core.files.local("zipdata.zip"); - file.copyTo(dest); - Fi zipped = new ZipFi(dest); - - Fi base = Core.settings.getDataDirectory(); - if(!zipped.child("settings.bin").exists()){ - throw new IllegalArgumentException("Not valid save data."); - } - - //purge existing tmp data, keep everything else - tmpDirectory.deleteDirectory(); - - zipped.walk(f -> f.copyTo(base.child(f.path()))); - dest.delete(); - } - - public void modified(){ - modified = true; - } - - public int getItem(Item item){ - return items.get(item, 0); - } - - public void addItem(Item item, int amount){ - if(amount > 0){ - unlockContent(item); - } - amount = Math.max(amount, 0); - - items.getAndIncrement(item, 0, amount); - state.stats.itemsDelivered.getAndIncrement(item, 0, amount); - - //clamp to capacity - items.put(item, Mathf.clamp(items.get(item), 0, getItemCapacity())); - - //clamp overflow - if(state.stats.itemsDelivered.get(item, 0) < 0) state.stats.itemsDelivered.put(item, Integer.MAX_VALUE); - - modified = true; - } - - public boolean hasItems(Array stacks){ - return !stacks.contains(s -> items.get(s.item, 0) < s.amount); - } - - public boolean hasItems(ItemStack[] stacks){ - for(ItemStack stack : stacks){ - if(!has(stack.item, stack.amount)){ - return false; - } - } - - return true; - } - - public void removeItems(ItemStack[] stacks){ - for(ItemStack stack : stacks){ - remove(stack.item, stack.amount); - } - } - - public void removeItems(Array stacks){ - for(ItemStack stack : stacks){ - remove(stack.item, stack.amount); - } - } - - public void remove(Item item, int amount){ - items.getAndIncrement(item, 0, -amount); - - modified = true; - } - - public boolean has(Item item, int amount){ - return items.get(item, 0) >= amount; - } - - //TODO: make it upgradeable - public int getItemCapacity(){ - return 10000; - } - - /** Returns whether or not this piece of content is unlocked yet. */ - public boolean isUnlocked(UnlockableContent content){ - return content.alwaysUnlocked || unlocked.contains(content.name); - } - - /** - * Makes this piece of content 'unlocked', if possible. - * If this piece of content is already unlocked, nothing changes. - * Results are not saved until you call {@link #save()}. - */ - public void unlockContent(UnlockableContent content){ - if(content.alwaysUnlocked) return; - - //fire unlock event so other classes can use it - if(unlocked.add(content.name)){ - modified = true; - content.onUnlock(); - Events.fire(new UnlockEvent(content)); - } - } - - /** Clears all unlocked content. Automatically saves. */ - public void reset(){ - save(); - } - - public void checkSave(){ - if(modified){ - save(); - modified = false; - } - } - - @SuppressWarnings("unchecked") - public void load(){ - items.clear(); - unlocked = Core.settings.getJson("unlocked-content", ObjectSet.class, ObjectSet::new); - for(Item item : Vars.content.items()){ - items.put(item, Core.settings.getInt("item-" + item.name, 0)); - } - - //set up default values - if(!Core.settings.has("item-" + Items.copper.name)){ - addItem(Items.copper, 50); - } - } - - public void save(){ - Core.settings.putJson("unlocked-content", String.class, unlocked); - for(Item item : Vars.content.items()){ - Core.settings.put("item-" + item.name, items.get(item, 0)); - } - } - -} diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index a4f2921eb3..f41a5bc6e0 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -3,6 +3,8 @@ package mindustry.game; import arc.graphics.*; import arc.struct.*; import arc.util.ArcAnnotate.*; +import arc.util.serialization.*; +import arc.util.serialization.Json.*; import mindustry.content.*; import mindustry.io.*; import mindustry.type.*; @@ -14,28 +16,40 @@ import mindustry.world.*; * Does not store game state, just configuration. */ public class Rules{ - /** Whether the player team has infinite resources. */ + /** Sandbox mode: Enables infinite resources, build range and build speed. */ public boolean infiniteResources; + /** Team-specific rules. */ + public TeamRules teams = new TeamRules(); /** Whether the waves come automatically on a timer. If not, waves come when the play button is pressed. */ public boolean waveTimer = true; /** Whether waves are spawnable at all. */ public boolean waves; - /** Whether the enemy AI has infinite resources in most of their buildings and turrets. */ - public boolean enemyCheat; - /** Whether the enemy AI has infinite resources in their core only. TODO remove */ - public boolean enemyInfiniteResources = true; /** Whether the game objective is PvP. Note that this enables automatic hosting. */ public boolean pvp; + /** Whether to pause the wave timer until all enemies are destroyed. */ + public boolean waitEnemies = false; + /** Determinates if gamemode is attack mode */ + public boolean attackMode = false; + /** Whether this is the editor gamemode. */ + public boolean editor = false; + /** Whether the tutorial is enabled. False by default. */ + public boolean tutorial = false; + /** Whether a gameover can happen at all. Set this to false to implement custom gameover conditions. */ + public boolean canGameOver = true; /** Whether reactors can explode and damage other blocks. */ public boolean reactorExplosions = true; + /** Whether units use and require ammo. */ + public boolean unitAmmo = false; /** How fast unit pads build units. */ public float unitBuildSpeedMultiplier = 1f; /** How much health units start with. */ public float unitHealthMultiplier = 1f; - /** How much health blocks start with. */ - public float blockHealthMultiplier = 1f; /** How much damage any other units deal. */ public float unitDamageMultiplier = 1f; + /** How much health blocks start with. */ + public float blockHealthMultiplier = 1f; + /** How much damage blocks (turrets) deal. */ + public float blockDamageMultiplier = 1f; /** Multiplier for buildings resource cost. */ public float buildCostMultiplier = 1f; /** Multiplier for building speed. */ @@ -48,39 +62,27 @@ public class Rules{ public float dropZoneRadius = 300f; /** Time between waves in ticks. */ public float waveSpacing = 60 * 60 * 2; - /** How many times longer a boss wave takes. */ - public float bossWaveMultiplier = 3f; /** 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. */ public int unitCap = 0; /** Sector for saves that have them.*/ public @Nullable Sector sector; /** Spawn layout. */ - public Array spawns = new Array<>(); - /** Whether to pause the wave timer until all enemies are destroyed. */ - public boolean waitEnemies = false; - /** Determinates if gamemode is attack mode */ - public boolean attackMode = false; - /** Whether this is the editor gamemode. */ - public boolean editor = false; - /** Whether the tutorial is enabled. False by default. */ - public boolean tutorial = false; - /** Whether a gameover can happen at all. Set this to false to implement custom gameover conditions. */ - public boolean canGameOver = true; - /** Whether to draw shadows of blocks at map edges and static blocks. - * Do not change unless you know exactly what you are doing.*/ - public boolean drawDarkness = true; - /** EXPERIMENTAL building AI. TODO remove */ - public boolean buildAI = true; + public Seq spawns = new Seq<>(); /** Starting items put in cores */ - public Array loadout = Array.with(ItemStack.with(Items.copper, 100)); + public Seq loadout = ItemStack.list(Items.copper, 100); /** Weather events that occur here. */ - public Array weather = new Array<>(1); + public Seq weather = new Seq<>(1); /** Blocks that cannot be placed. */ public ObjectSet bannedBlocks = new ObjectSet<>(); - /** Whether everything is dark. Enables lights. Experimental. */ + /** Whether ambient lighting is enabled. */ public boolean lighting = false; + /** Whether enemy lighting is visible. + * If lighting is enabled and this is false, a fog-of-war effect is partially achieved. */ + 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. @@ -93,7 +95,21 @@ public class Rules{ /** special tags for additional info */ public StringMap tags = new StringMap(); - /** Copies this ruleset exactly. Not very efficient at all, do not use often. */ + /** A team-specific ruleset. */ + public static class TeamRule{ + /** Whether to use building AI. */ + public boolean ai; + /** TODO Tier of blocks/designs that the AI uses for building. [0, 1]*/ + public float aiTier = 0f; + /** If true, blocks don't require power or resources. */ + public boolean cheat; + /** If true, resources are not consumed when building. */ + public boolean infiniteResources; + /** If true, this team has infinite unit ammo. */ + public boolean infiniteAmmo; + } + + /** Copies this ruleset exactly. Not efficient at all, do not use often. */ public Rules copy(){ return JsonIO.copy(this); } @@ -112,4 +128,31 @@ public class Rules{ return Gamemode.survival; } } + + /** A simple map for storing TeamRules in an efficient way without hashing. */ + public static class TeamRules implements Serializable{ + final TeamRule[] values = new TeamRule[Team.all.length]; + + public TeamRule get(Team team){ + TeamRule out = values[team.uid]; + if(out == null) values[team.uid] = (out = new TeamRule()); + return out; + } + + @Override + public void write(Json json){ + for(Team team : Team.all){ + if(values[team.uid] != null){ + json.writeValue(team.uid + "", values[team.uid], TeamRule.class); + } + } + } + + @Override + public void read(Json json, JsonValue jsonData){ + for(JsonValue value : jsonData){ + values[Integer.parseInt(value.name)] = json.readValue(TeamRule.class, value); + } + } + } } diff --git a/core/src/mindustry/game/Saves.java b/core/src/mindustry/game/Saves.java index 8c521c534f..c54107b646 100644 --- a/core/src/mindustry/game/Saves.java +++ b/core/src/mindustry/game/Saves.java @@ -23,7 +23,7 @@ import java.util.*; import static mindustry.Vars.*; public class Saves{ - private Array saves = new Array<>(); + private Seq saves = new Seq<>(); private @Nullable SaveSlot current; private @Nullable SaveSlot lastSectorSave; private AsyncExecutor previewExecutor = new AsyncExecutor(1); @@ -160,7 +160,7 @@ public class Saves{ return file; } - public Array getSaveSlots(){ + public Seq getSaveSlots(){ return saves; } @@ -259,7 +259,7 @@ public class Saves{ } public void cautiousLoad(Runnable run){ - Array mods = Array.with(getMods()); + Seq mods = Seq.with(getMods()); mods.removeAll(Vars.mods.getModStrings()); if(!mods.isEmpty()){ diff --git a/core/src/mindustry/game/Schematic.java b/core/src/mindustry/game/Schematic.java index f573c8d029..7c33b2726b 100644 --- a/core/src/mindustry/game/Schematic.java +++ b/core/src/mindustry/game/Schematic.java @@ -14,21 +14,21 @@ import mindustry.world.blocks.storage.*; import static mindustry.Vars.*; public class Schematic implements Publishable, Comparable{ - public final Array tiles; + public final Seq tiles; public StringMap tags; public int width, height; public @Nullable Fi file; /** Associated mod. If null, no mod is associated with this schematic. */ public @Nullable LoadedMod mod; - public Schematic(Array tiles, @NonNull StringMap tags, int width, int height){ + public Schematic(Seq tiles, @NonNull StringMap tags, int width, int height){ this.tiles = tiles; this.tags = tags; this.width = width; this.height = height; } - public Array requirements(){ + public Seq requirements(){ IntIntMap amounts = new IntIntMap(); tiles.each(t -> { @@ -36,7 +36,7 @@ public class Schematic implements Publishable, Comparable{ amounts.getAndIncrement(stack.item.id, 0, stack.amount); } }); - Array stacks = new Array<>(); + Seq stacks = new Seq<>(); for(Entry ent : amounts.entries()){ stacks.add(new ItemStack(Vars.content.item(ent.key), ent.value)); } diff --git a/core/src/mindustry/game/Schematics.java b/core/src/mindustry/game/Schematics.java index 4d74a13dae..15aa953a20 100644 --- a/core/src/mindustry/game/Schematics.java +++ b/core/src/mindustry/game/Schematics.java @@ -40,8 +40,8 @@ import static mindustry.Vars.*; /** Handles schematics.*/ public class Schematics implements Loadable{ - private static final Schematic tmpSchem = new Schematic(new Array<>(), new StringMap(), 0, 0); - private static final Schematic tmpSchem2 = new Schematic(new Array<>(), new StringMap(), 0, 0); + private static final Schematic tmpSchem = new Schematic(new Seq<>(), new StringMap(), 0, 0); + private static final Schematic tmpSchem2 = new Schematic(new Seq<>(), new StringMap(), 0, 0); public static final String base64Header = "bXNjaAB"; private static final byte[] header = {'m', 's', 'c', 'h'}; @@ -52,7 +52,7 @@ public class Schematics implements Loadable{ private static final int resolution = 32; private OptimizedByteArrayOutputStream out = new OptimizedByteArrayOutputStream(1024); - private Array all = new Array<>(); + private Seq all = new Seq<>(); private OrderedMap previews = new OrderedMap<>(); private ObjectSet errored = new ObjectSet<>(); private FrameBuffer shadowBuffer; @@ -155,7 +155,7 @@ public class Schematics implements Loadable{ return null; } - public Array all(){ + public Seq all(){ return all; } @@ -199,7 +199,7 @@ public class Schematics implements Loadable{ //dispose unneeded previews to prevent memory outage errors. //only runs every 2 seconds if(mobile && Time.timeSinceMillis(lastClearTime) > 1000 * 2 && previews.size > maxPreviewsMobile){ - Array keys = previews.orderedKeys().copy(); + Seq keys = previews.orderedKeys().copy(); for(int i = 0; i < previews.size - maxPreviewsMobile; i++){ //dispose and remove unneeded previews previews.get(keys.get(i)).dispose(); @@ -246,7 +246,7 @@ public class Schematics implements Loadable{ Draw.rect(Tmp.tr1, buffer.getWidth()/2f, buffer.getHeight()/2f, buffer.getWidth(), -buffer.getHeight()); Draw.color(); - Array requests = schematic.tiles.map(t -> new BuildRequest(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).configure(t.config)); Draw.flush(); //scale each request to fit schematic @@ -276,9 +276,9 @@ public class Schematics implements Loadable{ } /** Creates an array of build requests from a schematic's data, centered on the provided x+y coordinates. */ - public Array toRequests(Schematic schem, int x, int y){ - return schem.tiles.map(t -> new BuildRequest(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)) - .removeAll(s -> !s.block.isVisible() || !s.block.unlockedCur()); + 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)) + .removeAll(s -> !s.block.isVisible() || !s.block.unlockedNow()); } /** Adds a schematic to the list, also copying it into the files.*/ @@ -318,7 +318,7 @@ public class Schematics implements Loadable{ int ox = x, oy = y, ox2 = x2, oy2 = y2; - Array tiles = new Array<>(); + Seq tiles = new Seq<>(); int minx = x2, miny = y2, maxx = x, maxy = y; boolean found = false; @@ -344,7 +344,7 @@ public class Schematics implements Loadable{ x2 = maxx; y2 = maxy; }else{ - return new Schematic(new Array<>(), new StringMap(), 1, 1); + return new Schematic(new Seq<>(), new StringMap(), 1, 1); } int width = x2 - x + 1, height = y2 - y + 1; @@ -466,7 +466,7 @@ public class Schematics implements Loadable{ } int total = stream.readInt(); - Array tiles = new Array<>(total); + Seq tiles = new Seq<>(total); for(int i = 0; i < total; i++){ Block block = blocks.get(stream.readByte()); int position = stream.readInt(); @@ -558,7 +558,7 @@ public class Schematics implements Loadable{ int ox = schem.width/2, oy = schem.height/2; schem.tiles.each(req -> { - req.config = BuildRequest.pointConfig(req.config, p -> { + req.config = BuildPlan.pointConfig(req.config, p -> { int cx = p.x, cy = p.y; int lx = cx; diff --git a/core/src/mindustry/game/Stats.java b/core/src/mindustry/game/Stats.java index 01744a7537..931baa4dcd 100644 --- a/core/src/mindustry/game/Stats.java +++ b/core/src/mindustry/game/Stats.java @@ -39,7 +39,7 @@ public class Stats{ //weigh used fractions float frac = 0f; - Array obtainable = Array.select(zone.data.resources, i -> i instanceof Item && ((Item)i).type == ItemType.material).as(); + Seq obtainable = Seq.select(zone.data.resources, i -> i instanceof Item && ((Item)i).type == ItemType.material).as(); for(Item item : obtainable){ frac += Mathf.clamp((float)itemsDelivered.get(item, 0) / capacity) / (float)obtainable.size; } diff --git a/core/src/mindustry/game/Team.java b/core/src/mindustry/game/Team.java index f49fea7494..278a603d24 100644 --- a/core/src/mindustry/game/Team.java +++ b/core/src/mindustry/game/Team.java @@ -6,6 +6,7 @@ import arc.math.*; import arc.struct.*; import arc.util.*; import arc.util.ArcAnnotate.*; +import mindustry.game.Rules.*; import mindustry.game.Teams.*; import mindustry.graphics.*; import mindustry.world.blocks.storage.CoreBlock.*; @@ -16,6 +17,8 @@ public class Team implements Comparable{ public final byte id; public final int uid; public final Color color; + public final Color[] palette; + public boolean hasPalette; public String name; /** All 256 registered teams. */ @@ -25,8 +28,10 @@ public class Team implements Comparable{ public final static Team derelict = new Team(0, "derelict", Color.valueOf("4d4e58")), - sharded = new Team(1, "sharded", Pal.accent.cpy()), - crux = new Team(2, "crux", Color.valueOf("f25555")), + sharded = new Team(1, "sharded", Pal.accent.cpy(), + Color.valueOf("ffd37f"), Color.valueOf("eab678"), Color.valueOf("d4816b")), + crux = new Team(2, "crux", Color.valueOf("f25555"), + Color.valueOf("fc8e6c"), Color.valueOf("f25555"), Color.valueOf("a04553")), green = new Team(3, "green", Color.valueOf("4dd98b")), purple = new Team(4, "purple", Color.valueOf("9a4bdf")), blue = new Team(5, "blue", Color.royal.cpy()); @@ -53,9 +58,29 @@ public class Team implements Comparable{ uid = us; if(us < 6) baseTeams[us] = this; all[us] = this; + + palette = new Color[3]; + palette[0] = color; + palette[1] = color.cpy().mul(0.75f); + palette[2] = color.cpy().mul(0.5f); } - public Array enemies(){ + /** Specifies a 3-color team palette. */ + protected Team(int id, String name, Color color, Color pal1, Color pal2, Color pal3){ + this(id, name, color); + + palette[0] = pal1; + palette[1] = pal2; + palette[2] = pal3; + hasPalette = true; + } + + /** @return the team-specific rules. */ + public TeamRule rules(){ + return state.rules.teams.get(this); + } + + public Seq enemies(){ return state.teams.enemiesOf(this); } @@ -75,7 +100,7 @@ public class Team implements Comparable{ return state.teams.areEnemies(this, other); } - public Array cores(){ + public Seq cores(){ return state.teams.cores(this); } diff --git a/core/src/mindustry/game/Teams.java b/core/src/mindustry/game/Teams.java index 60a534d9a8..fedfe2bb37 100644 --- a/core/src/mindustry/game/Teams.java +++ b/core/src/mindustry/game/Teams.java @@ -16,7 +16,7 @@ public class Teams{ /** Maps team IDs to team data. */ private TeamData[] map = new TeamData[256]; /** Active teams. */ - private Array active = new Array<>(); + private Seq active = new Seq<>(); public Teams(){ active.add(get(Team.crux)); @@ -38,7 +38,7 @@ public class Teams{ return Geometry.findClosest(x, y, get(team).cores); } - public Array enemiesOf(Team team){ + public Seq enemiesOf(Team team){ return get(team).enemies; } @@ -73,12 +73,12 @@ public class Teams{ return map[Pack.u(team.id)]; } - public Array playerCores(){ + public Seq playerCores(){ return get(state.rules.defaultTeam).cores; } /** Do not modify! */ - public Array cores(Team team){ + public Seq cores(Team team){ return get(team).cores; } @@ -98,7 +98,7 @@ public class Teams{ } /** Do not modify. */ - public Array getActive(){ + public Seq getActive(){ active.removeAll(t -> !t.active()); return active; } @@ -145,8 +145,8 @@ public class Teams{ } public class TeamData{ - public final Array cores = new Array<>(); - public final Array enemies = new Array<>(); + public final Seq cores = new Seq<>(); + public final Seq enemies = new Seq<>(); public final Team team; public final BaseAI ai; public Queue blocks = new Queue<>(); @@ -174,7 +174,7 @@ public class Teams{ /** @return whether this team is controlled by the AI and builds bases. */ public boolean hasAI(){ - return state.rules.attackMode && team == state.rules.waveTeam && state.rules.buildAI; + return state.rules.attackMode && team.rules().ai; } @Override diff --git a/core/src/mindustry/game/Tutorial.java b/core/src/mindustry/game/Tutorial.java index d89c48323a..d9f91623da 100644 --- a/core/src/mindustry/game/Tutorial.java +++ b/core/src/mindustry/game/Tutorial.java @@ -195,7 +195,7 @@ public class Tutorial{ protected String line = ""; protected final Func text; - protected Array sentences; + protected Seq sentences; protected final Boolp done; TutorialStage(Func text, Boolp done){ @@ -218,7 +218,7 @@ public class Tutorial{ void load(){ this.line = Core.bundle.has("tutorial." + name() + ".mobile") && mobile ? "tutorial." + name() + ".mobile" : "tutorial." + name(); - this.sentences = Array.select(Core.bundle.get(line).split("\n"), s -> !s.isEmpty()); + this.sentences = Seq.select(Core.bundle.get(line).split("\n"), s -> !s.isEmpty()); } /** called every frame when this stage is active.*/ diff --git a/core/src/mindustry/game/Universe.java b/core/src/mindustry/game/Universe.java index ce5a2813db..7cf7786382 100644 --- a/core/src/mindustry/game/Universe.java +++ b/core/src/mindustry/game/Universe.java @@ -13,7 +13,7 @@ import mindustry.type.*; import static mindustry.Vars.*; -/** Updates the campaign universe. Has no relevance to other gamemodes. */ +/** Updates and handles state of the campaign universe. Has no relevance to other gamemodes. */ public class Universe{ private long seconds; private float secondCounter; @@ -24,6 +24,7 @@ public class Universe{ load(); } + /** Update regardless of whether the player is in the campaign. */ public void updateGlobal(){ //currently only updates one solar system updatePlanet(Planets.sun); @@ -40,6 +41,7 @@ public class Universe{ } } + /** Update planet rotations, global time and relevant state. */ public void update(){ secondCounter += Time.delta() / 60f; @@ -119,9 +121,11 @@ public class Universe{ } //calculate passive item generation + //TODO make exports only update for sector with items + //TODO items should be added directly to cores! int[] exports = getTotalExports(); for(int i = 0; i < exports.length; i++){ - data.addItem(content.item(i), exports[i]); + //data.addItem(content.item(i), exports[i]); } Events.fire(new TurnEvent()); diff --git a/core/src/mindustry/graphics/BlockRenderer.java b/core/src/mindustry/graphics/BlockRenderer.java index 1a91d796fe..5a6b8d5208 100644 --- a/core/src/mindustry/graphics/BlockRenderer.java +++ b/core/src/mindustry/graphics/BlockRenderer.java @@ -26,14 +26,16 @@ public class BlockRenderer implements Disposable{ public final FloorRenderer floor = new FloorRenderer(); - private Array requests = new Array<>(false, initialRequests, Tile.class); + private Seq tileview = new Seq<>(false, initialRequests, Tile.class); + private Seq lightview = new Seq<>(false, initialRequests, Tile.class); private int lastCamX, lastCamY, lastRangeX, lastRangeY; private float brokenFade = 0f; private FrameBuffer shadows = new FrameBuffer(); - private FrameBuffer fog = new FrameBuffer(); - private Array outArray2 = new Array<>(); - private Array shadowEvents = new Array<>(); + private FrameBuffer dark = new FrameBuffer(); + private Seq outArray2 = new Seq<>(); + private Seq shadowEvents = new Seq<>(); + private IntSet processedEntities = new IntSet(); private boolean displayStatus = false; public BlockRenderer(){ @@ -42,7 +44,7 @@ public class BlockRenderer implements Disposable{ shadowEvents.clear(); lastCamY = lastCamX = -99; //invalidate camera position so blocks get updated - shadows.getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear); + shadows.getTexture().setFilter(TextureFilter.linear, TextureFilter.linear); shadows.resize(world.width(), world.height()); shadows.begin(); Core.graphics.clear(Color.white); @@ -60,11 +62,11 @@ public class BlockRenderer implements Disposable{ Draw.color(); shadows.end(); - fog.getTexture().setFilter(TextureFilter.Linear, TextureFilter.Linear); - fog.resize(world.width(), world.height()); - fog.begin(); + dark.getTexture().setFilter(TextureFilter.linear, TextureFilter.linear); + dark.resize(world.width(), world.height()); + dark.begin(); Core.graphics.clear(Color.white); - Draw.proj().setOrtho(0, 0, fog.getWidth(), fog.getHeight()); + Draw.proj().setOrtho(0, 0, dark.getWidth(), dark.getHeight()); for(Tile tile : world.tiles){ float darkness = world.getDarkness(tile.x, tile.y); @@ -77,7 +79,7 @@ public class BlockRenderer implements Disposable{ Draw.flush(); Draw.color(); - fog.end(); + dark.end(); }); Events.on(TileChangeEvent.class, event -> { @@ -95,18 +97,8 @@ public class BlockRenderer implements Disposable{ } public void drawDarkness(){ - float ww = world.width() * tilesize, wh = world.height() * tilesize; - float x = camera.position.x + tilesize / 2f, y = camera.position.y + tilesize / 2f; - float u = (x - camera.width / 2f) / ww, - v = (y - camera.height / 2f) / wh, - u2 = (x + camera.width / 2f) / ww, - v2 = (y + camera.height / 2f) / wh; - - Tmp.tr1.set(fog.getTexture()); - Tmp.tr1.set(u, v2, u2, v); - - Draw.shader(Shaders.fog); - Draw.rect(Tmp.tr1, camera.position.x, camera.position.y, camera.width, camera.height); + Draw.shader(Shaders.darkness); + Draw.fbo(dark, world.width(), world.height(), tilesize); Draw.shader(); } @@ -166,7 +158,7 @@ public class BlockRenderer implements Disposable{ Tmp.tr1.set(shadows.getTexture()); Tmp.tr1.set(u, v2, u2, v); - Draw.shader(Shaders.fog); + Draw.shader(Shaders.darkness); Draw.rect(Tmp.tr1, camera.position.x, camera.position.y, camera.width, camera.height); Draw.shader(); } @@ -185,7 +177,9 @@ public class BlockRenderer implements Disposable{ return; } - requests.clear(); + tileview.clear(); + lightview.clear(); + processedEntities.clear(); int minx = Math.max(avgx - rangex - expandr, 0); int miny = Math.max(avgy - rangey - expandr, 0); @@ -197,16 +191,24 @@ public class BlockRenderer implements Disposable{ boolean expanded = (Math.abs(x - avgx) > rangex || Math.abs(y - avgy) > rangey); Tile tile = world.rawTile(x, y); Block block = tile.block(); + //link to center + if(tile.entity != null) tile = tile.entity.tile(); - if(block != Blocks.air && tile.isCenter() && block.cacheLayer == CacheLayer.normal){ + if(block != Blocks.air && block.cacheLayer == CacheLayer.normal && (tile.entity == null || !processedEntities.contains(tile.entity.id()))){ if(block.expanded || !expanded){ - requests.add(tile); + tileview.add(tile); + if(tile.entity != null) processedEntities.add(tile.entity.id()); + } + + //lights are drawn even in the expanded range + if(tile.entity != null){ + lightview.add(tile); } if(tile.entity != null && tile.entity.power() != null && tile.entity.power().links.size > 0){ for(Tilec other : tile.entity.getPowerConnections(outArray2)){ if(other.block() instanceof PowerNode){ //TODO need a generic way to render connections! - requests.add(other.tile()); + tileview.add(other.tile()); } } } @@ -223,8 +225,9 @@ public class BlockRenderer implements Disposable{ public void drawBlocks(){ drawDestroyed(); - for(int i = 0; i < requests.size; i++){ - Tile tile = requests.items[i]; + //draw most tile stuff + for(int i = 0; i < tileview.size; i++){ + Tile tile = tileview.items[i]; Block block = tile.block(); Tilec entity = tile.entity; @@ -232,6 +235,7 @@ public class BlockRenderer implements Disposable{ if(block != Blocks.air){ block.drawBase(tile); + Draw.reset(); Draw.z(Layer.block); if(entity != null){ @@ -245,8 +249,6 @@ public class BlockRenderer implements Disposable{ Draw.z(Layer.block); } - entity.drawLight(); - if(displayStatus && block.consumes.any()){ entity.drawStatus(); } @@ -254,13 +256,23 @@ public class BlockRenderer implements Disposable{ Draw.reset(); } } + + //draw lights + for(int i = 0; i < lightview.size; i++){ + Tile tile = lightview.items[i]; + Tilec entity = tile.entity; + + if(entity != null){ + entity.drawLight(); + } + } } @Override public void dispose(){ shadows.dispose(); - fog.dispose(); - shadows = fog = null; + dark.dispose(); + shadows = dark = null; floor.dispose(); } } diff --git a/core/src/mindustry/graphics/CacheLayer.java b/core/src/mindustry/graphics/CacheLayer.java index 6363efae98..5807db7490 100644 --- a/core/src/mindustry/graphics/CacheLayer.java +++ b/core/src/mindustry/graphics/CacheLayer.java @@ -79,9 +79,7 @@ public enum CacheLayer{ renderer.blocks.floor.endc(); renderer.effectBuffer.end(); - Draw.shader(shader); - Draw.rect(renderer.effectBuffer); - Draw.shader(); + renderer.effectBuffer.blit(shader); renderer.blocks.floor.beginc(); } diff --git a/core/src/mindustry/graphics/CubemapMesh.java b/core/src/mindustry/graphics/CubemapMesh.java index f9bfb4e15c..7631c2bd2d 100644 --- a/core/src/mindustry/graphics/CubemapMesh.java +++ b/core/src/mindustry/graphics/CubemapMesh.java @@ -59,7 +59,7 @@ public class CubemapMesh implements Disposable{ public CubemapMesh(Cubemap map){ this.map = map; - this.map.setFilter(TextureFilter.Linear); + this.map.setFilter(TextureFilter.linear); this.mesh = new Mesh(true, vertices.length, 0, new VertexAttribute(Usage.position, 3, "a_position") ); diff --git a/core/src/mindustry/graphics/Drawf.java b/core/src/mindustry/graphics/Drawf.java index 61795a5e2c..b64ebc3877 100644 --- a/core/src/mindustry/graphics/Drawf.java +++ b/core/src/mindustry/graphics/Drawf.java @@ -8,6 +8,7 @@ import arc.math.geom.*; import arc.util.*; import mindustry.*; import mindustry.ctype.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.ui.*; import mindustry.world.*; @@ -48,24 +49,28 @@ public class Drawf{ return z; } - public static void light(float x, float y, float radius, Color color, float opacity){ - renderer.lights.add(x, y, radius, color, opacity); + public static void light(Team team, float x, float y, float radius, Color color, float opacity){ + if(allowLight(team)) renderer.lights.add(x, y, radius, color, opacity); } - public static void light(Position pos, float radius, Color color, float opacity){ - light(pos.getX(), pos.getY(), radius, color, opacity); + public static void light(Team team, Position pos, float radius, Color color, float opacity){ + light(team, pos.getX(), pos.getY(), radius, color, opacity); } - public static void light(float x, float y, TextureRegion region, Color color, float opacity){ - renderer.lights.add(x, y, region, color, opacity); + public static void light(Team team, float x, float y, TextureRegion region, Color color, float opacity){ + if(allowLight(team)) renderer.lights.add(x, y, region, color, opacity); } - public static void light(float x, float y, float x2, float y2){ - renderer.lights.line(x, y, x2, y2, 30, Color.orange, 0.3f); + public static void light(Team team, float x, float y, float x2, float y2){ + if(allowLight(team)) renderer.lights.line(x, y, x2, y2, 30, Color.orange, 0.3f); } - public static void light(float x, float y, float x2, float y2, float stroke, Color tint, float alpha){ - renderer.lights.line(x, y, x2, y2, stroke, tint, alpha); + public static void light(Team team, float x, float y, float x2, float y2, float stroke, Color tint, float alpha){ + if(allowLight(team)) renderer.lights.line(x, y, x2, y2, stroke, tint, alpha); + } + + private static boolean allowLight(Team team){ + return team == Team.derelict || team == Vars.player.team() || state.rules.enemyLights; } public static void selected(Tilec tile, Color color){ @@ -155,15 +160,15 @@ public class Drawf{ Draw.color(); } - public static void laser(TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2, float scale){ - laser(line, edge, x, y, x2, y2, Mathf.angle(x2 - x, y2 - y), scale); + public static void laser(Team team, TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2, float scale){ + laser(team, line, edge, x, y, x2, y2, Mathf.angle(x2 - x, y2 - y), scale); } - public static void laser(TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2){ - laser(line, edge, x, y, x2, y2, Mathf.angle(x2 - x, y2 - y), 1f); + public static void laser(Team team, TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2){ + laser(team, line, edge, x, y, x2, y2, Mathf.angle(x2 - x, y2 - y), 1f); } - public static void laser(TextureRegion line, TextureRegion edge, float x, float y, float x2, float y2, float rotation, float scale){ + 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); Draw.rect(edge, x, y, edge.getWidth() * scale * Draw.scl, edge.getHeight() * scale * Draw.scl, rotation + 180); @@ -175,7 +180,7 @@ public class Drawf{ Lines.precise(false); Lines.stroke(1f); - Drawf.light(x, y, x2, y2); + light(team, x, y, x2, y2); } public static void tri(float x, float y, float width, float length, float rotation){ diff --git a/core/src/mindustry/graphics/FloorRenderer.java b/core/src/mindustry/graphics/FloorRenderer.java index 4dcf17add2..fe83e9bbcb 100644 --- a/core/src/mindustry/graphics/FloorRenderer.java +++ b/core/src/mindustry/graphics/FloorRenderer.java @@ -24,7 +24,7 @@ public class FloorRenderer implements Disposable{ private MultiCacheBatch cbatch; private IntSet drawnLayerSet = new IntSet(); private IntSet recacheSet = new IntSet(); - private IntArray drawnLayers = new IntArray(); + private IntSeq drawnLayers = new IntSeq(); private ObjectSet used = new ObjectSet<>(); public FloorRenderer(){ diff --git a/core/src/mindustry/graphics/IndexedRenderer.java b/core/src/mindustry/graphics/IndexedRenderer.java index 96194c0883..a82080cd34 100644 --- a/core/src/mindustry/graphics/IndexedRenderer.java +++ b/core/src/mindustry/graphics/IndexedRenderer.java @@ -27,14 +27,7 @@ public class IndexedRenderer implements Disposable{ " gl_Position = u_projTrans * " + Shader.positionAttribute + ";", "}"), Strings.join("\n", - "#ifdef GL_ES", - "#define LOWP lowp", - "precision mediump float;", - "#else", - "#define LOWP ", - "#endif", - "", - "varying LOWP vec4 v_color;", + "varying lowp vec4 v_color;", "varying vec2 v_texCoords;", "uniform sampler2D u_texture;", "", @@ -63,7 +56,7 @@ public class IndexedRenderer implements Disposable{ program.bind(); texture.bind(); - program.setUniformMatrix4("u_projTrans", BatchShader.copyTransform(combined)); + program.setUniformMatrix4("u_projTrans", combined); program.setUniformi("u_texture", 0); mesh.render(program, Gl.triangles, 0, vertices.length / vsize); @@ -74,14 +67,15 @@ public class IndexedRenderer implements Disposable{ } public void draw(int index, TextureRegion region, float x, float y, float w, float h){ - final float fx2 = x + w; - final float fy2 = y + h; - final float u = region.getU(); - final float v = region.getV2(); - final float u2 = region.getU2(); - final float v2 = region.getV(); + 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[] vertices = tmpVerts; + float color = this.color; int idx = 0; vertices[idx++] = x; @@ -125,46 +119,35 @@ public class IndexedRenderer implements Disposable{ } public void draw(int index, TextureRegion region, float x, float y, float w, float h, float rotation){ - final float u = region.getU(); - final float v = region.getV2(); - final float u2 = region.getU2(); - final float v2 = region.getV(); + float u = region.getU(); + float v = region.getV2(); + float u2 = region.getU2(); + float v2 = region.getV(); - final float originX = w / 2, originY = h / 2; + float originX = w / 2, originY = h / 2; - final float cos = Mathf.cosDeg(rotation); - final float sin = Mathf.sinDeg(rotation); + float cos = Mathf.cosDeg(rotation); + float sin = Mathf.sinDeg(rotation); float fx = -originX; float fy = -originY; float fx2 = w - originX; float fy2 = h - originY; - final float worldOriginX = x + originX; - final float worldOriginY = y + originY; - - float x1 = cos * fx - sin * fy; - float y1 = sin * fx + cos * fy; - - float x2 = cos * fx - sin * fy2; - float y2 = sin * fx + cos * fy2; - - float x3 = cos * fx2 - sin * fy2; - float y3 = sin * fx2 + cos * fy2; + float worldOriginX = x + originX; + float worldOriginY = y + originY; + float x1 = cos * fx - sin * fy + worldOriginX; + float y1 = sin * fx + cos * fy + worldOriginY; + float x2 = cos * fx - sin * fy2 + worldOriginX; + float y2 = sin * fx + cos * fy2 + worldOriginY; + float x3 = cos * fx2 - sin * fy2 + worldOriginX; + float y3 = sin * fx2 + cos * fy2 + worldOriginY; float x4 = x1 + (x3 - x2); float y4 = y3 - (y2 - y1); - x1 += worldOriginX; - y1 += worldOriginY; - x2 += worldOriginX; - y2 += worldOriginY; - x3 += worldOriginX; - y3 += worldOriginY; - x4 += worldOriginX; - y4 += worldOriginY; - float[] vertices = tmpVerts; + float color = this.color; int idx = 0; vertices[idx++] = x1; diff --git a/core/src/mindustry/graphics/InverseKinematics.java b/core/src/mindustry/graphics/InverseKinematics.java new file mode 100644 index 0000000000..196a0bffaa --- /dev/null +++ b/core/src/mindustry/graphics/InverseKinematics.java @@ -0,0 +1,29 @@ +package mindustry.graphics; + +import arc.math.*; +import arc.math.geom.*; + +public class InverseKinematics{ + private static final Vec2[] mat1 = {new Vec2(), new Vec2()}, mat2 = {new Vec2(), new Vec2()}; + private static final Vec2 temp = new Vec2(), temp2 = new Vec2(), at1 = new Vec2(); + + static public boolean solve(float lengthA, float lengthB, Vec2 end, boolean side, Vec2 result){ + at1.set(end).rotate(side ? 1 : -1).setLength(lengthA + lengthB).add(end.x / 2f, end.y / 2f); + return solve(lengthA, lengthB, end, at1, result); + } + + static public boolean solve(float lengthA, float lengthB, Vec2 end, Vec2 attractor, Vec2 result){ + Vec2 axis = mat2[0].set(end).nor(); + mat2[1].set(attractor).sub(temp2.set(axis).scl(attractor.dot(axis))).nor(); + mat1[0].set(mat2[0].x, mat2[1].x); + mat1[1].set(mat2[0].y, mat2[1].y); + result.set(mat2[0].dot(end), mat2[1].dot(end)); + float len = result.len(); + float dist = Math.max(0, Math.min(lengthA, (len + (lengthA * lengthA - lengthB * lengthB) / len) / 2)); + Vec2 src = temp.set(dist, Mathf.sqrt(lengthA * lengthA - dist * dist)); + result.set(mat1[0].dot(src), mat1[1].dot(src)); + + return dist > 0 && dist < lengthA; + } + +} \ No newline at end of file diff --git a/core/src/mindustry/graphics/LightRenderer.java b/core/src/mindustry/graphics/LightRenderer.java index f36f3d35a4..b8c93823b4 100644 --- a/core/src/mindustry/graphics/LightRenderer.java +++ b/core/src/mindustry/graphics/LightRenderer.java @@ -18,7 +18,7 @@ public class LightRenderer{ private float[] vertices = new float[24]; private FrameBuffer buffer = new FrameBuffer(); - private Array lights = new Array<>(); + private Seq lights = new Seq<>(); public void add(Runnable run){ if(!enabled()) return; @@ -195,9 +195,7 @@ public class LightRenderer{ Draw.color(); Shaders.light.ambient.set(state.rules.ambientLight); - Draw.shader(Shaders.light); - Draw.rect(buffer); - Draw.shader(); + buffer.blit(Shaders.light); lights.clear(); } diff --git a/core/src/mindustry/graphics/LoadRenderer.java b/core/src/mindustry/graphics/LoadRenderer.java index 8dc51f2715..afbab1b6e2 100644 --- a/core/src/mindustry/graphics/LoadRenderer.java +++ b/core/src/mindustry/graphics/LoadRenderer.java @@ -26,7 +26,7 @@ public class LoadRenderer implements Disposable{ private static final Color colorRed = Pal.breakInvalid.cpy().lerp(Color.black, 0.3f); private static final String red = "[#" + colorRed + "]"; private static final String orange = "[#" + color + "]"; - private static final FloatArray floats = new FloatArray(); + private static final FloatSeq floats = new FloatSeq(); private static final boolean preview = false; private float testprogress = 0f; @@ -35,7 +35,7 @@ public class LoadRenderer implements Disposable{ private Mesh mesh = MeshBuilder.buildHex(colorRed, 2, true, 1f); private Camera3D cam = new Camera3D(); private int lastLength = -1; - private FxProcessor fx = new FxProcessor(Format.RGBA8888, 2, 2, false, true); + private FxProcessor fx = new FxProcessor(Format.rgba8888, 2, 2, false, true); private WindowedMean renderTimes = new WindowedMean(20); private long lastFrameTime; @@ -47,14 +47,14 @@ public class LoadRenderer implements Disposable{ bars = new Bar[]{ new Bar("s_proc#", OS.cores / 16f, OS.cores < 4), new Bar("c_aprog", () -> assets != null, () -> assets.getProgress(), () -> false), - new Bar("g_vtype", graphics.getGLVersion().getType() == Type.GLES ? 0.5f : 1f, graphics.getGLVersion().getType() == Type.GLES), + new Bar("g_vtype", graphics.getGLVersion().type == Type.GLES ? 0.5f : 1f, graphics.getGLVersion().type == Type.GLES), new Bar("s_mem#", () -> true, () -> Core.app.getJavaHeap() / 1024f / 1024f / 200f, () -> Core.app.getJavaHeap() > 1024*1024*110), new Bar("v_ver#", () -> Version.build != 0, () -> Version.build == -1 ? 0.3f : (Version.build - 103f) / 10f, () -> !Version.modifier.equals("release")), new Bar("s_osv", OS.isWindows ? 0.35f : OS.isLinux ? 0.9f : OS.isMac ? 0.5f : 0.2f, OS.isMac), new Bar("v_worlds#", () -> Vars.control != null && Vars.control.saves != null, () -> Vars.control.saves.getSaveSlots().size / 30f, () -> Vars.control.saves.getSaveSlots().size > 30), new Bar("c_datas#", () -> settings.keySize() > 0, () -> settings.keySize() / 50f, () -> settings.keySize() > 20), new Bar("v_alterc", () -> Vars.mods != null, () -> (Vars.mods.list().size + 1) / 6f, () -> Vars.mods.list().size > 0), - new Bar("g_vcomp#", (graphics.getGLVersion().getMajorVersion() + graphics.getGLVersion().getMinorVersion() / 10f) / 4.6f, !graphics.getGLVersion().isVersionEqualToOrHigher(3, 2)), + new Bar("g_vcomp#", (graphics.getGLVersion().majorVersion + graphics.getGLVersion().minorVersion / 10f) / 4.6f, !graphics.getGLVersion().atLeast(3, 2)), }; } diff --git a/core/src/mindustry/graphics/MenuRenderer.java b/core/src/mindustry/graphics/MenuRenderer.java index 32af36e457..e8f8857591 100644 --- a/core/src/mindustry/graphics/MenuRenderer.java +++ b/core/src/mindustry/graphics/MenuRenderer.java @@ -42,7 +42,7 @@ public class MenuRenderer implements Disposable{ private void generate(){ world.beginMapLoad(); Tiles tiles = world.resize(width, height); - Array ores = content.blocks().select(b -> b instanceof OreBlock); + Seq ores = content.blocks().select(b -> b instanceof OreBlock); shadows = new FrameBuffer(width, height); int offset = Mathf.random(100000); Simplex s1 = new Simplex(offset); diff --git a/core/src/mindustry/graphics/MinimapRenderer.java b/core/src/mindustry/graphics/MinimapRenderer.java index a7b85b330a..b3d3dc2099 100644 --- a/core/src/mindustry/graphics/MinimapRenderer.java +++ b/core/src/mindustry/graphics/MinimapRenderer.java @@ -22,7 +22,7 @@ import static mindustry.Vars.*; public class MinimapRenderer implements Disposable{ private static final float baseSize = 16f; - private final Array units = new Array<>(); + private final Seq units = new Seq<>(); private Pixmap pixmap; private Texture texture; private TextureRegion region; @@ -66,7 +66,7 @@ public class MinimapRenderer implements Disposable{ texture.dispose(); } setZoom(4f); - pixmap = new Pixmap(world.width(), world.height(), Format.RGBA8888); + pixmap = new Pixmap(world.width(), world.height(), Format.rgba8888); texture = new Texture(pixmap); region = new TextureRegion(texture); } @@ -129,11 +129,11 @@ public class MinimapRenderer implements Disposable{ for(Tile tile : world.tiles){ pixmap.draw(tile.x, pixmap.getHeight() - 1 - tile.y, colorFor(tile)); } - texture.draw(pixmap, 0, 0); + texture.draw(pixmap); } public void update(Tile tile){ - if(world.isGenerating()) return; + if(world.isGenerating() || !state.isGame()) return; int color = colorFor(world.tile(tile.x, tile.y)); pixmap.draw(tile.x, pixmap.getHeight() - 1 - tile.y, color); diff --git a/core/src/mindustry/graphics/MultiPacker.java b/core/src/mindustry/graphics/MultiPacker.java index 40bce36694..ac8277b078 100644 --- a/core/src/mindustry/graphics/MultiPacker.java +++ b/core/src/mindustry/graphics/MultiPacker.java @@ -12,7 +12,7 @@ public class MultiPacker implements Disposable{ public MultiPacker(){ for(int i = 0; i < packers.length; i++){ int pageSize = 2048; - packers[i] = new PixmapPacker(pageSize, pageSize, Format.RGBA8888, 2, true); + packers[i] = new PixmapPacker(pageSize, pageSize, Format.rgba8888, 2, true); } } diff --git a/core/src/mindustry/graphics/Pixelator.java b/core/src/mindustry/graphics/Pixelator.java index 67dc58dd7d..4d77af56a7 100644 --- a/core/src/mindustry/graphics/Pixelator.java +++ b/core/src/mindustry/graphics/Pixelator.java @@ -15,7 +15,7 @@ public class Pixelator implements Disposable{ private float px, py, pre; { - buffer.getTexture().setFilter(TextureFilter.Nearest, TextureFilter.Nearest); + buffer.getTexture().setFilter(TextureFilter.nearest, TextureFilter.nearest); } public void drawPixelate(){ @@ -43,9 +43,8 @@ public class Pixelator implements Disposable{ Draw.draw(Layer.end, () -> { buffer.end(); - Draw.blend(Blending.disabled); - Draw.rect(buffer); - Draw.blend(); + Blending.disabled.apply(); + buffer.blit(Shaders.screenspace); Core.camera.position.set(px, py); renderer.setScale(pre); diff --git a/core/src/mindustry/graphics/Shaders.java b/core/src/mindustry/graphics/Shaders.java index 0e46e83d60..7823a5ee7a 100644 --- a/core/src/mindustry/graphics/Shaders.java +++ b/core/src/mindustry/graphics/Shaders.java @@ -12,13 +12,13 @@ import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.type.*; -import static mindustry.Vars.renderer; +import static mindustry.Vars.*; public class Shaders{ public static BlockBuild blockbuild; - public static @Nullable Shield shield; + public static @Nullable ShieldShader shield; public static UnitBuild build; - public static FogShader fog; + public static DarknessShader darkness; public static LightShader light; public static SurfaceShader water, tar, slag; public static PlanetShader planet; @@ -26,18 +26,19 @@ public class Shaders{ public static AtmosphereShader atmosphere; public static MeshShader mesh = new MeshShader(); public static Shader unlit; + public static Shader screenspace; public static void init(){ blockbuild = new BlockBuild(); try{ - shield = new Shield(); + shield = new ShieldShader(); }catch(Throwable t){ //don't load shield shader shield = null; t.printStackTrace(); } build = new UnitBuild(); - fog = new FogShader(); + darkness = new DarknessShader(); light = new LightShader(); water = new SurfaceShader("water"); tar = new SurfaceShader("tar"); @@ -46,6 +47,7 @@ public class Shaders{ planetGrid = new PlanetGridShader(); atmosphere = new AtmosphereShader(); unlit = new LoadShader("planet", "unlit"); + screenspace = new LoadShader("screenspace", "screenspace"); } public static class AtmosphereShader extends LoadShader{ @@ -119,7 +121,7 @@ public class Shaders{ public Color ambient = new Color(0.01f, 0.01f, 0.04f, 0.99f); public LightShader(){ - super("light", "default"); + super("light", "screenspace"); } @Override @@ -129,9 +131,9 @@ public class Shaders{ } - public static class FogShader extends LoadShader{ - public FogShader(){ - super("fog", "default"); + public static class DarknessShader extends LoadShader{ + public DarknessShader(){ + super("darkness", "default"); } } @@ -175,16 +177,18 @@ public class Shaders{ } } - public static class Shield extends LoadShader{ + public static class ShieldShader extends LoadShader{ + public Color color = Pal.accent.cpy(); - public Shield(){ - super("shield", "default"); + public ShieldShader(){ + super("shield", "screenspace"); } @Override public void apply(){ setUniformf("u_dp", Scl.scl(1f)); setUniformf("u_time", Time.time() / Scl.scl(1f)); + setUniformf("u_shieldcolor", color); setUniformf("u_offset", Core.camera.position.x - Core.camera.width / 2, Core.camera.position.y - Core.camera.height / 2); @@ -196,11 +200,11 @@ public class Shaders{ public static class SurfaceShader extends LoadShader{ public SurfaceShader(String frag){ - super(frag, "default"); + super(frag, "screenspace"); Core.assets.load("sprites/noise.png", Texture.class).loaded = t -> { - ((Texture)t).setFilter(TextureFilter.Linear); - ((Texture)t).setWrap(TextureWrap.Repeat); + ((Texture)t).setFilter(TextureFilter.linear); + ((Texture)t).setWrap(TextureWrap.repeat); }; } @@ -220,8 +224,9 @@ public class Shaders{ } public static class LoadShader extends Shader{ + public LoadShader(String frag, String vert){ - super(Core.files.internal("shaders/" + vert + ".vert"), Core.files.internal("shaders/" + frag + ".frag")); + super(Core.files.internal("shaders/" + vert + ".vert").readString(), Core.files.internal("shaders/" + frag + ".frag").readString()); } } } diff --git a/core/src/mindustry/graphics/Trail.java b/core/src/mindustry/graphics/Trail.java index 69dcf6fd98..5093194020 100644 --- a/core/src/mindustry/graphics/Trail.java +++ b/core/src/mindustry/graphics/Trail.java @@ -9,7 +9,7 @@ import arc.util.pooling.*; public class Trail{ private static final int length = 20; - private Array points = new Array<>(); + private Seq points = new Seq<>(); private float lastX = -1, lastY = -1; public void draw(Color color, float width){ diff --git a/core/src/mindustry/graphics/g3d/PlanetRenderer.java b/core/src/mindustry/graphics/g3d/PlanetRenderer.java index e148254139..214b8be191 100644 --- a/core/src/mindustry/graphics/g3d/PlanetRenderer.java +++ b/core/src/mindustry/graphics/g3d/PlanetRenderer.java @@ -22,7 +22,7 @@ public class PlanetRenderer implements Disposable{ borderColor = Pal.accent.cpy().a(0.3f), shadowColor = new Color(0, 0, 0, 0.7f); - private static final Array points = new Array<>(); + private static final Seq points = new Seq<>(); private static final PlanetInterfaceRenderer emptyRenderer = new PlanetInterfaceRenderer(){ @Override public void renderSectors(Planet planet){} @Override public void renderProjections(){} diff --git a/core/src/mindustry/input/Binding.java b/core/src/mindustry/input/Binding.java index 95508dd300..b4bacb68af 100644 --- a/core/src/mindustry/input/Binding.java +++ b/core/src/mindustry/input/Binding.java @@ -1,10 +1,9 @@ package mindustry.input; -import arc.Application.ApplicationType; -import arc.Core; +import arc.*; import arc.KeyBinds.*; -import arc.input.InputDevice.DeviceType; -import arc.input.KeyCode; +import arc.input.InputDevice.*; +import arc.input.*; public enum Binding implements KeyBind{ move_x(new Axis(KeyCode.a, KeyCode.d), "general"), @@ -54,7 +53,7 @@ public enum Binding implements KeyBind{ block_select_10(KeyCode.num0), zoom(new Axis(KeyCode.scroll), "view"), - menu(Core.app.getType() == ApplicationType.Android ? KeyCode.back : KeyCode.escape), + menu(Core.app.isAndroid() ? KeyCode.back : KeyCode.escape), fullscreen(KeyCode.f11), pause(KeyCode.space), minimap(KeyCode.m), diff --git a/core/src/mindustry/input/DesktopInput.java b/core/src/mindustry/input/DesktopInput.java index 6ae7cfb81c..b1c3e14b87 100644 --- a/core/src/mindustry/input/DesktopInput.java +++ b/core/src/mindustry/input/DesktopInput.java @@ -42,7 +42,7 @@ public class DesktopInput extends InputHandler{ /** Animation scale for line. */ private float selectScale; /** Selected build request for movement. */ - private @Nullable BuildRequest sreq; + private @Nullable BuildPlan sreq; /** Whether player is currently deleting removal requests. */ private boolean deleting = false, shouldShoot = false; @@ -124,19 +124,19 @@ public class DesktopInput extends InputHandler{ //draw hover request if(mode == none && !isPlacing()){ - BuildRequest req = getRequest(cursorX, cursorY); + BuildPlan req = getRequest(cursorX, cursorY); if(req != null){ drawSelected(req.x, req.y, req.breaking ? req.tile().block() : req.block, Pal.accent); } } //draw schematic requests - for(BuildRequest request : selectRequests){ + for(BuildPlan request : selectRequests){ request.animScale = 1f; drawRequest(request); } - for(BuildRequest request : selectRequests){ + for(BuildPlan request : selectRequests){ drawOverRequest(request); } @@ -144,7 +144,7 @@ public class DesktopInput extends InputHandler{ //draw things that may be placed soon if(mode == placing && block != null){ for(int i = 0; i < lineRequests.size; i++){ - BuildRequest req = lineRequests.get(i); + BuildPlan req = lineRequests.get(i); if(i == lineRequests.size - 1 && req.block.rotate){ drawArrow(block, req.x, req.y, req.rotation); } @@ -179,8 +179,9 @@ public class DesktopInput extends InputHandler{ ui.listfrag.toggle(); } + //TODO awful UI state checking code if((player.dead() || state.isPaused()) && !ui.chatfrag.shown()){ - if(!(scene.getKeyboardFocus() instanceof TextField)){ + if(!(scene.getKeyboardFocus() instanceof TextField) && !scene.hasDialog()){ //move camera around float camSpeed = !Core.input.keyDown(Binding.boost) ? 3f : 8f; Core.camera.position.add(Tmp.v1.setZero().add(Core.input.axis(Binding.move_x), Core.input.axis(Binding.move_y)).nor().scl(Time.delta() * camSpeed)); @@ -191,7 +192,7 @@ public class DesktopInput extends InputHandler{ } } }else if(!player.dead()){ - Core.camera.position.lerpDelta(player, 0.08f); + Core.camera.position.lerpDelta(player, Core.settings.getBool("smoothcamera") ? 0.08f : 1f); } shouldShoot = true; @@ -425,7 +426,7 @@ public class DesktopInput extends InputHandler{ } if(Core.input.keyTap(Binding.select) && !Core.scene.hasMouse()){ - BuildRequest req = getRequest(cursorX, cursorY); + BuildPlan req = getRequest(cursorX, cursorY); if(Core.input.keyDown(Binding.break_block)){ mode = none; @@ -444,7 +445,7 @@ public class DesktopInput extends InputHandler{ deleting = true; }else if(selected != null){ //only begin shooting if there's no cursor event - if(!tileTapped(selected.entity) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && (player.builder().requests().size == 0 || !player.builder().isBuilding()) && !droppingItem && + if(!tileTapped(selected.entity) && !tryTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y) && (player.builder().plans().size == 0 || !player.builder().isBuilding()) && !droppingItem && !tryBeginMine(selected) && player.miner().mineTile() == null && !Core.scene.hasKeyboard()){ isShooting = shouldShoot; } @@ -466,9 +467,9 @@ public class DesktopInput extends InputHandler{ } if(Core.input.keyDown(Binding.select) && mode == none && !isPlacing() && deleting){ - BuildRequest req = getRequest(cursorX, cursorY); + BuildPlan req = getRequest(cursorX, cursorY); if(req != null && req.breaking){ - player.builder().requests().remove(req); + player.builder().plans().remove(req); } }else{ deleting = false; @@ -497,7 +498,7 @@ public class DesktopInput extends InputHandler{ if(sreq != null){ if(getRequest(sreq.x, sreq.y, sreq.block.size, sreq) != null){ - player.builder().requests().remove(sreq, true); + player.builder().plans().remove(sreq, true); } sreq = null; } diff --git a/core/src/mindustry/input/InputHandler.java b/core/src/mindustry/input/InputHandler.java index 3608e399c1..4d50e58c4d 100644 --- a/core/src/mindustry/input/InputHandler.java +++ b/core/src/mindustry/input/InputHandler.java @@ -47,7 +47,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ final static int maxLength = 100; final static Vec2 stackTrns = new Vec2(); final static Rect r1 = new Rect(), r2 = new Rect(); - final static Array units = new Array<>(); + final static Seq units = new Seq<>(); /** Distance on the back from where items originate. */ final static float backTrns = 3f; @@ -64,10 +64,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ protected @Nullable Schematic lastSchematic; protected GestureDetector detector; protected PlaceLine line = new PlaceLine(); - protected BuildRequest resultreq; - protected BuildRequest brequest = new BuildRequest(); - protected Array lineRequests = new Array<>(); - protected Array selectRequests = new Array<>(); + protected BuildPlan resultreq; + protected BuildPlan brequest = new BuildPlan(); + protected Seq lineRequests = new Seq<>(); + protected Seq selectRequests = new Seq<>(); //methods to override @@ -232,11 +232,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } - public Eachable allRequests(){ + public Eachable allRequests(){ return cons -> { - for(BuildRequest request : player.builder().requests()) cons.get(request); - for(BuildRequest request : selectRequests) cons.get(request); - for(BuildRequest request : lineRequests) cons.get(request); + for(BuildPlan request : player.builder().plans()) cons.get(request); + for(BuildPlan request : selectRequests) cons.get(request); + for(BuildPlan request : lineRequests) cons.get(request); }; } @@ -317,7 +317,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Drawf.selected(x, y, block, color); } - public void drawBreaking(BuildRequest request){ + public void drawBreaking(BuildPlan request){ if(request.breaking){ drawBreaking(request.x, request.y); }else{ @@ -325,7 +325,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } - public boolean requestMatches(BuildRequest request){ + public boolean requestMatches(BuildPlan request){ Tile tile = world.tile(request.x, request.y); return tile != null && tile.block() instanceof BuildBlock && tile.ent().cblock == request.block; } @@ -362,7 +362,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ }); } - public void rotateRequests(Array requests, int direction){ + public void rotateRequests(Seq requests, int direction){ int ox = schemOriginX(), oy = schemOriginY(); requests.each(req -> { @@ -396,7 +396,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ }); } - public void flipRequests(Array requests, boolean x){ + public void flipRequests(Seq requests, boolean x){ int origin = (x ? schemOriginX() : schemOriginY()) * tilesize; requests.each(req -> { @@ -436,18 +436,18 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } /** Returns the selection request that overlaps this position, or null. */ - protected BuildRequest getRequest(int x, int y){ + protected BuildPlan getRequest(int x, int y){ return getRequest(x, y, 1, null); } /** Returns the selection request that overlaps this position, or null. */ - protected BuildRequest getRequest(int x, int y, int size, BuildRequest skip){ + protected BuildPlan getRequest(int x, int y, int size, BuildPlan skip){ float offset = ((size + 1) % 2) * tilesize / 2f; r2.setSize(tilesize * size); r2.setCenter(x * tilesize + offset, y * tilesize + offset); resultreq = null; - Boolf test = req -> { + Boolf test = req -> { if(req == skip) return false; Tile other = req.tile(); @@ -464,11 +464,11 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ return r2.overlaps(r1); }; - for(BuildRequest req : player.builder().requests()){ + for(BuildPlan req : player.builder().plans()){ if(test.get(req)) return req; } - for(BuildRequest req : selectRequests){ + for(BuildPlan req : selectRequests){ if(test.get(req)) return req; } @@ -493,14 +493,14 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Draw.color(Pal.remove); Lines.stroke(1f); - for(BuildRequest req : player.builder().requests()){ + for(BuildPlan req : player.builder().plans()){ if(req.breaking) continue; if(req.bounds(Tmp.r2).overlaps(Tmp.r1)){ drawBreaking(req); } } - for(BuildRequest req : selectRequests){ + for(BuildPlan req : selectRequests){ if(req.breaking) continue; if(req.bounds(Tmp.r2).overlaps(Tmp.r1)){ drawBreaking(req); @@ -533,10 +533,10 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Lines.rect(result.x, result.y, result.x2 - result.x, result.y2 - result.y); } - protected void flushSelectRequests(Array requests){ - for(BuildRequest req : requests){ + protected void flushSelectRequests(Seq requests){ + for(BuildPlan req : requests){ if(req.block != null && validPlace(req.x, req.y, req.block, req.rotation)){ - BuildRequest other = getRequest(req.x, req.y, req.block.size, null); + BuildPlan other = getRequest(req.x, req.y, req.block.size, null); if(other == null){ selectRequests.add(req.copy()); }else if(!other.breaking && other.x == req.x && other.y == req.y && other.block.size == req.block.size){ @@ -547,16 +547,16 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } } - protected void flushRequests(Array requests){ - for(BuildRequest req : requests){ + protected void flushRequests(Seq requests){ + for(BuildPlan req : requests){ if(req.block != null && validPlace(req.x, req.y, req.block, req.rotation)){ - BuildRequest copy = req.copy(); + BuildPlan copy = req.copy(); player.builder().addBuild(copy); } } } - protected void drawOverRequest(BuildRequest request){ + protected void drawOverRequest(BuildPlan request){ boolean valid = validPlace(request.x, request.y, request.block, request.rotation); Draw.reset(); @@ -566,7 +566,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ Draw.reset(); } - protected void drawRequest(BuildRequest request){ + 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){ @@ -604,7 +604,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(!flush){ tryBreakBlock(wx, wy); }else if(validBreak(tile.x, tile.y) && !selectRequests.contains(r -> r.tile() != null && r.tile() == tile)){ - selectRequests.add(new BuildRequest(tile.x, tile.y)); + selectRequests.add(new BuildPlan(tile.x, tile.y)); } } } @@ -612,9 +612,9 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ //remove build requests Tmp.r1.set(result.x * tilesize, result.y * tilesize, (result.x2 - result.x) * tilesize, (result.y2 - result.y) * tilesize); - Iterator it = player.builder().requests().iterator(); + Iterator it = player.builder().plans().iterator(); while(it.hasNext()){ - BuildRequest req = it.next(); + BuildPlan req = it.next(); if(!req.breaking && req.bounds(Tmp.r2).overlaps(Tmp.r1)){ it.remove(); } @@ -622,7 +622,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ it = selectRequests.iterator(); while(it.hasNext()){ - BuildRequest req = it.next(); + BuildPlan req = it.next(); if(!req.breaking && req.bounds(Tmp.r2).overlaps(Tmp.r1)){ it.remove(); } @@ -643,7 +643,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ lineRequests.clear(); iterateLine(x1, y1, x2, y2, l -> { rotation = l.rotation; - BuildRequest req = new BuildRequest(l.x, l.y, l.rotation, block); + BuildPlan req = new BuildPlan(l.x, l.y, l.rotation, block); req.animScale = 1f; lineRequests.add(req); }); @@ -651,7 +651,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ if(Core.settings.getBool("blockreplace")){ lineRequests.each(req -> { Block replace = req.block.getReplacement(req, lineRequests); - if(replace.unlockedCur()){ + if(replace.unlockedNow()){ req.block = replace; } }); @@ -898,8 +898,8 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ return validPlace(x, y, type, rotation, null); } - public boolean validPlace(int x, int y, Block type, int rotation, BuildRequest ignore){ - for(BuildRequest req : player.builder().requests()){ + public boolean validPlace(int x, int y, Block type, int rotation, BuildPlan ignore){ + for(BuildPlan req : player.builder().plans()){ if(req != ignore && !req.breaking && req.block.bounds(req.x, req.y, Tmp.r1).overlaps(type.bounds(x, y, Tmp.r2)) @@ -915,18 +915,18 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } public void placeBlock(int x, int y, Block block, int rotation){ - BuildRequest req = getRequest(x, y); + BuildPlan req = getRequest(x, y); if(req != null){ - player.builder().requests().remove(req); + player.builder().plans().remove(req); } - player.builder().addBuild(new BuildRequest(x, y, rotation, block)); + player.builder().addBuild(new BuildPlan(x, y, rotation, block)); } public void breakBlock(int x, int y){ Tile tile = world.tile(x, y); //TODO hacky if(tile != null && tile.entity != null) tile = tile.entity.tile(); - player.builder().addBuild(new BuildRequest(tile.x, tile.y)); + player.builder().addBuild(new BuildPlan(tile.x, tile.y)); } public void drawArrow(Block block, int x, int y, int rotation){ @@ -953,7 +953,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } void iterateLine(int startX, int startY, int endX, int endY, Cons cons){ - Array points; + Seq points; boolean diagonal = Core.input.keyDown(Binding.diagonal_placement); if(Core.settings.getBool("swapdiagonal") && mobile){ @@ -971,7 +971,7 @@ public abstract class InputHandler implements InputProcessor, GestureListener{ } if(block instanceof PowerNode){ - Array skip = new Array<>(); + Seq skip = new Seq<>(); for(int i = 1; i < points.size; i++){ int overlaps = 0; diff --git a/core/src/mindustry/input/MobileInput.java b/core/src/mindustry/input/MobileInput.java index 16f7261a24..8320bb47d1 100644 --- a/core/src/mindustry/input/MobileInput.java +++ b/core/src/mindustry/input/MobileInput.java @@ -48,7 +48,7 @@ public class MobileInput extends InputHandler implements GestureListener{ private float shiftDeltaX, shiftDeltaY; /** Place requests to be removed. */ - private Array removals = new Array<>(); + private Seq removals = new Seq<>(); /** Whether or not the player is currently shifting all placed tiles. */ private boolean selecting; /** Whether the player is currently in line-place mode. */ @@ -58,7 +58,7 @@ public class MobileInput extends InputHandler implements GestureListener{ /** Whether no recipe was available when switching to break mode. */ private Block lastBlock; /** Last placed request. Used for drawing block overlay. */ - private BuildRequest lastPlaced; + private BuildPlan lastPlaced; /** Down tracking for panning.*/ private boolean down = false; @@ -97,7 +97,7 @@ public class MobileInput extends InputHandler implements GestureListener{ r2.setSize(block.size * tilesize); r2.setCenter(x * tilesize + block.offset(), y * tilesize + block.offset()); - for(BuildRequest req : selectRequests){ + for(BuildPlan req : selectRequests){ Tile other = req.tile(); if(other == null || req.breaking) continue; @@ -110,7 +110,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } } - for(BuildRequest req : player.builder().requests()){ + for(BuildPlan req : player.builder().plans()){ Tile other = world.tile(req.x, req.y); if(other == null || req.breaking) continue; @@ -126,11 +126,11 @@ public class MobileInput extends InputHandler implements GestureListener{ } /** Returns the selection request that overlaps this tile, or null. */ - BuildRequest getRequest(Tile tile){ + BuildPlan getRequest(Tile tile){ r2.setSize(tilesize); r2.setCenter(tile.worldx(), tile.worldy()); - for(BuildRequest req : selectRequests){ + for(BuildPlan req : selectRequests){ Tile other = req.tile(); if(other == null) continue; @@ -149,7 +149,7 @@ public class MobileInput extends InputHandler implements GestureListener{ return null; } - void removeRequest(BuildRequest request){ + void removeRequest(BuildPlan request){ selectRequests.remove(request, true); if(!request.breaking){ removals.add(request); @@ -204,20 +204,20 @@ public class MobileInput extends InputHandler implements GestureListener{ //confirm button table.button(Icon.ok, Styles.clearPartiali, () -> { - for(BuildRequest request : selectRequests){ + for(BuildPlan request : selectRequests){ Tile tile = request.tile(); //actually place/break all selected blocks if(tile != null){ if(!request.breaking){ if(validPlace(request.x, request.y, request.block, request.rotation)){ - BuildRequest other = getRequest(request.x, request.y, request.block.size, null); - BuildRequest copy = request.copy(); + BuildPlan other = getRequest(request.x, request.y, request.block.size, null); + BuildPlan copy = request.copy(); if(other == null){ player.builder().addBuild(copy); }else if(!other.breaking && other.x == request.x && other.y == request.y && other.block.size == request.block.size){ - player.builder().requests().remove(other); + player.builder().plans().remove(other); player.builder().addBuild(copy); } } @@ -278,7 +278,7 @@ public class MobileInput extends InputHandler implements GestureListener{ Lines.stroke(1f); //draw removals - for(BuildRequest request : removals){ + for(BuildPlan request : removals){ Tile tile = request.tile(); if(tile == null) continue; @@ -293,7 +293,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } //draw list of requests - for(BuildRequest request : selectRequests){ + for(BuildPlan request : selectRequests){ Tile tile = request.tile(); if(tile == null) continue; @@ -333,7 +333,7 @@ public class MobileInput extends InputHandler implements GestureListener{ if(mode == placing && block != null){ //draw placing for(int i = 0; i < lineRequests.size; i++){ - BuildRequest request = lineRequests.get(i); + BuildPlan request = lineRequests.get(i); if(i == lineRequests.size - 1 && request.block.rotate){ drawArrow(block, request.x, request.y, request.rotation); } @@ -376,7 +376,7 @@ public class MobileInput extends InputHandler implements GestureListener{ } @Override - protected void drawRequest(BuildRequest request){ + protected void drawRequest(BuildPlan request){ if(request.tile() == null) return; brequest.animScale = request.animScale = Mathf.lerpDelta(request.animScale, 1f, 0.1f); @@ -551,10 +551,10 @@ public class MobileInput extends InputHandler implements GestureListener{ 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 BuildRequest(cursor.x, cursor.y, rotation, block)); + selectRequests.add(lastPlaced = new BuildPlan(cursor.x, cursor.y, rotation, block)); }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 BuildRequest(linked.x, linked.y)); + selectRequests.add(new BuildPlan(linked.x, linked.y)); }else if(!canTapPlayer(worldx, worldy) && !tileTapped(linked.entity)){ tryBeginMine(cursor); } @@ -659,7 +659,7 @@ public class MobileInput extends InputHandler implements GestureListener{ //remove place requests that have disappeared for(int i = removals.size - 1; i >= 0; i--){ - BuildRequest request = removals.get(i); + BuildPlan request = removals.get(i); if(request.animScale <= 0.0001f){ removals.remove(i); @@ -720,7 +720,7 @@ public class MobileInput extends InputHandler implements GestureListener{ int shiftedY = (int)(shiftDeltaY / tilesize); if(Math.abs(shiftedX) > 0 || Math.abs(shiftedY) > 0){ - for(BuildRequest req : selectRequests){ + for(BuildPlan req : selectRequests){ if(req.breaking) continue; //don't shift removal requests req.x += shiftedX; req.y += shiftedY; diff --git a/core/src/mindustry/input/Placement.java b/core/src/mindustry/input/Placement.java index 6c2264d0fe..1d06fbd907 100644 --- a/core/src/mindustry/input/Placement.java +++ b/core/src/mindustry/input/Placement.java @@ -13,7 +13,7 @@ public class Placement{ private static final NormalizeResult result = new NormalizeResult(); private static final NormalizeDrawResult drawResult = new NormalizeDrawResult(); private static Bresenham2 bres = new Bresenham2(); - private static Array points = new Array<>(); + private static Seq points = new Seq<>(); //for pathfinding private static IntFloatMap costs = new IntFloatMap(); @@ -21,7 +21,7 @@ public class Placement{ private static IntSet closed = new IntSet(); /** Normalize a diagonal line into points. */ - public static Array pathfindLine(boolean conveyors, int startX, int startY, int endX, int endY){ + public static Seq pathfindLine(boolean conveyors, int startX, int startY, int endX, int endY){ Pools.freeAll(points); points.clear(); @@ -37,7 +37,7 @@ public class Placement{ } /** Normalize two points into one straight line, no diagonals. */ - public static Array normalizeLine(int startX, int startY, int endX, int endY){ + public static Seq normalizeLine(int startX, int startY, int endX, int endY){ Pools.freeAll(points); points.clear(); if(Math.abs(startX - endX) > Math.abs(startY - endY)){ diff --git a/core/src/mindustry/io/MapIO.java b/core/src/mindustry/io/MapIO.java index b31151331a..f88ebf9a37 100644 --- a/core/src/mindustry/io/MapIO.java +++ b/core/src/mindustry/io/MapIO.java @@ -72,8 +72,8 @@ public class MapIO{ SaveVersion ver = SaveIO.getSaveWriter(version); ver.region("meta", stream, counter, ver::readStringMap); - Pixmap floors = new Pixmap(map.width, map.height, Format.RGBA8888); - Pixmap walls = new Pixmap(map.width, map.height, Format.RGBA8888); + Pixmap floors = new Pixmap(map.width, map.height); + Pixmap walls = new Pixmap(map.width, map.height); int black = 255; int shade = Color.rgba8888(0f, 0f, 0f, 0.5f); CachedTile tile = new CachedTile(){ @@ -137,7 +137,7 @@ public class MapIO{ } public static Pixmap generatePreview(Tiles tiles){ - Pixmap pixmap = new Pixmap(tiles.width, tiles.height, Format.RGBA8888); + Pixmap pixmap = new Pixmap(tiles.width, tiles.height, Format.rgba8888); for(int x = 0; x < pixmap.getWidth(); x++){ for(int y = 0; y < pixmap.getHeight(); y++){ Tile tile = tiles.getn(x, y); diff --git a/core/src/mindustry/io/SaveIO.java b/core/src/mindustry/io/SaveIO.java index d6ff052f12..3ae3996d23 100644 --- a/core/src/mindustry/io/SaveIO.java +++ b/core/src/mindustry/io/SaveIO.java @@ -20,7 +20,7 @@ public class SaveIO{ /** Format header. This is the string 'MSAV' in ASCII. */ public static final byte[] header = {77, 83, 65, 86}; public static final IntMap versions = new IntMap<>(); - public static final Array versionArray = Array.with(new Save1(), new Save2(), new Save3(), new Save4()); + public static final Seq versionArray = Seq.with(new Save1(), new Save2(), new Save3(), new Save4()); static{ for(SaveVersion version : versionArray){ diff --git a/core/src/mindustry/io/SaveVersion.java b/core/src/mindustry/io/SaveVersion.java index 6e17150ca7..0e106b4c3a 100644 --- a/core/src/mindustry/io/SaveVersion.java +++ b/core/src/mindustry/io/SaveVersion.java @@ -6,6 +6,7 @@ import arc.struct.*; import arc.util.*; import arc.util.io.*; import mindustry.content.*; +import mindustry.content.TechTree.*; import mindustry.core.*; import mindustry.ctype.*; import mindustry.game.*; @@ -75,6 +76,11 @@ public abstract class SaveVersion extends SaveFileReader{ state.secinfo.prepare(); } + //flush tech node progress + for(TechNode node : TechTree.all){ + node.save(); + } + writeStringMap(stream, StringMap.of( "saved", Time.millis(), "playtime", headless ? 0 : control.saves.getTotalPlaytime(), @@ -270,7 +276,7 @@ public abstract class SaveVersion extends SaveFileReader{ public void writeEntities(DataOutput stream) throws IOException{ //write team data with entities. - Array data = state.teams.getActive(); + Seq data = state.teams.getActive(); stream.writeInt(data.size); for(TeamData team : data){ stream.writeInt(team.team.id); @@ -337,17 +343,17 @@ public abstract class SaveVersion extends SaveFileReader{ } public void writeContentHeader(DataOutput stream) throws IOException{ - Array[] map = content.getContentMap(); + Seq[] map = content.getContentMap(); int mappable = 0; - for(Array arr : map){ + for(Seq arr : map){ if(arr.size > 0 && arr.first() instanceof MappableContent){ mappable++; } } stream.writeByte(mappable); - for(Array arr : map){ + for(Seq arr : map){ if(arr.size > 0 && arr.first() instanceof MappableContent){ stream.writeByte(arr.first().getContentType().ordinal()); stream.writeShort(arr.size); diff --git a/core/src/mindustry/io/TypeIO.java b/core/src/mindustry/io/TypeIO.java index e5c4103091..641fc91b95 100644 --- a/core/src/mindustry/io/TypeIO.java +++ b/core/src/mindustry/io/TypeIO.java @@ -7,6 +7,8 @@ import arc.util.io.*; import arc.util.pooling.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.content.TechTree.*; import mindustry.ctype.*; import mindustry.entities.bullet.*; import mindustry.entities.units.*; @@ -50,9 +52,9 @@ public class TypeIO{ write.b((byte)5); write.b((byte)map.getContentType().ordinal()); write.s(map.id); - }else if(object instanceof IntArray){ + }else if(object instanceof IntSeq){ write.b((byte)6); - IntArray arr = (IntArray)object; + IntSeq arr = (IntSeq)object; write.s((short)arr.size); for(int i = 0; i < arr.size; i++){ write.i(arr.items[i]); @@ -67,6 +69,11 @@ public class TypeIO{ for(int i = 0; i < ((Point2[])object).length; i++){ write.i(((Point2[])object)[i].pack()); } + }else if(object instanceof TechNode){ + TechNode map = (TechNode)object; + write.b(9); + write.b((byte)map.content.getContentType().ordinal()); + write.s(map.content.id); }else{ throw new IllegalArgumentException("Unknown object type: " + object.getClass()); } @@ -81,9 +88,10 @@ public class TypeIO{ case 3: return read.f(); case 4: return readString(read); case 5: return content.getByID(ContentType.all[read.b()], read.s()); - case 6: short length = read.s(); IntArray arr = new IntArray(); for(int i = 0; i < length; i ++) arr.add(read.i()); return arr; + case 6: short length = read.s(); IntSeq arr = new IntSeq(); for(int i = 0; i < length; i ++) arr.add(read.i()); return arr; case 7: return new Point2(read.i(), read.i()); case 8: byte len = read.b(); Point2[] out = new Point2[len]; for(int i = 0; i < len; i ++) out[i] = Point2.unpack(read.i()); return out; + case 9: return TechTree.getNotNull(content.getByID(ContentType.all[read.b()], read.s())); default: throw new IllegalArgumentException("Unknown object type: " + type); } } @@ -154,7 +162,7 @@ public class TypeIO{ return content.block(read.s()); } - public static void writeRequest(Writes write, BuildRequest request){ + public static void writeRequest(Writes write, BuildPlan request){ write.b(request.breaking ? (byte)1 : 0); write.i(Point2.pack(request.x, request.y)); if(!request.breaking){ @@ -165,8 +173,8 @@ public class TypeIO{ } } - public static BuildRequest readRequest(Reads read){ - BuildRequest currentRequest; + public static BuildPlan readRequest(Reads read){ + BuildPlan currentRequest; byte type = read.b(); int position = read.i(); @@ -176,13 +184,13 @@ public class TypeIO{ } if(type == 1){ //remove - currentRequest = new BuildRequest(Point2.x(position), Point2.y(position)); + currentRequest = new BuildPlan(Point2.x(position), Point2.y(position)); }else{ //place short block = read.s(); byte rotation = read.b(); boolean hasConfig = read.b() == 1; Object config = readObject(read); - currentRequest = new BuildRequest(Point2.x(position), Point2.y(position), rotation, content.block(block)); + currentRequest = new BuildPlan(Point2.x(position), Point2.y(position), rotation, content.block(block)); if(hasConfig){ currentRequest.configure(config); } @@ -191,26 +199,26 @@ public class TypeIO{ return currentRequest; } - public static void writeRequests(Writes write, BuildRequest[] requests){ + public static void writeRequests(Writes write, BuildPlan[] requests){ if(requests == null){ write.s(-1); return; } write.s((short)requests.length); - for(BuildRequest request : requests){ + for(BuildPlan request : requests){ writeRequest(write, request); } } - public static BuildRequest[] readRequests(Reads read){ + public static BuildPlan[] readRequests(Reads read){ short reqamount = read.s(); if(reqamount == -1){ return null; } - BuildRequest[] reqs = new BuildRequest[reqamount]; + BuildPlan[] reqs = new BuildPlan[reqamount]; for(int i = 0; i < reqamount; i++){ - BuildRequest request = readRequest(read); + BuildPlan request = readRequest(read); if(request != null){ reqs[i] = request; } diff --git a/core/src/mindustry/io/legacy/LegacyIO.java b/core/src/mindustry/io/legacy/LegacyIO.java index cfec4b20b5..621533b418 100644 --- a/core/src/mindustry/io/legacy/LegacyIO.java +++ b/core/src/mindustry/io/legacy/LegacyIO.java @@ -8,8 +8,8 @@ import java.io.*; public class LegacyIO{ - public static Array readServers(){ - Array arr = new Array<>(); + public static Seq readServers(){ + Seq arr = new Seq<>(); try{ byte[] bytes = Core.settings.getBytes("server-list"); diff --git a/core/src/mindustry/maps/Map.java b/core/src/mindustry/maps/Map.java index 296180680b..a7af96e78c 100644 --- a/core/src/mindustry/maps/Map.java +++ b/core/src/mindustry/maps/Map.java @@ -80,7 +80,6 @@ public class Map implements Comparable, Publishable{ public void setHighScore(int score){ Core.settings.put("hiscore" + file.nameWithoutExtension(), score); - Vars.data.modified(); } /** Returns the result of applying this map's rules to the specified gamemode.*/ @@ -111,9 +110,9 @@ public class Map implements Comparable, Publishable{ } /** Returns the generation filters that this map uses on load.*/ - public Array filters(){ + public Seq filters(){ if(tags.getInt("build", -1) < 83 && tags.getInt("build", -1) != -1 && tags.get("genfilters", "").isEmpty()){ - return Array.with(); + return Seq.with(); } return maps.readFilters(tags.get("genfilters", "")); } @@ -196,9 +195,9 @@ public class Map implements Comparable, Publishable{ } @Override - public Array extraTags(){ + public Seq extraTags(){ Gamemode mode = Gamemode.attack.valid(this) ? Gamemode.attack : Gamemode.survival; - return Array.with(mode.name()); + return Seq.with(mode.name()); } @Override diff --git a/core/src/mindustry/maps/MapPreviewLoader.java b/core/src/mindustry/maps/MapPreviewLoader.java index 3572846ea7..ebc69eeae4 100644 --- a/core/src/mindustry/maps/MapPreviewLoader.java +++ b/core/src/mindustry/maps/MapPreviewLoader.java @@ -43,8 +43,8 @@ public class MapPreviewLoader extends TextureLoader{ } @Override - public Array getDependencies(String fileName, Fi file, TextureParameter parameter){ - return Array.with(new AssetDescriptor<>("contentcreate", Content.class)); + public Seq getDependencies(String fileName, Fi file, TextureParameter parameter){ + return Seq.with(new AssetDescriptor<>("contentcreate", Content.class)); } public static class MapPreviewParameter extends TextureParameter{ diff --git a/core/src/mindustry/maps/Maps.java b/core/src/mindustry/maps/Maps.java index 183f4158b8..b10b8c6fd1 100644 --- a/core/src/mindustry/maps/Maps.java +++ b/core/src/mindustry/maps/Maps.java @@ -31,8 +31,10 @@ import static mindustry.Vars.*; public class Maps{ /** List of all built-in maps. Filenames only. */ private static String[] defaultMapNames = {"maze", "fortress", "labyrinth", "islands", "tendrils", "caldera", "wasteland", "shattered", "fork", "triad", "veins", "glacier"}; + /** Maps tagged as PvP */ + private static final String[] pvpMaps = {"veins", "glacier"}; /** All maps stored in an ordered array. */ - private Array maps = new Array<>(); + private Seq maps = new Seq<>(); /** Serializer for meta. */ private Json json = new Json(); @@ -56,22 +58,22 @@ 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(@Nullable Map previous){ - return shuffler != null ? shuffler.next(previous) : shuffleMode.next(previous); + public @Nullable Map getNextMap(Gamemode mode, @Nullable Map previous){ + return shuffleMode.next(mode, previous); } /** Returns a list of all maps, including custom ones. */ - public Array all(){ + public Seq all(){ return maps; } /** Returns a list of only custom maps. */ - public Array customMaps(){ + public Seq customMaps(){ return maps.select(m -> m.custom); } /** Returns a list of only default maps. */ - public Array defaultMaps(){ + public Seq defaultMaps(){ return maps.select(m -> !m.custom); } @@ -298,10 +300,10 @@ public class Maps{ /** Reads JSON of filters, returning a new default array if not found.*/ @SuppressWarnings("unchecked") - public Array readFilters(String str){ + public Seq readFilters(String str){ if(str == null || str.isEmpty()){ //create default filters list - Array filters = Array.with( + Seq filters = Seq.with( new ScatterFilter(){{ flooronto = Blocks.stone; block = Blocks.rock; @@ -329,7 +331,7 @@ public class Maps{ return filters; }else{ try{ - return JsonIO.read(Array.class, str); + return JsonIO.read(Seq.class, str); }catch(Throwable e){ e.printStackTrace(); return readFilters(""); @@ -337,8 +339,8 @@ public class Maps{ } } - public void addDefaultOres(Array filters){ - Array ores = content.blocks().select(b -> b.isOverlay() && b.asFloor().oreDefault); + public void addDefaultOres(Seq filters){ + Seq ores = content.blocks().select(b -> b.isOverlay() && b.asFloor().oreDefault); for(Block block : ores){ OreFilter filter = new OreFilter(); filter.threshold = block.asFloor().oreThreshold; @@ -348,7 +350,7 @@ public class Maps{ } } - public String writeWaves(Array groups){ + public String writeWaves(Seq groups){ if(groups == null) return "[]"; StringWriter buffer = new StringWriter(); @@ -364,8 +366,8 @@ public class Maps{ return buffer.toString(); } - public Array readWaves(String str){ - return str == null ? null : str.equals("[]") ? new Array<>() : Array.with(json.fromJson(SpawnGroup[].class, str)); + public Seq readWaves(String str){ + return str == null ? null : str.equals("[]") ? new Seq<>() : Seq.with(json.fromJson(SpawnGroup[].class, str)); } public void loadPreviews(){ @@ -467,26 +469,14 @@ public class Maps{ } public interface MapProvider{ - @Nullable Map next(@Nullable Map previous); + @Nullable Map next(Gamemode mode, @Nullable Map previous); } public enum ShuffleMode implements MapProvider{ - none(map -> null), - all(prev -> { - Array maps = Array.withArrays(Vars.maps.defaultMaps(), Vars.maps.customMaps()); - maps.shuffle(); - return maps.find(m -> m != prev || maps.size == 1); - }), - custom(prev -> { - Array maps = Array.withArrays(Vars.maps.customMaps().isEmpty() ? Vars.maps.defaultMaps() : Vars.maps.customMaps()); - maps.shuffle(); - return maps.find(m -> m != prev || maps.size == 1); - }), - builtin(prev -> { - Array maps = Array.withArrays(Vars.maps.defaultMaps()); - maps.shuffle(); - return maps.find(m -> m != prev || maps.size == 1); - }); + none((mode, map) -> null), + all((mode, prev) -> next(mode, prev, Vars.maps.defaultMaps(), Vars.maps.customMaps())), + custom((mode, prev) -> next(mode, prev, Vars.maps.customMaps().isEmpty() ? Vars.maps.defaultMaps() : Vars.maps.customMaps())), + builtin((mode, prev) -> next(mode, prev, Vars.maps.defaultMaps())); private final MapProvider provider; @@ -494,9 +484,24 @@ public class Maps{ this.provider = provider; } + @SafeVarargs + private static Map next(Gamemode mode, Map prev, Seq... mapArray){ + Seq maps = Seq.withArrays((Object[])mapArray); + maps.shuffle(); + + return maps.find(m -> (m != prev || maps.size == 1) && valid(mode, m)); + } + + private static boolean valid(Gamemode mode, Map map){ + boolean pvp = !map.custom && Structs.contains(pvpMaps, map.file.nameWithoutExtension()); + if(mode == Gamemode.survival || mode == Gamemode.attack || mode == Gamemode.sandbox) return !pvp; + if(mode == Gamemode.pvp) return map.custom || pvp; + return true; + } + @Override - public Map next(@Nullable Map previous){ - return provider.next(previous); + public Map next(Gamemode mode, @Nullable Map previous){ + return provider.next(mode, previous); } } } diff --git a/core/src/mindustry/maps/filters/CoreSpawnFilter.java b/core/src/mindustry/maps/filters/CoreSpawnFilter.java index b418c3d56a..fa3b270d4d 100644 --- a/core/src/mindustry/maps/filters/CoreSpawnFilter.java +++ b/core/src/mindustry/maps/filters/CoreSpawnFilter.java @@ -21,7 +21,7 @@ public class CoreSpawnFilter extends GenerateFilter{ @Override public void apply(Tiles tiles, GenerateInput in){ - IntArray spawns = new IntArray(); + IntSeq spawns = new IntSeq(); for(Tile tile : tiles){ if(tile.team() == state.rules.defaultTeam && tile.block() instanceof CoreBlock && tile.isCenter()){ spawns.add(tile.pos()); diff --git a/core/src/mindustry/maps/filters/EnemySpawnFilter.java b/core/src/mindustry/maps/filters/EnemySpawnFilter.java index 53f97e488c..ac64761632 100644 --- a/core/src/mindustry/maps/filters/EnemySpawnFilter.java +++ b/core/src/mindustry/maps/filters/EnemySpawnFilter.java @@ -19,7 +19,7 @@ public class EnemySpawnFilter extends GenerateFilter{ @Override public void apply(Tiles tiles, GenerateInput in){ - IntArray spawns = new IntArray(); + IntSeq spawns = new IntSeq(); for(Tile tile : tiles){ if(tile.overlay() == Blocks.spawn){ spawns.add(tile.pos()); diff --git a/core/src/mindustry/maps/filters/MedianFilter.java b/core/src/mindustry/maps/filters/MedianFilter.java index cf3fbc2b29..c70bf6d71b 100644 --- a/core/src/mindustry/maps/filters/MedianFilter.java +++ b/core/src/mindustry/maps/filters/MedianFilter.java @@ -11,7 +11,7 @@ import static mindustry.Vars.content; public class MedianFilter extends GenerateFilter{ float radius = 2; float percentile = 0.5f; - IntArray blocks = new IntArray(), floors = new IntArray(); + IntSeq blocks = new IntSeq(), floors = new IntSeq(); @Override public FilterOption[] options(){ diff --git a/core/src/mindustry/maps/filters/OreMedianFilter.java b/core/src/mindustry/maps/filters/OreMedianFilter.java index 519b642ab4..43c589d586 100644 --- a/core/src/mindustry/maps/filters/OreMedianFilter.java +++ b/core/src/mindustry/maps/filters/OreMedianFilter.java @@ -12,7 +12,7 @@ public class OreMedianFilter extends GenerateFilter{ public float radius = 2; public float percentile = 0.5f; - private IntArray blocks = new IntArray(); + private IntSeq blocks = new IntSeq(); @Override public FilterOption[] options(){ diff --git a/core/src/mindustry/maps/filters/RandomItemFilter.java b/core/src/mindustry/maps/filters/RandomItemFilter.java index dc20cd6ace..c7b2d7e419 100644 --- a/core/src/mindustry/maps/filters/RandomItemFilter.java +++ b/core/src/mindustry/maps/filters/RandomItemFilter.java @@ -7,7 +7,7 @@ import mindustry.world.*; import mindustry.world.blocks.storage.*; public class RandomItemFilter extends GenerateFilter{ - public Array drops = new Array<>(); + public Seq drops = new Seq<>(); public float chance = 0.3f; @Override diff --git a/core/src/mindustry/maps/generators/BaseGenerator.java b/core/src/mindustry/maps/generators/BaseGenerator.java index 98d68b26d4..db507d2239 100644 --- a/core/src/mindustry/maps/generators/BaseGenerator.java +++ b/core/src/mindustry/maps/generators/BaseGenerator.java @@ -26,12 +26,16 @@ public class BaseGenerator{ private Tiles tiles; private Team team; private ObjectMap ores = new ObjectMap<>(); - private Array cores; + private Seq cores; - public void generate(Tiles tiles, Array cores, Tile spawn, Team team, Sector sector){ + public void generate(Tiles tiles, Seq cores, Tile spawn, Team team, Sector sector){ this.tiles = tiles; this.team = team; this.cores = cores; + + //don't generate bases when there are no loaded schematics + if(bases.cores.isEmpty()) return; + Mathf.random.setSeed(sector.id); for(Block block : content.blocks()){ @@ -42,8 +46,8 @@ public class BaseGenerator{ float costBudget = 1000; - Array wallsSmall = content.blocks().select(b -> b instanceof Wall && b.size == 1); - Array wallsLarge = content.blocks().select(b -> b instanceof Wall && b.size == 2); + Seq wallsSmall = content.blocks().select(b -> b instanceof Wall && b.size == 1); + Seq wallsLarge = content.blocks().select(b -> b instanceof Wall && b.size == 2); float bracket = 0.1f; int wallAngle = 70; //180 for full coverage @@ -69,7 +73,7 @@ public class BaseGenerator{ if(!tile.block().alwaysReplace) return; if((tile.drop() != null || (tile.floor().liquidDrop != null && Mathf.chance(nonResourceChance * 2))) && Mathf.chance(resourceChance)){ - Array parts = bases.forResource(tile.drop() != null ? tile.drop() : tile.floor().liquidDrop); + Seq parts = bases.forResource(tile.drop() != null ? tile.drop() : tile.floor().liquidDrop); if(!parts.isEmpty()){ tryPlace(parts.random(), tile.x, tile.y); } diff --git a/core/src/mindustry/maps/generators/BasicGenerator.java b/core/src/mindustry/maps/generators/BasicGenerator.java index 5035662d28..ac5323fa16 100644 --- a/core/src/mindustry/maps/generators/BasicGenerator.java +++ b/core/src/mindustry/maps/generators/BasicGenerator.java @@ -14,7 +14,7 @@ import mindustry.world.*; import static mindustry.Vars.*; public abstract class BasicGenerator implements WorldGenerator{ - protected static final ShortArray ints1 = new ShortArray(), ints2 = new ShortArray(); + protected static final ShortSeq ints1 = new ShortSeq(), ints2 = new ShortSeq(); protected Rand rand = new Rand(); @@ -124,7 +124,7 @@ public abstract class BasicGenerator implements WorldGenerator{ }); } - public void ores(Array ores){ + public void ores(Seq ores){ pass((x, y) -> { if(floor.asFloor().isLiquid) return; @@ -297,7 +297,7 @@ public abstract class BasicGenerator implements WorldGenerator{ } } - public void brush(Array path, int rad){ + public void brush(Seq path, int rad){ path.each(tile -> erase(tile.x, tile.y, rad)); } @@ -313,7 +313,7 @@ public abstract class BasicGenerator implements WorldGenerator{ } } - public Array pathfind(int startX, int startY, int endX, int endY, TileHueristic th, DistanceHeuristic dh){ + public Seq pathfind(int startX, int startY, int endX, int endY, TileHueristic th, DistanceHeuristic dh){ return Astar.pathfind(startX, startY, endX, endY, th, dh, tile -> world.getDarkness(tile.x, tile.y) <= 1f); } @@ -331,7 +331,7 @@ public abstract class BasicGenerator implements WorldGenerator{ } public void inverseFloodFill(Tile start){ - IntArray arr = new IntArray(); + IntSeq arr = new IntSeq(); arr.add(start.pos()); while(!arr.isEmpty()){ int i = arr.pop(); diff --git a/core/src/mindustry/maps/planet/TODOPlanetGenerator.java b/core/src/mindustry/maps/planet/TODOPlanetGenerator.java index dc838ea5a4..a3478e5e7a 100644 --- a/core/src/mindustry/maps/planet/TODOPlanetGenerator.java +++ b/core/src/mindustry/maps/planet/TODOPlanetGenerator.java @@ -143,7 +143,7 @@ public class TODOPlanetGenerator extends PlanetGenerator{ float constraint = 1.3f; float radius = width / 2f / Mathf.sqrt3; int rooms = rand.random(2, 5); - Array array = new Array<>(); + Seq array = new Seq<>(); for(int i = 0; i < rooms; i++){ Tmp.v1.trns(rand.random(360f), rand.random(radius / constraint)); @@ -156,7 +156,7 @@ public class TODOPlanetGenerator extends PlanetGenerator{ //check positions on the map to place the player spawn. this needs to be in the corner of the map Room spawn = null; - Array enemies = new Array<>(); + Seq enemies = new Seq<>(); int enemySpawns = rand.chance(0.3) ? 2 : 1; int offset = rand.nextInt(360); float length = width/2.55f - rand.random(13, 23); @@ -212,7 +212,7 @@ public class TODOPlanetGenerator extends PlanetGenerator{ inverseFloodFill(tiles.getn(spawn.x, spawn.y)); - Array ores = Array.with(Blocks.oreCopper, Blocks.oreLead); + Seq ores = Seq.with(Blocks.oreCopper, Blocks.oreLead); float poles = Math.abs(sector.tile.v.y); float nmag = 0.5f; float scl = 1f; @@ -230,7 +230,7 @@ public class TODOPlanetGenerator extends PlanetGenerator{ ores.add(Blocks.oreThorium); } - FloatArray frequencies = new FloatArray(); + FloatSeq frequencies = new FloatSeq(); for(int i = 0; i < ores.size; i++){ frequencies.add(rand.random(-0.09f, 0.01f) - i * 0.01f); } diff --git a/core/src/mindustry/mod/ContentParser.java b/core/src/mindustry/mod/ContentParser.java index 2d09b45353..000d3d6521 100644 --- a/core/src/mindustry/mod/ContentParser.java +++ b/core/src/mindustry/mod/ContentParser.java @@ -7,7 +7,7 @@ import arc.files.*; import arc.func.*; import arc.graphics.*; import arc.mock.*; -import arc.struct.Array; +import arc.struct.Seq; import arc.struct.*; import arc.util.ArcAnnotate.*; import arc.util.*; @@ -28,6 +28,7 @@ import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.*; import mindustry.world.consumers.*; +import mindustry.world.draw.*; import mindustry.world.meta.*; import java.lang.reflect.*; @@ -102,8 +103,8 @@ public class ContentParser{ }}; /** Stores things that need to be parsed fully, e.g. reading fields of content. * This is done to accomodate binding of content names first.*/ - private Array reads = new Array<>(); - private Array postreads = new Array<>(); + private Seq reads = new Seq<>(); + private Seq postreads = new Seq<>(); private ObjectSet toBeParsed = new ObjectSet<>(); private LoadedMod currentMod; private Content currentContent; @@ -143,6 +144,11 @@ public class ContentParser{ } } + //try to load DrawBlock by instantiating it + if(type == DrawBlock.class && jsonData.isString()){ + return Reflect.make("mindustry.world.draw." + Strings.capitalize(jsonData.asString())); + } + if(Content.class.isAssignableFrom(type)){ ContentType ctype = contentTypes.getThrow(type, () -> new IllegalArgumentException("No content type for class: " + type.getSimpleName())); String prefix = currentMod != null ? currentMod.name + "-" : ""; @@ -368,7 +374,7 @@ public class ContentParser{ private void init(){ for(ContentType type : ContentType.all){ - Array arr = Vars.content.getBy(type); + Seq arr = Vars.content.getBy(type); if(!arr.isEmpty()){ Class c = arr.first().getClass(); //get base content class, skipping intermediates @@ -457,9 +463,9 @@ public class ContentParser{ if(t.getMessage() != null && t instanceof JsonParseException){ builder.append("[accent][[JsonParse][] ").append(":\n").append(t.getMessage()); }else if(t instanceof NullPointerException){ - builder.append(Strings.parseException(t, true)); + builder.append(Strings.neatError(t)); }else{ - Array causes = Strings.getCauses(t); + Seq causes = Strings.getCauses(t); for(Throwable e : causes){ builder.append("[accent][[").append(e.getClass().getSimpleName().replace("Exception", "")) .append("][] ") @@ -536,7 +542,7 @@ public class ContentParser{ private void checkNullFields(Object object){ if(object instanceof Number || object instanceof String || toBeParsed.contains(object)) return; - parser.getFields(object.getClass()).values().toArray().each(field -> { + parser.getFields(object.getClass()).values().toSeq().each(field -> { try{ if(field.field.getType().isPrimitive()) return; diff --git a/core/src/mindustry/mod/Mods.java b/core/src/mindustry/mod/Mods.java index 9961eb8f8c..627836f414 100644 --- a/core/src/mindustry/mod/Mods.java +++ b/core/src/mindustry/mod/Mods.java @@ -33,13 +33,13 @@ public class Mods implements Loadable{ private Json json = new Json(); private @Nullable Scripts scripts; private ContentParser parser = new ContentParser(); - private ObjectMap> bundles = new ObjectMap<>(); + private ObjectMap> bundles = new ObjectMap<>(); private ObjectSet specialFolders = ObjectSet.with("bundles", "sprites", "sprites-override"); private int totalSprites; private MultiPacker packer; - private Array mods = new Array<>(); + private Seq mods = new Seq<>(); private ObjectMap, ModMeta> metas = new ObjectMap<>(); private boolean requiresReload, createdAtlas; @@ -103,8 +103,8 @@ public class Mods implements Loadable{ packer = new MultiPacker(); eachEnabled(mod -> { - Array sprites = mod.root.child("sprites").findAll(f -> f.extension().equals("png")); - Array overrides = mod.root.child("sprites-override").findAll(f -> f.extension().equals("png")); + Seq sprites = mod.root.child("sprites").findAll(f -> f.extension().equals("png")); + Seq overrides = mod.root.child("sprites-override").findAll(f -> f.extension().equals("png")); packSprites(sprites, mod, true); packSprites(overrides, mod, false); Log.debug("Packed @ images for mod '@'.", sprites.size + overrides.size, mod.meta.name); @@ -127,7 +127,7 @@ public class Mods implements Loadable{ } } - private void packSprites(Array sprites, LoadedMod mod, boolean prefix){ + private void packSprites(Seq sprites, LoadedMod mod, boolean prefix){ for(Fi file : sprites){ try(InputStream stream = file.read()){ byte[] bytes = Streams.copyBytes(stream, Math.max((int)file.length(), 512)); @@ -165,16 +165,17 @@ public class Mods implements Loadable{ } } - TextureFilter filter = Core.settings.getBool("linear") ? TextureFilter.Linear : TextureFilter.Nearest; + TextureFilter filter = Core.settings.getBool("linear") ? TextureFilter.linear : TextureFilter.nearest; //flush so generators can use these sprites packer.flush(filter, Core.atlas); //generate new icons - for(Array arr : content.getContentMap()){ + for(Seq arr : content.getContentMap()){ arr.each(c -> { if(c instanceof UnlockableContent && c.minfo.mod != null){ UnlockableContent u = (UnlockableContent)c; + u.load(); u.createIcons(packer); } }); @@ -305,16 +306,16 @@ public class Mods implements Loadable{ } } - private void topoSort(LoadedMod mod, Array stack, ObjectSet visited){ + private void topoSort(LoadedMod mod, Seq stack, ObjectSet visited){ visited.add(mod); mod.dependencies.each(m -> !visited.contains(m), m -> topoSort(m, stack, visited)); stack.add(mod); } /** @return mods ordered in the correct way needed for dependencies. */ - private Array orderedMods(){ + private Seq orderedMods(){ ObjectSet visited = new ObjectSet<>(); - Array result = new Array<>(); + Seq result = new Seq<>(); eachEnabled(mod -> { if(!visited.contains(mod)){ topoSort(mod, result, visited); @@ -346,7 +347,7 @@ public class Mods implements Loadable{ for(Fi file : folder.list()){ if(file.name().startsWith("bundle") && file.extension().equals("properties")){ String name = file.nameWithoutExtension(); - bundles.get(name, Array::new).add(file); + bundles.get(name, Seq::new).add(file); } } } @@ -357,7 +358,7 @@ public class Mods implements Loadable{ while(bundle != null){ String str = bundle.getLocale().toString(); String locale = "bundle" + (str.isEmpty() ? "" : "_" + str); - for(Fi file : bundles.get(locale, Array::new)){ + for(Fi file : bundles.get(locale, Seq::new)){ try{ PropertiesUtils.load(bundle.getProperties(), file.reader()); }catch(Throwable e){ @@ -451,8 +452,7 @@ public class Mods implements Loadable{ content.init(); content.load(); content.loadColors(); - data.load(); - Core.atlas.getTextures().each(t -> t.setFilter(Core.settings.getBool("linear") ? TextureFilter.Linear : TextureFilter.Nearest)); + Core.atlas.getTextures().each(t -> t.setFilter(Core.settings.getBool("linear") ? TextureFilter.linear : TextureFilter.nearest)); requiresReload = false; loadIcons(); @@ -469,7 +469,7 @@ public class Mods implements Loadable{ if(mod.root.child("scripts").exists()){ content.setCurrentMod(mod); //if there's only one script file, use it (for backwards compatibility); if there isn't, use "main.js" - Array allScripts = mod.root.child("scripts").findAll(f -> f.extEquals("js")); + Seq allScripts = mod.root.child("scripts").findAll(f -> f.extEquals("js")); Fi main = allScripts.size == 1 ? allScripts.first() : mod.root.child("scripts").child("main.js"); if(main.exists() && !main.isDirectory()){ try{ @@ -480,13 +480,11 @@ public class Mods implements Loadable{ }catch(Throwable e){ Core.app.post(() -> { Log.err("Error loading main script @ for mod @.", main.name(), mod.meta.name); - e.printStackTrace(); + Log.err(e); }); } }else{ - Core.app.post(() -> { - Log.err("No main.js found for mod @.", mod.meta.name); - }); + Core.app.post(() -> Log.err("No main.js found for mod @.", mod.meta.name)); } } }); @@ -519,7 +517,7 @@ public class Mods implements Loadable{ } } - Array runs = new Array<>(); + Seq runs = new Seq<>(); for(LoadedMod mod : orderedMods()){ if(mod.root.child("content").exists()){ @@ -562,7 +560,7 @@ public class Mods implements Loadable{ } /** @return a list of mods and versions, in the format name:version. */ - public Array getModStrings(){ + public Seq getModStrings(){ return mods.select(l -> !l.meta.hidden && l.enabled()).map(l -> l.name + ":" + l.meta.version); } @@ -579,9 +577,9 @@ public class Mods implements Loadable{ /** @return the mods that the client is missing. * The inputted array is changed to contain the extra mods that the client has but the server doesn't.*/ - public Array getIncompatibility(Array out){ - Array mods = getModStrings(); - Array result = mods.copy(); + public Seq getIncompatibility(Seq out){ + Seq mods = getModStrings(); + Seq result = mods.copy(); for(String mod : mods){ if(out.remove(mod)){ result.remove(mod); @@ -590,7 +588,7 @@ public class Mods implements Loadable{ return result; } - public Array list(){ + public Seq list(){ return mods; } @@ -668,7 +666,7 @@ public class Mods implements Loadable{ return new LoadedMod(sourceFile, zip, mainMod, meta); } - /** Represents a plugin that has been loaded from a jar file.*/ + /** Represents a mod's state. May be a jar file, folder or zip. */ public static class LoadedMod implements Publishable, Disposable{ /** The location of this mod's zip file/folder on the disk. */ public final Fi file; @@ -681,11 +679,11 @@ public class Mods implements Loadable{ /** This mod's metadata. */ public final ModMeta meta; /** This mod's dependencies as already-loaded mods. */ - public Array dependencies = new Array<>(); + public Seq dependencies = new Seq<>(); /** All missing dependencies of this mod as strings. */ - public Array missingDependencies = new Array<>(); + public Seq missingDependencies = new Seq<>(); /** Script files to run. */ - public Array scripts = new Array<>(); + public Seq scripts = new Seq<>(); /** Content with intialization code. */ public ObjectSet erroredContent = new ObjectSet<>(); /** Current state of this mod. */ @@ -802,10 +800,10 @@ public class Mods implements Loadable{ } } - /** Plugin metadata information.*/ + /** Mod metadata information.*/ public static class ModMeta{ public String name, displayName, author, description, version, main, minGameVersion; - public Array dependencies = Array.with(); + 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 c25a34fb66..13a318b383 100644 --- a/core/src/mindustry/mod/Scripts.java +++ b/core/src/mindustry/mod/Scripts.java @@ -8,25 +8,24 @@ import arc.util.*; import arc.util.Log.*; import mindustry.*; import mindustry.mod.Mods.*; -import org.mozilla.javascript.*; -import org.mozilla.javascript.commonjs.module.*; -import org.mozilla.javascript.commonjs.module.provider.*; +import rhino.*; +import rhino.module.*; +import rhino.module.provider.*; import java.io.*; import java.net.*; import java.util.regex.*; public class Scripts implements Disposable{ - private final static Object[] emptyObjects = {}; - private final Array blacklist = Array.with("net", "files", "reflect", "javax", "rhino", "file", "channels", "jdk", + private final Seq blacklist = Seq.with("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", "arc.events", "java.util.function", "java.util.stream"); - private final Array whitelist = Array.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen."); + private final Seq whitelist = Seq.with("mindustry.net", "netserver", "netclient", "com.sun.proxy.$proxy", "mindustry.gen."); private final Context context; - private Scriptable scope; + private final Scriptable scope; private boolean errored; private LoadedMod currentMod = null; - private Array events = new Array<>(); + private Seq events = new Seq<>(); public Scripts(){ Time.mark(); @@ -34,6 +33,7 @@ public class Scripts implements Disposable{ context = Vars.platform.getScriptContext(); context.setClassShutter(type -> !blacklist.contains(type.toLowerCase()::contains) || whitelist.contains(type.toLowerCase()::contains)); context.getWrapFactory().setJavaPrimitiveWrap(false); + context.setLanguageVersion(Context.VERSION_ES6); scope = new ImporterTopLevel(context); @@ -54,12 +54,8 @@ public class Scripts implements Disposable{ public String runConsole(String text){ try{ Object o = context.evaluateString(scope, text, "console.js", 1, null); - if(o instanceof NativeJavaObject){ - o = ((NativeJavaObject)o).unwrap(); - } - if(o instanceof Undefined){ - o = "undefined"; - } + if(o instanceof NativeJavaObject) o = ((NativeJavaObject)o).unwrap(); + if(o instanceof Undefined) o = "undefined"; return String.valueOf(o); }catch(Throwable t){ return getError(t); @@ -96,7 +92,9 @@ public class Scripts implements Disposable{ //inject script info into file (TODO maybe rhino handles this?) context.evaluateString(scope, "modName = \"" + currentMod.name + "\"\nscriptName = \"" + file + "\"", "initscript.js", 1, null); } - context.evaluateString(scope, script, file, 1, null); + context.evaluateString(scope, + "(function(){\n" + script + "\n})();", + file, 0, null); return true; }catch(Throwable t){ if(currentMod != null){ diff --git a/core/src/mindustry/net/Administration.java b/core/src/mindustry/net/Administration.java index 0afc7a33c1..a9b5ff38c2 100644 --- a/core/src/mindustry/net/Administration.java +++ b/core/src/mindustry/net/Administration.java @@ -20,11 +20,11 @@ import static mindustry.game.EventType.*; public class Administration{ /** All player info. Maps UUIDs to info. This persists throughout restarts. */ private ObjectMap playerInfo = new ObjectMap<>(); - private Array bannedIPs = new Array<>(); - private Array whitelist = new Array<>(); - private Array chatFilters = new Array<>(); - private Array actionFilters = new Array<>(); - private Array subnetBans = new Array<>(); + 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(){ @@ -97,7 +97,7 @@ public class Administration{ }); } - public Array getSubnetBans(){ + public Seq getSubnetBans(){ return subnetBans; } @@ -256,8 +256,8 @@ public class Administration{ /** * Returns list of all players with admin status */ - public Array getAdmins(){ - Array result = new Array<>(); + public Seq getAdmins(){ + Seq result = new Seq<>(); for(PlayerInfo info : playerInfo.values()){ if(info.admin){ result.add(info); @@ -269,8 +269,8 @@ public class Administration{ /** * Returns list of all players which are banned */ - public Array getBanned(){ - Array result = new Array<>(); + public Seq getBanned(){ + Seq result = new Seq<>(); for(PlayerInfo info : playerInfo.values()){ if(info.banned){ result.add(info); @@ -282,18 +282,18 @@ public class Administration{ /** * Returns all banned IPs. This does not include the IPs of ID-banned players. */ - public Array getBannedIPs(){ + public Seq getBannedIPs(){ return bannedIPs; } /** - * Makes a player an admin. Returns whether this player was already an admin. + * Makes a player an admin. + * @return whether this player was already an admin. */ public boolean adminPlayer(String id, String usid){ PlayerInfo info = getCreateInfo(id); - if(info.admin && info.adminUsid != null && info.adminUsid.equals(usid)) - return false; + if(info.admin && info.adminUsid != null && info.adminUsid.equals(usid)) return false; info.adminUsid = usid; info.admin = true; @@ -303,13 +303,13 @@ public class Administration{ } /** - * Makes a player no longer an admin. Returns whether this player was an admin in the first place. + * Makes a player no longer an admin. + * @return whether this player was an admin in the first place. */ public boolean unAdminPlayer(String id){ PlayerInfo info = getCreateInfo(id); - if(!info.admin) - return false; + if(!info.admin) return false; info.admin = false; save(); @@ -384,8 +384,8 @@ public class Administration{ return result; } - public Array findByIPs(String ip){ - Array result = new Array<>(); + public Seq findByIPs(String ip){ + Seq result = new Seq<>(); for(PlayerInfo info : playerInfo.values()){ if(info.ips.contains(ip, false)){ @@ -413,8 +413,8 @@ public class Administration{ return null; } - public Array getWhitelisted(){ - return playerInfo.values().toArray().select(p -> isWhitelisted(p.id, p.adminUsid)); + public Seq getWhitelisted(){ + return playerInfo.values().toSeq().select(p -> isWhitelisted(p.id, p.adminUsid)); } private PlayerInfo getCreateInfo(String id){ @@ -440,9 +440,9 @@ public class Administration{ if(!loadLegacy()){ //load default data playerInfo = Core.settings.getJson("player-data", ObjectMap.class, ObjectMap::new); - bannedIPs = Core.settings.getJson("ip-bans", Array.class, Array::new); - whitelist = Core.settings.getJson("whitelist-ids", Array.class, Array::new); - subnetBans = Core.settings.getJson("banned-subnets", Array.class, Array::new); + bannedIPs = Core.settings.getJson("ip-bans", Seq.class, Seq::new); + whitelist = Core.settings.getJson("whitelist-ids", Seq.class, Seq::new); + subnetBans = Core.settings.getJson("banned-subnets", Seq.class, Seq::new); }else{ //save over loaded legacy data save(); @@ -631,8 +631,8 @@ public class Administration{ public static class PlayerInfo{ public String id; public String lastName = "", lastIP = ""; - public Array ips = new Array<>(); - public Array names = new Array<>(); + public Seq ips = new Seq<>(); + public Seq names = new Seq<>(); public String adminUsid; public int timesKicked; public int timesJoined; diff --git a/core/src/mindustry/net/ArcNetProvider.java b/core/src/mindustry/net/ArcNetProvider.java index 400f99f772..ea30157955 100644 --- a/core/src/mindustry/net/ArcNetProvider.java +++ b/core/src/mindustry/net/ArcNetProvider.java @@ -198,7 +198,7 @@ public class ArcNetProvider implements NetProvider{ @Override public void discoverServers(Cons callback, Runnable done){ - Array foundAddresses = new Array<>(); + Seq foundAddresses = new Seq<>(); client.discoverHosts(port, multicastGroup, multicastPort, 3000, packet -> { Core.app.post(() -> { try{ diff --git a/core/src/mindustry/net/CrashSender.java b/core/src/mindustry/net/CrashSender.java index 184c7b96ec..0fb44e1e62 100644 --- a/core/src/mindustry/net/CrashSender.java +++ b/core/src/mindustry/net/CrashSender.java @@ -24,7 +24,7 @@ public class CrashSender{ public static void log(Throwable exception){ try{ - Core.settings.getDataDirectory().child("crashes").child("crash_" + System.currentTimeMillis() + ".txt").writeString(Strings.parseException(exception, true)); + Core.settings.getDataDirectory().child("crashes").child("crash_" + System.currentTimeMillis() + ".txt").writeString(Strings.neatError(exception)); }catch(Throwable ignored){ } diff --git a/core/src/mindustry/net/Net.java b/core/src/mindustry/net/Net.java index 7096947e0b..f99ec4d495 100644 --- a/core/src/mindustry/net/Net.java +++ b/core/src/mindustry/net/Net.java @@ -23,7 +23,7 @@ public class Net{ private boolean clientLoaded; private @Nullable StreamBuilder currentStream; - private final Array packetQueue = new Array<>(); + private final Seq packetQueue = new Seq<>(); private final ObjectMap, Cons> clientListeners = new ObjectMap<>(); private final ObjectMap, Cons2> serverListeners = new ObjectMap<>(); private final IntMap streams = new IntMap<>(); @@ -56,7 +56,7 @@ public class Net{ error = Core.bundle.get("error.io"); }else if(error.equals("mismatch")){ error = Core.bundle.get("error.mismatch"); - }else if(error.contains("port out of range") || error.contains("invalid argument") || (error.contains("invalid") && error.contains("address")) || Strings.parseException(e, true).contains("address associated")){ + }else if(error.contains("port out of range") || error.contains("invalid argument") || (error.contains("invalid") && error.contains("address")) || Strings.neatError(e).contains("address associated")){ error = Core.bundle.get("error.invalidaddress"); }else if(error.contains("connection refused") || error.contains("route to host") || type.contains("unknownhost")){ error = Core.bundle.get("error.unreachable"); diff --git a/core/src/mindustry/net/NetConnection.java b/core/src/mindustry/net/NetConnection.java index a6c5266fc7..3fbc5ada21 100644 --- a/core/src/mindustry/net/NetConnection.java +++ b/core/src/mindustry/net/NetConnection.java @@ -27,7 +27,7 @@ public abstract class NetConnection{ /** Timestamp of last recieved snapshot. */ public long lastRecievedClientTime; /** Build requests that have been recently rejected. This is cleared every snapshot. */ - public Array rejectedRequests = new Array<>(); + public Seq rejectedRequests = new Seq<>(); public boolean hasConnected, hasBegunConnecting, hasDisconnected; public float viewWidth, viewHeight, viewX, viewY; diff --git a/core/src/mindustry/net/Packets.java b/core/src/mindustry/net/Packets.java index d842bbd331..afe4016091 100644 --- a/core/src/mindustry/net/Packets.java +++ b/core/src/mindustry/net/Packets.java @@ -159,7 +159,7 @@ public class Packets{ public static class ConnectPacket implements Packet{ public int version; public String versionType; - public Array mods; + public Seq mods; public String name, uuid, usid; public boolean mobile; public int color; @@ -196,7 +196,7 @@ public class Packets{ mobile = buffer.get() == 1; color = buffer.getInt(); int totalMods = buffer.get(); - mods = new Array<>(totalMods); + mods = new Seq<>(totalMods); for(int i = 0; i < totalMods; i++){ mods.add(TypeIO.readString(buffer)); } diff --git a/core/src/mindustry/type/Item.java b/core/src/mindustry/type/Item.java index 58f3b805fc..bd9e28b66e 100644 --- a/core/src/mindustry/type/Item.java +++ b/core/src/mindustry/type/Item.java @@ -53,7 +53,7 @@ public class Item extends UnlockableContent{ } /** Allocates a new array containing all items that generate ores. */ - public static Array getAllOres(){ + public static Seq getAllOres(){ return content.blocks().select(b -> b instanceof OreBlock).map(b -> ((Floor)b).itemDrop); } } diff --git a/core/src/mindustry/type/ItemStack.java b/core/src/mindustry/type/ItemStack.java index 99957c6fcb..a8a765c4df 100644 --- a/core/src/mindustry/type/ItemStack.java +++ b/core/src/mindustry/type/ItemStack.java @@ -1,6 +1,6 @@ package mindustry.type; -import arc.struct.Array; +import arc.struct.Seq; import mindustry.content.Items; public class ItemStack implements Comparable{ @@ -51,8 +51,8 @@ public class ItemStack implements Comparable{ return stacks; } - public static Array list(Object... items){ - Array stacks = new Array<>(items.length / 2); + public static Seq list(Object... items){ + Seq stacks = new Seq<>(items.length / 2); for(int i = 0; i < items.length; i += 2){ stacks.add(new ItemStack((Item)items[i], ((Number)items[i + 1]).intValue())); } diff --git a/core/src/mindustry/type/Planet.java b/core/src/mindustry/type/Planet.java index c3d13fe62b..e1b47919be 100644 --- a/core/src/mindustry/type/Planet.java +++ b/core/src/mindustry/type/Planet.java @@ -34,7 +34,7 @@ public class Planet extends UnlockableContent{ /** Generator that will make the planet. Can be null for planets that don't need to be landed on. */ public @Nullable PlanetGenerator generator; /** Array of sectors; directly maps to tiles in the grid. */ - public @NonNull Array sectors; + public @NonNull Seq sectors; /** Radius of this planet's sphere. Does not take into account sattelites. */ public float radius; /** Orbital radius around the sun. Do not change unless you know exactly what you are doing.*/ @@ -62,9 +62,9 @@ public class Planet extends UnlockableContent{ /** The root parent of the whole solar system this planet is in. */ public @NonNull Planet solarSystem; /** All planets orbiting this one, in ascending order of radius. */ - public Array children = new Array<>(); + public Seq children = new Seq<>(); /** Sattelites orbiting this planet. */ - public Array satellites = new Array<>(); + public Seq satellites = new Seq<>(); /** Loads the mesh. Clientside only. Defaults to a boring sphere mesh. */ protected Prov meshLoader = () -> new ShaderSphereMesh(this, Shaders.unlit, 2); @@ -77,7 +77,7 @@ public class Planet extends UnlockableContent{ if(sectorSize > 0){ grid = PlanetGrid.create(sectorSize); - sectors = new Array<>(grid.tiles.length); + 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())); } @@ -103,7 +103,7 @@ public class Planet extends UnlockableContent{ sector.generate(); } }else{ - sectors = new Array<>(); + sectors = new Seq<>(); } //total radius is initially just the radius diff --git a/core/src/mindustry/type/Publishable.java b/core/src/mindustry/type/Publishable.java index 5e99f2b4b5..8c8b32edde 100644 --- a/core/src/mindustry/type/Publishable.java +++ b/core/src/mindustry/type/Publishable.java @@ -24,8 +24,8 @@ public interface Publishable{ /** @return a preview file PNG. */ Fi createSteamPreview(String id); /** @return any extra tags to add to this item.*/ - default Array extraTags(){ - return new Array<>(0); + default Seq extraTags(){ + return new Seq<>(0); } /** @return whether this item is or was once on the workshop.*/ default boolean hasSteamID(){ diff --git a/core/src/mindustry/type/Sector.java b/core/src/mindustry/type/Sector.java index 14baf187f9..db1389fe6a 100644 --- a/core/src/mindustry/type/Sector.java +++ b/core/src/mindustry/type/Sector.java @@ -94,8 +94,10 @@ public class Sector{ return (normal.dot(light) + 1f) / 2f; } + /** @return the sector size, in tiles */ public int getSize(){ - return (int)(rect.radius * 3200); + int res = (int)(rect.radius * 3200); + return res % 2 == 0 ? res : res + 1; } //TODO implement @@ -239,6 +241,8 @@ public class Sector{ /** Has rain. */ rainy, /** Has snow. */ - snowy + snowy, + /** Has sandstorms. */ + desert } } diff --git a/core/src/mindustry/type/SectorPreset.java b/core/src/mindustry/type/SectorPreset.java index 7e19736e3b..8c1bca2514 100644 --- a/core/src/mindustry/type/SectorPreset.java +++ b/core/src/mindustry/type/SectorPreset.java @@ -5,11 +5,10 @@ import arc.func.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.ArcAnnotate.*; -import mindustry.content.*; import mindustry.ctype.*; import mindustry.game.EventType.*; -import mindustry.game.*; import mindustry.game.Objectives.*; +import mindustry.game.*; import mindustry.maps.generators.*; import static mindustry.Vars.*; @@ -18,17 +17,11 @@ public class SectorPreset extends UnlockableContent{ public @NonNull FileMapGenerator generator; public @NonNull Planet planet; public @NonNull Sector sector; - public Array requirements = new Array<>(); + public Seq requirements = new Seq<>(); public Cons rules = rules -> {}; public int conditionWave = Integer.MAX_VALUE; public int launchPeriod = 10; - public Schematic loadout = Loadouts.basicShard; - - protected Array baseLaunchCost = new Array<>(); - protected Array startingItems = new Array<>(); - protected Array launchCost; - protected Array defaultStartingItems = new Array<>(); public SectorPreset(String name, Planet planet, int sector){ super(name); @@ -48,49 +41,16 @@ public class SectorPreset extends UnlockableContent{ } public boolean canUnlock(){ - return data.isUnlocked(this) || !requirements.contains(r -> !r.complete()); - } - - public Array getLaunchCost(){ - if(launchCost == null){ - updateLaunchCost(); - } - return launchCost; - } - - public Array getStartingItems(){ - return startingItems; - } - - public void resetStartingItems(){ - startingItems.clear(); - defaultStartingItems.each(stack -> startingItems.add(new ItemStack(stack.item, stack.amount))); + return unlocked() || !requirements.contains(r -> !r.complete()); } public boolean hasLaunched(){ + //TODO implement return Core.settings.getBool(name + "-launched", false); } - public void setLaunched(){ - updateObjectives(() -> { - Core.settings.put(name + "-launched", true); - data.modified(); - }); - } - - public void updateWave(int wave){ - int value = Core.settings.getInt(name + "-wave", 0); - - if(value < wave){ - updateObjectives(() -> { - Core.settings.put(name + "-wave", wave); - data.modified(); - }); - } - } - public void updateObjectives(Runnable closure){ - Array incomplete = content.sectors() + Seq incomplete = content.sectors() .flatMap(z -> z.requirements) .filter(o -> o.zone() == this && !o.complete()).as(); @@ -103,6 +63,7 @@ public class SectorPreset extends UnlockableContent{ } public int bestWave(){ + //TODO implement return Core.settings.getInt(name + "-wave", 0); } @@ -111,31 +72,6 @@ public class SectorPreset extends UnlockableContent{ return bestWave() >= conditionWave; } - public void updateLaunchCost(){ - Array stacks = new Array<>(); - - Cons adder = stack -> { - for(ItemStack other : stacks){ - if(other.item == stack.item){ - other.amount += stack.amount; - return; - } - } - stacks.add(new ItemStack(stack.item, stack.amount)); - }; - - for(ItemStack stack : baseLaunchCost) adder.get(stack); - for(ItemStack stack : startingItems) adder.get(stack); - - for(ItemStack stack : stacks){ - if(stack.amount < 0) stack.amount = 0; - } - - stacks.sort(); - launchCost = stacks; - data.modified(); - } - /** Whether this zone has met its condition; if true, the player can leave. */ public boolean metCondition(){ //players can't leave in attack mode. @@ -146,14 +82,6 @@ public class SectorPreset extends UnlockableContent{ return true; } - @Override - public void init(){ - - for(ItemStack stack : startingItems){ - defaultStartingItems.add(new ItemStack(stack.item, stack.amount)); - } - } - @Override public boolean isHidden(){ return true; diff --git a/core/src/mindustry/type/UnitType.java b/core/src/mindustry/type/UnitType.java index 9c2e862247..473671f227 100644 --- a/core/src/mindustry/type/UnitType.java +++ b/core/src/mindustry/type/UnitType.java @@ -7,12 +7,14 @@ import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; +import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; import arc.util.ArcAnnotate.*; import mindustry.ai.types.*; import mindustry.annotations.Annotations.*; +import mindustry.content.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.units.*; @@ -33,7 +35,7 @@ public class UnitType extends UnlockableContent{ public @NonNull Prov constructor; public @NonNull Prov defaultController = () -> !flying ? new GroundAI() : new FlyingAI(); public float speed = 1.1f, boostMultiplier = 1f, rotateSpeed = 5f, baseRotateSpeed = 5f; - public float drag = 0.3f, accel = 0.5f, landShake = 0f; + public float drag = 0.3f, accel = 0.5f, landShake = 0f, rippleScale = 1f; public float health = 200f, range = -1, armor = 0f; public boolean targetAir = true, targetGround = true; public boolean faceTarget = true, rotateShooting = true, isCounted = true, lowAltitude = false; @@ -44,10 +46,13 @@ public class UnitType extends UnlockableContent{ public float baseElevation = 0f; //TODO document - public int legCount = 4; - public float legLength = 10f, legSpeed = 0.1f, legTrns = 1f, legBaseOffset = 0f, legMoveSpace = 1f, legExtension = 0; + public int legCount = 4, legGroupSize = 2; + public float legLength = 10f, legSpeed = 0.1f, legTrns = 1f, legBaseOffset = 0f, legMoveSpace = 1f, legExtension = 0, legPairOffset = 0, legLengthScl = 1f, kinematicScl = 1f, maxStretch = 1.75f; + public float legSplashDamage = 0f, legSplashRange = 5; + public boolean flipBackLegs = true; public int itemCapacity = 30; + public int ammoCapacity = 220; public int drillTier = -1; public float buildSpeed = 1f, mineSpeed = 1f; @@ -58,23 +63,21 @@ public class UnitType extends UnlockableContent{ public float lightRadius = 60f, lightOpacity = 0.6f; public Color lightColor = Pal.powerLight; public boolean drawCell = true, drawItems = true; + public int parts = 0; public ObjectSet immunities = new ObjectSet<>(); public Sound deathSound = Sounds.bang; - public Array weapons = new Array<>(); + public Seq weapons = new Seq<>(); public TextureRegion baseRegion, legRegion, region, shadowRegion, cellRegion, occlusionRegion, jointRegion, footRegion, legBaseRegion, baseJointRegion; + public TextureRegion[] partRegions; + public TextureRegion[] partCellRegions; public UnitType(String name){ super(name); - if(EntityMapping.map(name) != null){ - constructor = EntityMapping.map(name); - }else{ - //TODO fix for mods - throw new RuntimeException("Unit has no type: " + name); - } + constructor = EntityMapping.map(name); } public UnitController createController(){ @@ -85,6 +88,7 @@ public class UnitType extends UnlockableContent{ Unitc unit = constructor.get(); unit.team(team); unit.type(this); + unit.ammo(ammoCapacity); //fill up on ammo upon creation return unit; } @@ -96,6 +100,27 @@ public class UnitType extends UnlockableContent{ public void landed(Unitc unit){} + public void display(Unitc unit, Table table){ + table.table(t -> { + t.left(); + t.add(new Image(icon(Cicon.medium))).size(8 * 4); + t.labelWrap(localizedName).left().width(190f).padLeft(5); + }).growX().left(); + table.row(); + + table.table(bars -> { + bars.defaults().growX().height(18f).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, () -> (float)unit.ammo() / ammoCapacity)); + bars.row(); + } + }).growX(); + } + @Override public void displayInfo(Table table){ ContentDisplay.displayUnit(table, this); @@ -126,6 +151,14 @@ public class UnitType extends UnlockableContent{ cellRegion = Core.atlas.find(name + "-cell", Core.atlas.find("power-cell")); occlusionRegion = Core.atlas.find("circle-shadow"); 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); + } } @Override @@ -171,7 +204,7 @@ public class UnitType extends UnlockableContent{ drawOcclusion(unit); Draw.z(z); - drawEngine(unit); + if(engineSize > 0) drawEngine(unit); drawBody(unit); if(drawCell) drawCell(unit); drawWeapons(unit); @@ -322,14 +355,18 @@ public class UnitType extends UnlockableContent{ public void drawCell(Unitc unit){ applyColor(unit); - Draw.color(Color.black, unit.team().color, unit.healthf() + Mathf.absin(Time.time(), Math.max(unit.healthf() * 5f, 1f), 1f - unit.healthf())); + Draw.color(cellColor(unit)); Draw.rect(cellRegion, unit, unit.rotation() - 90); Draw.reset(); } + public Color cellColor(Unitc unit){ + return Tmp.c1.set(Color.black).lerp(unit.team().color, unit.healthf() + Mathf.absin(Time.time(), Math.max(unit.healthf() * 5f, 1f), 1f - unit.healthf())); + } + public void drawLight(Unitc unit){ if(lightRadius > 0){ - Drawf.light(unit, lightRadius, lightColor, lightOpacity); + Drawf.light(unit.team(), unit, lightRadius, lightColor, lightOpacity); } } @@ -350,18 +387,26 @@ public class UnitType extends UnlockableContent{ Draw.rect(baseRegion, unit.x(), unit.y(), rotation); } - int index = 0; - //TODO figure out layering - for(Leg leg : legs){ - float angle = unit.legAngle(rotation, index); - boolean flip = index++ >= legs.length/2f; + for(int i = 0; i < legs.length; i++){ + Leg leg = legs[i]; + float angle = unit.legAngle(rotation, i); + boolean flip = i >= legs.length/2f; int flips = Mathf.sign(flip); Vec2 position = legOffset.trns(angle, legBaseOffset).add(unit); + Tmp.v1.set(leg.base).sub(leg.joint).inv().setLength(legExtension); - Draw.color(); + if(leg.moving && baseElevation > 0){ + float scl = baseElevation; + float elev = Mathf.slope(1f - leg.stage) * scl; + Draw.color(shadowColor); + 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, CapStyle.none, 0); @@ -369,14 +414,10 @@ public class UnitType extends UnlockableContent{ 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, CapStyle.none, 0); - float angle2 = position.angleTo(leg.base); - if(jointRegion.found()){ Draw.rect(jointRegion, leg.joint.x, leg.joint.y); } - Draw.rect(footRegion, leg.base.x, leg.base.y, angle2); - if(baseJointRegion.found()){ Draw.rect(baseJointRegion, position.x, position.y, rotation); } @@ -395,7 +436,7 @@ public class UnitType extends UnlockableContent{ float ft = sin*(2.5f + (unit.hitSize()-8f)/2f); float boostTrns = e * 2f; - Floor floor = unit.floorOn(); + Floor floor = unit.isFlying() ? Blocks.air.asFloor() : unit.floorOn(); if(floor.isLiquid){ Draw.color(Color.white, floor.mapColor, 0.5f); diff --git a/core/src/mindustry/type/Weather.java b/core/src/mindustry/type/Weather.java index cf2d5fc28d..3910b22017 100644 --- a/core/src/mindustry/type/Weather.java +++ b/core/src/mindustry/type/Weather.java @@ -113,7 +113,7 @@ public abstract class Weather extends MappableContent{ private static final float fadeTime = 60 * 4; Weather weather; - float intensity = 1f, opacity = 1f, life; + float intensity = 1f, opacity = 0f, life; void init(Weather weather){ this.weather = weather; @@ -124,12 +124,16 @@ public abstract class Weather extends MappableContent{ if(life < fadeTime){ opacity = life / fadeTime; }else{ - opacity = Mathf.lerpDelta(opacity, 1f, 0.02f); + opacity = Mathf.lerpDelta(opacity, 1f, 0.01f); } life -= Time.delta(); weather.update((Weatherc)this); + + if(life < 0){ + remove(); + } } @Override diff --git a/core/src/mindustry/ui/ContentDisplay.java b/core/src/mindustry/ui/ContentDisplay.java index d654aecab1..7208c42f41 100644 --- a/core/src/mindustry/ui/ContentDisplay.java +++ b/core/src/mindustry/ui/ContentDisplay.java @@ -38,7 +38,7 @@ public class ContentDisplay{ BlockStats stats = block.stats; for(StatCategory cat : stats.toMap().keys()){ - OrderedMap> map = stats.toMap().get(cat); + OrderedMap> map = stats.toMap().get(cat); if(map.size == 0) continue; @@ -49,7 +49,7 @@ public class ContentDisplay{ table.table(inset -> { inset.left(); inset.add("[lightgray]" + stat.localized() + ":[] ").left(); - Array arr = map.get(stat); + Seq arr = map.get(stat); for(StatValue value : arr){ value.display(inset); inset.add().size(10f); diff --git a/core/src/mindustry/ui/Displayable.java b/core/src/mindustry/ui/Displayable.java new file mode 100644 index 0000000000..770e490cab --- /dev/null +++ b/core/src/mindustry/ui/Displayable.java @@ -0,0 +1,8 @@ +package mindustry.ui; + +import arc.scene.ui.layout.*; + +/** An interface for things that can be displayed when hovered over. */ +public interface Displayable{ + void display(Table table); +} diff --git a/core/src/mindustry/ui/Fonts.java b/core/src/mindustry/ui/Fonts.java index 136730d2e9..40d3687fa6 100644 --- a/core/src/mindustry/ui/Fonts.java +++ b/core/src/mindustry/ui/Fonts.java @@ -67,7 +67,7 @@ public class Fonts{ } public static void loadContentIcons(){ - Array fonts = Array.with(Fonts.chat, Fonts.def, Fonts.outline); + Seq fonts = Seq.with(Fonts.chat, Fonts.def, Fonts.outline); Texture uitex = Core.atlas.find("logo").getTexture(); int size = (int)(Fonts.def.getData().lineHeight/Fonts.def.getData().scaleY); @@ -110,7 +110,7 @@ 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); + UI.packer = new PixmapPacker(2048, 2048, Format.rgba8888, 2, true); FileHandleResolver resolver = new InternalFileHandleResolver(); Core.assets.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver)); Core.assets.setLoader(BitmapFont.class, null, new FreetypeFontLoader(resolver){ @@ -127,8 +127,8 @@ public class Fonts{ scaled.add(parameter.fontParameters); } - parameter.fontParameters.magFilter = TextureFilter.Linear; - parameter.fontParameters.minFilter = TextureFilter.Linear; + parameter.fontParameters.magFilter = TextureFilter.linear; + parameter.fontParameters.minFilter = TextureFilter.linear; parameter.fontParameters.packer = UI.packer; return super.loadSync(manager, fileName, file, parameter); } @@ -156,7 +156,7 @@ public class Fonts{ Page page = UI.packer.getPages().first(); - Array regions = atlas.getRegions().select(t -> t.getTexture() == texture); + Seq regions = atlas.getRegions().select(t -> t.getTexture() == texture); for(AtlasRegion region : regions){ //get new pack rect page.setDirty(false); @@ -175,7 +175,7 @@ public class Fonts{ atlas.disposePixmap(texture); page.setDirty(true); - page.updateTexture(TextureFilter.Linear, TextureFilter.Linear, false); + page.updateTexture(TextureFilter.linear, TextureFilter.linear, false); } public static TextureRegionDrawable getGlyph(BitmapFont font, char glyph){ diff --git a/core/src/mindustry/ui/ItemsDisplay.java b/core/src/mindustry/ui/ItemsDisplay.java index f4db9034cd..4781c4d677 100644 --- a/core/src/mindustry/ui/ItemsDisplay.java +++ b/core/src/mindustry/ui/ItemsDisplay.java @@ -30,7 +30,7 @@ public class ItemsDisplay extends Table{ t.marginRight(30f); t.left(); for(Item item : content.items()){ - if(item.type == ItemType.material && data.isUnlocked(item)){ + if(item.type == ItemType.material && item.unlocked()){ t.label(() -> format(item)).left(); t.image(item.icon(Cicon.small)).size(8 * 3).padLeft(4).padRight(4); t.add(item.localizedName).color(Color.lightGray).left(); @@ -51,10 +51,11 @@ public class ItemsDisplay extends Table{ private String format(Item item){ builder.setLength(0); - builder.append(ui.formatAmount(data.getItem(item))); - if(state.isGame() && player.team().data().hasCore() && player.team().core().items().get(item) > 0){ + builder.append("[TODO implement]"); + //builder.append(ui.formatAmount(data.getItem(item))); + if(state.isGame() && player.team().data().hasCore() && player.team().core().items.get(item) > 0){ builder.append(" [unlaunched]+ "); - builder.append(ui.formatAmount(state.teams.get(player.team()).core().items().get(item))); + builder.append(ui.formatAmount(state.teams.get(player.team()).core().items.get(item))); } return builder.toString(); } diff --git a/core/src/mindustry/ui/MultiReqImage.java b/core/src/mindustry/ui/MultiReqImage.java index 6d7f199f57..715f629088 100644 --- a/core/src/mindustry/ui/MultiReqImage.java +++ b/core/src/mindustry/ui/MultiReqImage.java @@ -1,11 +1,11 @@ package mindustry.ui; -import arc.struct.Array; +import arc.struct.Seq; import arc.scene.ui.layout.Stack; import arc.util.Time; public class MultiReqImage extends Stack{ - private Array displays = new Array<>(); + private Seq displays = new Seq<>(); private float time; public void add(ReqImage display){ diff --git a/core/src/mindustry/ui/Styles.java b/core/src/mindustry/ui/Styles.java index 9e0fc1dcb5..d4838ae382 100644 --- a/core/src/mindustry/ui/Styles.java +++ b/core/src/mindustry/ui/Styles.java @@ -30,7 +30,7 @@ public class Styles{ public static ScrollPaneStyle defaultPane, horizontalPane, smallPane; public static KeybindDialogStyle defaultKeybindDialog; public static SliderStyle defaultSlider, vSlider; - public static LabelStyle defaultLabel, outlineLabel; + public static LabelStyle defaultLabel, outlineLabel, techLabel; public static TextFieldStyle defaultField, areaField; public static CheckBoxStyle defaultCheck; public static DialogStyle defaultDialog, fullDialog; @@ -268,6 +268,10 @@ public class Styles{ font = Fonts.outline; fontColor = Color.white; }}; + techLabel = new LabelStyle(){{ + font = Fonts.tech; + fontColor = Color.white; + }}; defaultField = new TextFieldStyle(){{ font = Fonts.chat; diff --git a/core/src/mindustry/ui/WarningBar.java b/core/src/mindustry/ui/WarningBar.java new file mode 100644 index 0000000000..efa124f8ab --- /dev/null +++ b/core/src/mindustry/ui/WarningBar.java @@ -0,0 +1,36 @@ +package mindustry.ui; + +import arc.graphics.g2d.*; +import arc.scene.*; +import mindustry.graphics.*; + +public class WarningBar extends Element{ + public float barWidth = 40f, spacing = barWidth*2, skew = barWidth; + + { + setColor(Pal.accent); + } + + @Override + public void draw(){ + Draw.color(color); + Draw.alpha(parentAlpha); + + int amount = (int)(width / spacing) + 2; + + for(int i = 0; i < amount; i++){ + float rx = x + (i - 1)*spacing; + Fill.quad( + rx, y, + rx + skew, y + height, + rx + skew + barWidth, y + height, + rx + barWidth, y + ); + } + Lines.stroke(3f); + Lines.line(x, y, x + width, y); + Lines.line(x, y + height, x + width, y + height); + + Draw.reset(); + } +} diff --git a/core/src/mindustry/ui/dialogs/AboutDialog.java b/core/src/mindustry/ui/dialogs/AboutDialog.java index 3986dba4bd..a930e6f3f2 100644 --- a/core/src/mindustry/ui/dialogs/AboutDialog.java +++ b/core/src/mindustry/ui/dialogs/AboutDialog.java @@ -15,14 +15,14 @@ import mindustry.ui.Links.*; import static mindustry.Vars.*; public class AboutDialog extends BaseDialog{ - private Array contributors = new Array<>(); + private Seq contributors = new Seq<>(); private static ObjectSet bannedItems = ObjectSet.with("google-play", "itch.io", "dev-builds", "f-droid"); public AboutDialog(){ super("$about.button"); shown(() -> { - contributors = Array.with(Core.files.internal("contributors").readString("UTF-8").split("\n")); + contributors = Seq.with(Core.files.internal("contributors").readString("UTF-8").split("\n")); Core.app.post(this::setup); }); diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index f45850b0fd..0cb44eca5c 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -59,7 +59,7 @@ public class CustomRulesDialog extends BaseDialog{ t.add("$empty"); } - Array array = Array.with(rules.bannedBlocks); + Seq array = Seq.with(rules.bannedBlocks); array.sort(); int cols = mobile && Core.graphics.isPortrait() ? 1 : mobile ? 2 : 3; @@ -140,13 +140,12 @@ public class CustomRulesDialog extends BaseDialog{ number("$rules.buildspeedmultiplier", f -> rules.buildSpeedMultiplier = f, () -> rules.buildSpeedMultiplier); number("$rules.deconstructrefundmultiplier", false, f -> rules.deconstructRefundMultiplier = f, () -> rules.deconstructRefundMultiplier, () -> !rules.infiniteResources); number("$rules.blockhealthmultiplier", f -> rules.blockHealthMultiplier = f, () -> rules.blockHealthMultiplier); + number("$rules.blockdamagemultiplier", f -> rules.blockDamageMultiplier = f, () -> rules.blockDamageMultiplier); main.button("$configure", () -> loadoutDialog.show(Blocks.coreShard.itemCapacity, rules.loadout, - () -> { - rules.loadout.clear(); - rules.loadout.add(new ItemStack(Items.copper, 100)); - }, () -> {}, () -> {} + () -> rules.loadout.clear().add(new ItemStack(Items.copper, 100)), + () -> {}, () -> {} )).left().width(300f); main.row(); @@ -154,13 +153,13 @@ public class CustomRulesDialog extends BaseDialog{ main.row(); title("$rules.title.unit"); + check("$rules.unitammo", b -> rules.unitAmmo = b, () -> rules.unitAmmo); number("$rules.unithealthmultiplier", f -> rules.unitHealthMultiplier = f, () -> rules.unitHealthMultiplier); number("$rules.unitdamagemultiplier", f -> rules.unitDamageMultiplier = f, () -> rules.unitDamageMultiplier); number("$rules.unitbuildspeedmultiplier", f -> rules.unitBuildSpeedMultiplier = f, () -> rules.unitBuildSpeedMultiplier); title("$rules.title.enemy"); check("$rules.attack", b -> rules.attackMode = b, () -> rules.attackMode); - check("$rules.enemyCheat", b -> rules.enemyCheat = b, () -> rules.enemyCheat); number("$rules.enemycorebuildradius", f -> rules.enemyCoreBuildRadius = f * tilesize, () -> Math.min(rules.enemyCoreBuildRadius / tilesize, 200)); title("$rules.title.environment"); diff --git a/core/src/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/mindustry/ui/dialogs/DatabaseDialog.java index 0f4209ecfd..9e2af57df8 100644 --- a/core/src/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/mindustry/ui/dialogs/DatabaseDialog.java @@ -34,12 +34,12 @@ public class DatabaseDialog extends BaseDialog{ table.margin(20); ScrollPane pane = new ScrollPane(table); - Array[] allContent = Vars.content.getContentMap(); + Seq[] allContent = Vars.content.getContentMap(); for(int j = 0; j < allContent.length; j++){ ContentType type = ContentType.values()[j]; - Array array = allContent[j].select(c -> c instanceof UnlockableContent && !((UnlockableContent)c).isHidden()); + Seq array = allContent[j].select(c -> c instanceof UnlockableContent && !((UnlockableContent)c).isHidden()); if(array.size == 0) continue; table.add("$content." + type.name() + ".name").growX().left().color(Pal.accent); diff --git a/core/src/mindustry/ui/dialogs/FileChooser.java b/core/src/mindustry/ui/dialogs/FileChooser.java index 3e2118fb84..d2046c435e 100644 --- a/core/src/mindustry/ui/dialogs/FileChooser.java +++ b/core/src/mindustry/ui/dialogs/FileChooser.java @@ -254,7 +254,7 @@ public class FileChooser extends BaseDialog{ } public class FileHistory{ - private Array history = new Array<>(); + private Seq history = new Seq<>(); private int index; public FileHistory(){ diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 4e75d13552..fcd62af0b8 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -20,7 +20,7 @@ import mindustry.ui.*; import static mindustry.Vars.*; public class JoinDialog extends BaseDialog{ - Array servers = new Array<>(); + Seq servers = new Seq<>(); Dialog add; Server renaming; Table local = new Table(); @@ -417,7 +417,7 @@ public class JoinDialog extends BaseDialog{ @SuppressWarnings("unchecked") private void loadServers(){ - servers = Core.settings.getJson("servers", Array.class, Array::new); + servers = Core.settings.getJson("servers", Seq.class, Seq::new); //load imported legacy data if(Core.settings.has("server-list")){ diff --git a/core/src/mindustry/ui/dialogs/LanguageDialog.java b/core/src/mindustry/ui/dialogs/LanguageDialog.java index e1d31faa0d..db51900b54 100644 --- a/core/src/mindustry/ui/dialogs/LanguageDialog.java +++ b/core/src/mindustry/ui/dialogs/LanguageDialog.java @@ -30,7 +30,7 @@ public class LanguageDialog extends BaseDialog{ Table langs = new Table(); langs.marginRight(24f).marginLeft(24f); ScrollPane pane = new ScrollPane(langs); - pane.setFadeScrollBars(false); + pane.setScrollingDisabled(true, false); ButtonGroup group = new ButtonGroup<>(); diff --git a/core/src/mindustry/ui/dialogs/LoadDialog.java b/core/src/mindustry/ui/dialogs/LoadDialog.java index 9231f1f289..e341a1b224 100644 --- a/core/src/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/mindustry/ui/dialogs/LoadDialog.java @@ -50,7 +50,7 @@ public class LoadDialog extends BaseDialog{ Time.runTask(2f, () -> Core.scene.setScrollFocus(pane)); - Array array = control.saves.getSaveSlots(); + Seq array = control.saves.getSaveSlots(); array.sort((slot, other) -> -Long.compare(slot.getTimestamp(), other.getTimestamp())); int maxwidth = Math.max((int)(Core.graphics.getWidth() / Scl.scl(470)), 1); diff --git a/core/src/mindustry/ui/dialogs/LoadoutDialog.java b/core/src/mindustry/ui/dialogs/LoadoutDialog.java index 510032e7d7..1b5d067bb4 100644 --- a/core/src/mindustry/ui/dialogs/LoadoutDialog.java +++ b/core/src/mindustry/ui/dialogs/LoadoutDialog.java @@ -15,8 +15,8 @@ public class LoadoutDialog extends BaseDialog{ private Runnable hider; private Runnable resetter; private Runnable updater; - private Array stacks = new Array<>(); - private Array originalStacks = new Array<>(); + private Seq stacks = new Seq<>(); + private Seq originalStacks = new Seq<>(); private Table items; private int capacity; @@ -51,14 +51,13 @@ public class LoadoutDialog extends BaseDialog{ }).size(210f, 64f); } - public void show(int capacity, Array stacks, Runnable reseter, Runnable updater, Runnable hider){ + public void show(int capacity, Seq stacks, Runnable reseter, Runnable updater, Runnable hider){ this.originalStacks = stacks; reseed(); this.resetter = reseter; this.updater = updater; this.capacity = capacity; this.hider = hider; - //this.filter = filter; show(); } diff --git a/core/src/mindustry/ui/dialogs/PausedDialog.java b/core/src/mindustry/ui/dialogs/PausedDialog.java index 7b06ff6c4b..11bfa98e5a 100644 --- a/core/src/mindustry/ui/dialogs/PausedDialog.java +++ b/core/src/mindustry/ui/dialogs/PausedDialog.java @@ -40,11 +40,12 @@ public class PausedDialog extends BaseDialog{ 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); - } + //if(state.isCampaign()){ + // cont.button("$techtree", Icon.tree, ui.tech::show); + //}else{ + // cont.button("$database", Icon.book, ui.database::show); + //} + cont.button("placeholder", Icon.warning, () -> ui.showInfo("go away")); cont.button("$settings", Icon.settings, ui.settings::show); if(!state.rules.tutorial){ @@ -120,7 +121,7 @@ public class PausedDialog extends BaseDialog{ return; } - ui.loadAnd("$saveload", () -> { + ui.loadAnd("$saving", () -> { try{ control.saves.getCurrent().save(); }catch(Throwable e){ diff --git a/core/src/mindustry/ui/dialogs/PlanetDialog.java b/core/src/mindustry/ui/dialogs/PlanetDialog.java index eb8cbe265d..2749c6234d 100644 --- a/core/src/mindustry/ui/dialogs/PlanetDialog.java +++ b/core/src/mindustry/ui/dialogs/PlanetDialog.java @@ -22,7 +22,6 @@ import mindustry.graphics.g3d.PlanetRenderer.*; import mindustry.type.*; import mindustry.type.Sector.*; import mindustry.ui.*; -import mindustry.world.blocks.campaign.CoreLauncher.*; import static mindustry.Vars.*; import static mindustry.graphics.g3d.PlanetRenderer.*; @@ -36,7 +35,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ private int launchRange; private float zoom = 1f, selectAlpha = 1f; private @Nullable Sector selected, hovered, launchSector; - private CoreLauncherEntity launcher; + private Tilec launcher; private Mode mode = look; public PlanetDialog(){ @@ -98,7 +97,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ return super.show(); } - public void show(Sector sector, int range, CoreLauncherEntity launcher){ + public void show(Sector sector, int range, Tilec launcher){ this.launcher = launcher; selected = null; hovered = null; @@ -218,9 +217,8 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ if(doBuffer){ buffer.end(); - Draw.color(color); - Draw.rect(Draw.wrap(buffer.getTexture()), Core.graphics.getWidth()/2f, Core.graphics.getHeight()/2f, Core.graphics.getWidth(), -Core.graphics.getHeight()); - Draw.color(); + + buffer.blit(Shaders.screenspace); } } @@ -344,7 +342,7 @@ public class PlanetDialog extends BaseDialog implements PlanetInterfaceRenderer{ } if(mode == launch){ - launcher.launch(); + control.handleLaunch(launcher); zoom = 0.5f; ui.hudfrag.showLaunchDirect(); diff --git a/core/src/mindustry/ui/dialogs/ResourcesDialog.java b/core/src/mindustry/ui/dialogs/ResourcesDialog.java index 53736790cf..e92713f692 100644 --- a/core/src/mindustry/ui/dialogs/ResourcesDialog.java +++ b/core/src/mindustry/ui/dialogs/ResourcesDialog.java @@ -1,6 +1,5 @@ package mindustry.ui.dialogs; -import arc.graphics.*; import mindustry.gen.*; import mindustry.type.*; import mindustry.ui.*; @@ -23,14 +22,15 @@ public class ResourcesDialog extends BaseDialog{ t.margin(10f); int[] exports = universe.getTotalExports(); for(Item item : content.items()){ - if(exports[item.id] > 0 || data.getItem(item) > 0){ + //TODO display total items + if(exports[item.id] > 0){ t.image(item.icon(Cicon.small)).padRight(4); - t.add(ui.formatAmount(data.getItem(item))).color(Color.lightGray); - if(exports[item.id] > 0){ + //t.add(ui.formatAmount(data.getItem(item))).color(Color.lightGray); + //if(exports[item.id] > 0){ t.add("+ [accent]" + ui.formatAmount(exports[item.id]) + " [lightgray]/T"); - }else{ - t.add(); - } + //}else{ + // t.add(); + //} t.row(); } } diff --git a/core/src/mindustry/ui/dialogs/SaveDialog.java b/core/src/mindustry/ui/dialogs/SaveDialog.java index 9292e2527b..143206eecf 100644 --- a/core/src/mindustry/ui/dialogs/SaveDialog.java +++ b/core/src/mindustry/ui/dialogs/SaveDialog.java @@ -24,13 +24,11 @@ public class SaveDialog extends LoadDialog{ public void addSetup(){ buttons.button("$save.new", Icon.add, () -> - ui.showTextInput("$save", "$save.newslot", 30, "", text -> { - ui.loadAnd("$saving", () -> { - control.saves.addSave(text); - Core.app.post(() -> Core.app.post(this::setup)); - }); - }) - ).fillX().margin(10f); + ui.showTextInput("$save", "$save.newslot", 30, "", + text -> ui.loadAnd("$saving", () -> { + control.saves.addSave(text); + Core.app.post(() -> Core.app.post(this::setup)); + }))).fillX().margin(10f); } @Override @@ -44,7 +42,7 @@ public class SaveDialog extends LoadDialog{ void save(SaveSlot slot){ - ui.loadfrag.show("$saveload"); + ui.loadfrag.show("$saving"); Time.runTask(5f, () -> { hide(); diff --git a/core/src/mindustry/ui/dialogs/SchematicsDialog.java b/core/src/mindustry/ui/dialogs/SchematicsDialog.java index 3628ff3f14..49114836b4 100644 --- a/core/src/mindustry/ui/dialogs/SchematicsDialog.java +++ b/core/src/mindustry/ui/dialogs/SchematicsDialog.java @@ -29,7 +29,7 @@ public class SchematicsDialog extends BaseDialog{ public SchematicsDialog(){ super("$schematics"); Core.assets.load("sprites/schematic-background.png", Texture.class).loaded = t -> { - ((Texture)t).setWrap(TextureWrap.Repeat); + ((Texture)t).setWrap(TextureWrap.repeat); }; shouldPause = true; @@ -332,13 +332,13 @@ public class SchematicsDialog extends BaseDialog{ cont.add(new SchematicImage(schem)).maxSize(800f); cont.row(); - Array arr = schem.requirements(); + Seq arr = schem.requirements(); cont.table(r -> { int i = 0; for(ItemStack s : arr){ r.image(s.item.icon(Cicon.small)).left(); r.label(() -> { - Tilec core = player.closestCore(); + Tilec core = player.core(); if(core == null || state.rules.infiniteResources || core.items().has(s.item, s.amount)) return "[lightgray]" + s.amount + ""; return (core.items().has(s.item, s.amount) ? "[lightgray]" : "[scarlet]") + Math.min(core.items().get(s.item), s.amount) + "[lightgray]/" + s.amount; }).padLeft(2).left().padRight(4); diff --git a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java index cbd6d1cca5..d215c44a82 100644 --- a/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -13,6 +13,7 @@ import arc.scene.ui.TextButton.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.*; +import arc.util.io.*; import mindustry.core.GameState.*; import mindustry.core.*; import mindustry.game.EventType.*; @@ -21,7 +22,11 @@ import mindustry.graphics.*; import mindustry.input.*; import mindustry.ui.*; -import static arc.Core.bundle; +import java.io.*; +import java.util.zip.*; + +import static arc.Core.*; +import static mindustry.Vars.net; import static mindustry.Vars.*; public class SettingsMenuDialog extends SettingsDialog{ @@ -107,7 +112,7 @@ public class SettingsMenuDialog extends SettingsDialog{ if(ios){ Fi file = Core.files.local("mindustry-data-export.zip"); try{ - data.exportData(file); + exportData(file); }catch(Exception e){ ui.showException(e); } @@ -115,7 +120,7 @@ public class SettingsMenuDialog extends SettingsDialog{ }else{ platform.showFileChooser(false, "zip", file -> { try{ - data.exportData(file); + exportData(file); ui.showInfo("$data.exported"); }catch(Exception e){ e.printStackTrace(); @@ -129,7 +134,7 @@ public class SettingsMenuDialog extends SettingsDialog{ t.button("$data.import", Icon.download, style, () -> ui.showConfirm("$confirm", "$data.import.confirm", () -> platform.showFileChooser(true, "zip", file -> { try{ - data.importData(file); + importData(file); Core.app.exit(); }catch(IllegalArgumentException e){ ui.showErrorMessage("$data.invalid"); @@ -321,6 +326,7 @@ public class SettingsMenuDialog extends SettingsDialog{ graphics.checkPref("blockstatus", false); graphics.checkPref("playerchat", true); graphics.checkPref("minimap", !mobile); + graphics.checkPref("smoothcamera", true); graphics.checkPref("position", false); graphics.checkPref("fps", false); if(!mobile){ @@ -333,11 +339,13 @@ public class SettingsMenuDialog extends SettingsDialog{ graphics.checkPref("animatedshields", !mobile); } if(!ios){ - graphics.checkPref("bloom", !mobile, val -> renderer.toggleBloom(val)); + graphics.checkPref("bloom", true, val -> renderer.toggleBloom(val)); }else{ Core.settings.put("bloom", false); } + + graphics.checkPref("pixelate", false, val -> { if(val){ Events.fire(Trigger.enablePixelation); @@ -346,14 +354,14 @@ public class SettingsMenuDialog extends SettingsDialog{ graphics.checkPref("linear", true, b -> { for(Texture tex : Core.atlas.getTextures()){ - TextureFilter filter = b ? TextureFilter.Linear : TextureFilter.Nearest; + TextureFilter filter = b ? TextureFilter.linear : TextureFilter.nearest; tex.setFilter(filter, filter); } }); if(Core.settings.getBool("linear")){ for(Texture tex : Core.atlas.getTextures()){ - TextureFilter filter = TextureFilter.Linear; + TextureFilter filter = TextureFilter.linear; tex.setFilter(filter, filter); } } @@ -365,6 +373,43 @@ public class SettingsMenuDialog extends SettingsDialog{ graphics.checkPref("flow", true); } + public void exportData(Fi file) throws IOException{ + Seq files = new Seq<>(); + files.add(Core.settings.getSettingsFile()); + files.addAll(customMapDirectory.list()); + files.addAll(saveDirectory.list()); + files.addAll(screenshotDirectory.list()); + files.addAll(modDirectory.list()); + files.addAll(schematicDirectory.list()); + String base = Core.settings.getDataDirectory().path(); + + try(OutputStream fos = file.write(false, 2048); ZipOutputStream zos = new ZipOutputStream(fos)){ + for(Fi add : files){ + if(add.isDirectory()) continue; + zos.putNextEntry(new ZipEntry(add.path().substring(base.length()))); + Streams.copy(add.read(), zos); + zos.closeEntry(); + } + } + } + + public void importData(Fi file){ + Fi dest = Core.files.local("zipdata.zip"); + file.copyTo(dest); + Fi zipped = new ZipFi(dest); + + Fi base = Core.settings.getDataDirectory(); + if(!zipped.child("settings.bin").exists()){ + throw new IllegalArgumentException("Not valid save data."); + } + + //purge existing tmp data, keep everything else + tmpDirectory.deleteDirectory(); + + zipped.walk(f -> f.copyTo(base.child(f.path()))); + dest.delete(); + } + private void back(){ rebuildMenu(); prefs.clearChildren(); diff --git a/core/src/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/mindustry/ui/dialogs/TechTreeDialog.java index a7b212ebd1..59299ad204 100644 --- a/core/src/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/mindustry/ui/dialogs/TechTreeDialog.java @@ -1,6 +1,7 @@ package mindustry.ui.dialogs; import arc.*; +import arc.func.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.input.*; @@ -35,15 +36,17 @@ public class TechTreeDialog extends BaseDialog{ private ObjectSet nodes = new ObjectSet<>(); private TechTreeNode root = new TechTreeNode(TechTree.root, null); private Rect bounds = new Rect(); - private ItemsDisplay items; private View view; + private Cons selector = c -> {}; public TechTreeDialog(){ super(""); titleTable.remove(); margin(0f).marginBottom(8); - Stack stack = cont.stack(view = new View(), items = new ItemsDisplay()).grow().get(); + Stack stack = cont.stack(view = new View()/*, items = new ItemsDisplay()*/).grow().get(); + + shouldPause = true; Events.on(ContentReloadEvent.class, e -> { nodes.clear(); @@ -72,7 +75,7 @@ public class TechTreeDialog extends BaseDialog{ addListener(new InputListener(){ @Override public boolean scrolled(InputEvent event, float x, float y, float amountX, float amountY){ - view.setScale(Mathf.clamp(view.getScaleX() - amountY / 40f, 0.25f, 1f)); + view.setScale(Mathf.clamp(view.getScaleX() - amountY / 10f * view.getScaleX(), 0.25f, 1f)); view.setOrigin(Align.center); view.setTransform(true); return true; @@ -112,23 +115,40 @@ public class TechTreeDialog extends BaseDialog{ }); } + public Dialog show(Cons selector){ + this.selector = selector; + return super.show(); + } + + public Dialog show(){ + return show(c -> {}); + } + void treeLayout(){ float spacing = 20f; LayoutNode node = new LayoutNode(root, null); LayoutNode[] children = node.children; LayoutNode[] leftHalf = Arrays.copyOfRange(node.children, 0, Mathf.ceil(node.children.length/2f)); LayoutNode[] rightHalf = Arrays.copyOfRange(node.children, Mathf.ceil(node.children.length/2f), node.children.length); + node.children = leftHalf; new BranchTreeLayout(){{ gapBetweenLevels = gapBetweenNodes = spacing; rootLocation = TreeLocation.top; }}.layout(node); - node.children = rightHalf; - new BranchTreeLayout(){{ - gapBetweenLevels = gapBetweenNodes = spacing; - rootLocation = TreeLocation.bottom; - }}.layout(node); + float lastY = node.y; + + if(rightHalf.length > 0){ + + node.children = rightHalf; + new BranchTreeLayout(){{ + gapBetweenLevels = gapBetweenNodes = spacing; + rootLocation = TreeLocation.bottom; + }}.layout(node); + + shift(leftHalf, node.y - lastY); + } node.children = children; @@ -146,6 +166,13 @@ public class TechTreeDialog extends BaseDialog{ bounds.y += nodeSize*1.5f; } + void shift(LayoutNode[] children, float amount){ + for(LayoutNode node : children){ + node.y += amount; + if(node.children != null && node.children.length > 0) shift(node.children, amount); + } + } + void copyInfo(LayoutNode node){ node.node.x = node.x; node.node.y = node.y; @@ -163,8 +190,6 @@ public class TechTreeDialog extends BaseDialog{ l.visible = !locked; checkNodes(l); } - - items.rebuild(); } void showToast(String info){ @@ -191,7 +216,7 @@ public class TechTreeDialog extends BaseDialog{ this.parent = parent; this.width = this.height = nodeSize; if(node.children != null){ - children = Array.with(node.children).map(t -> new LayoutNode(t, this)).toArray(LayoutNode.class); + children = Seq.with(node.children).map(t -> new LayoutNode(t, this)).toArray(LayoutNode.class); } } } @@ -247,9 +272,13 @@ public class TechTreeDialog extends BaseDialog{ } }); } - }else if(data.hasItems(node.node.requirements) && locked(node.node)){ - unlock(node.node); + }else if(locked(node.node)){ + selector.get(node.node); } + //TODO select it + //else if(data.hasItems(node.node.requirements) && locked(node.node)){ + // unlock(node.node); + //} }); button.hovered(() -> { if(!mobile && hoverNode != button && node.visible){ @@ -269,7 +298,7 @@ public class TechTreeDialog 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 : !data.hasItems(node.node.requirements) ? Tex.buttonRed : Tex.button; + button.getStyle().up = !locked(node.node) ? Tex.buttonOver : Tex.button; ((TextureRegionDrawable)button.getStyle().imageUp) .setRegion(node.visible ? node.node.content.icon(Cicon.medium) : Icon.lock.getRegion()); button.getImage().setColor(!locked(node.node) ? Color.white : Color.gray); @@ -304,9 +333,11 @@ public class TechTreeDialog extends BaseDialog{ panY = ry - bounds.y - oy; } + /* void unlock(TechNode node){ data.unlockContent(node.content); - data.removeItems(node.requirements); + //TODO this should not happen + //data.removeItems(node.requirements); showToast(Core.bundle.format("researched", node.content.localizedName)); checkNodes(root); hoverNode = null; @@ -315,7 +346,7 @@ public class TechTreeDialog extends BaseDialog{ Core.scene.act(); Sounds.unlock.play(); Events.fire(new ResearchEvent(node.content)); - } + }*/ void rebuild(){ ImageButton button = hoverNode; @@ -357,8 +388,8 @@ public class TechTreeDialog extends BaseDialog{ list.left(); list.image(req.item.icon(Cicon.small)).size(8 * 3).padRight(3); list.add(req.item.localizedName).color(Color.lightGray); - list.label(() -> " " + Math.min(data.getItem(req.item), req.amount) + " / " + req.amount) - .update(l -> l.setColor(data.has(req.item, req.amount) ? Color.lightGray : Color.scarlet)); + list.label(() -> " " + (player.team().core() != null ? Math.min(player.team().core().items.get(req.item), req.amount) + " / " : "") + req.amount) + .update(l -> {}/*l.setColor(data.has(req.item, req.amount) ? Color.lightGray : Color.scarlet)*/);//TODO }).fillX().left(); t.row(); } @@ -383,11 +414,13 @@ public class TechTreeDialog extends BaseDialog{ } }).pad(9); + //TODO research select button + /* if(mobile && locked(node)){ b.row(); b.button("$research", Icon.ok, Styles.nodet, () -> unlock(node)) .disabled(i -> !data.hasItems(node.requirements)).growX().height(44f).colspan(3); - } + }*/ }); infoTable.row(); diff --git a/core/src/mindustry/ui/fragments/ChatFragment.java b/core/src/mindustry/ui/fragments/ChatFragment.java index f279178fd7..7b5057bb46 100644 --- a/core/src/mindustry/ui/fragments/ChatFragment.java +++ b/core/src/mindustry/ui/fragments/ChatFragment.java @@ -22,7 +22,7 @@ import static mindustry.Vars.*; public class ChatFragment extends Table{ private final static int messagesShown = 10; - private Array messages = new Array<>(); + private Seq messages = new Seq<>(); private float fadetime; private boolean shown = false; private TextField chatfield; @@ -32,7 +32,7 @@ public class ChatFragment extends Table{ private float offsetx = Scl.scl(4), offsety = Scl.scl(4), fontoffsetx = Scl.scl(2), chatspace = Scl.scl(50); private Color shadowColor = new Color(0, 0, 0, 0.4f); private float textspacing = Scl.scl(10); - private Array history = new Array<>(); + private Seq history = new Seq<>(); private int historyPos = 0; private int scrollPos = 0; private Fragment container = new Fragment(){ diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 79c7196693..b03f525f22 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -24,6 +24,7 @@ import mindustry.net.Packets.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.ui.dialogs.*; +import mindustry.world.blocks.storage.*; import static mindustry.Vars.*; @@ -56,6 +57,7 @@ public class HudFragment extends Fragment{ showToast("Sector[accent] captured[]!"); }); + //TODO full implementation Events.on(ResetEvent.class, e -> { coreItems.resetUsed(); }); @@ -119,7 +121,7 @@ public class HudFragment extends Fragment{ select.image().color(Pal.gray).width(4f).fillY(); float size = Scl.scl(dsize); - Array children = new Array<>(select.getChildren()); + Seq children = new Seq<>(select.getChildren()); //now, you may be wondering, why is this necessary? the answer is, I don't know, but it fixes layout issues somehow int index = 0; @@ -145,7 +147,7 @@ public class HudFragment extends Fragment{ cont.row(); } - //TODO BUTTONS FOR VIEWING EXPORTS/IMPORTS/RESEARCH + //TODO BUTTONS FOR VIEWING EXPORTS/IMPORTS/RESEARCH/MAP/ETC /* cont.table(t -> { @@ -207,6 +209,7 @@ public class HudFragment extends Fragment{ //fps display cont.table(info -> { + info.touchable(Touchable.disabled); info.top().left().margin(4).visible(() -> Core.settings.getBool("fps") && shown); info.update(() -> info.setTranslation(state.rules.waves || state.isEditor() ? 0f : -Scl.scl(dsize * 4 + 3), 0)); IntFormat fps = new IntFormat("fps"); @@ -217,7 +220,7 @@ public class HudFragment extends Fragment{ info.label(() -> ping.get(netClient.getPing())).visible(net::client).left().style(Styles.outlineLabel); }).top().left(); }); - + parent.fill(t -> { t.visible(() -> Core.settings.getBool("minimap") && !state.rules.tutorial && shown); //minimap @@ -225,7 +228,8 @@ public class HudFragment extends Fragment{ t.row(); //position t.label(() -> player.tileX() + "," + player.tileY()) - .visible(() -> Core.settings.getBool("position") && !state.rules.tutorial); + .visible(() -> Core.settings.getBool("position") && !state.rules.tutorial) + .touchable(Touchable.disabled); t.top().right(); }); @@ -306,7 +310,7 @@ public class HudFragment extends Fragment{ //'saving' indicator parent.fill(t -> { t.bottom().visible(() -> control.saves.isSaving()); - t.add("$saveload").style(Styles.outlineLabel); + t.add("$saving").style(Styles.outlineLabel); }); parent.fill(p -> { @@ -322,7 +326,7 @@ public class HudFragment extends Fragment{ p.touchable(Touchable.disabled); }); - //DEBUG: rate table + //TODO DEBUG: rate table parent.fill(t -> { t.bottom().left(); t.table(Styles.black6, c -> { @@ -353,8 +357,16 @@ public class HudFragment extends Fragment{ rebuild.run(); } }); - }); + }).visible(() -> state.isCampaign() && content.items().contains(i -> state.secinfo.getExport(i) > 0)); + }); + //TODO move, select loadout, consume resources + parent.fill(t -> { + t.bottom().visible(() -> state.isCampaign() && player.team().core() != null); + + t.button("test launch", Icon.warning, () -> { + ui.planet.show(state.getSector(), ((CoreBlock)player.team().core().block).launchRange, player.team().core()); + }).width(150f); }); blockfrag.build(parent); @@ -474,7 +486,7 @@ public class HudFragment extends Fragment{ int cap = col * col - 1; //get old elements - Array elements = new Array<>(lastUnlockLayout.getChildren()); + Seq elements = new Seq<>(lastUnlockLayout.getChildren()); int esize = elements.size; //...if it's already reached the cap, ignore everything @@ -642,7 +654,7 @@ public class HudFragment extends Fragment{ } if(state.rules.waveTimer){ - builder.append((state.rules.waitEnemies && state.enemies > 0 ? Core.bundle.get("wave.waveInProgress") : ( waitingf.get((int)(state.wavetime/60))))); + builder.append((logic.isWaitingWave() ? Core.bundle.get("wave.waveInProgress") : ( waitingf.get((int)(state.wavetime/60))))); }else if(state.enemies == 0){ builder.append(Core.bundle.get("waiting")); } diff --git a/core/src/mindustry/ui/fragments/LoadingFragment.java b/core/src/mindustry/ui/fragments/LoadingFragment.java index 79c1455762..8af45aa79c 100644 --- a/core/src/mindustry/ui/fragments/LoadingFragment.java +++ b/core/src/mindustry/ui/fragments/LoadingFragment.java @@ -2,13 +2,12 @@ package mindustry.ui.fragments; import arc.func.*; import arc.graphics.*; -import arc.scene.Group; +import arc.scene.*; import arc.scene.actions.*; -import arc.scene.event.Touchable; -import arc.scene.ui.Label; -import arc.scene.ui.TextButton; -import arc.scene.ui.layout.Table; -import mindustry.graphics.Pal; +import arc.scene.event.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; +import mindustry.graphics.*; import mindustry.ui.*; public class LoadingFragment extends Fragment{ @@ -22,11 +21,11 @@ public class LoadingFragment extends Fragment{ t.visible(false); t.touchable(Touchable.enabled); t.add().height(133f).row(); - t.image().growX().height(3f).pad(4f).growX().get().setColor(Pal.accent); + t.add(new WarningBar()).growX().height(24f); t.row(); - t.add("$loading").name("namelabel").pad(10f); + t.add("$loading").name("namelabel").pad(10f).style(Styles.techLabel); t.row(); - t.image().growX().height(3f).pad(4f).growX().get().setColor(Pal.accent); + t.add(new WarningBar()).growX().height(24f); t.row(); bar = t.add(new Bar()).pad(3).size(500f, 40f).visible(false).get(); diff --git a/core/src/mindustry/ui/fragments/PlacementFragment.java b/core/src/mindustry/ui/fragments/PlacementFragment.java index 7f5775b2d7..3ead933791 100644 --- a/core/src/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/mindustry/ui/fragments/PlacementFragment.java @@ -10,11 +10,12 @@ import arc.scene.style.*; import arc.scene.ui.*; import arc.scene.ui.layout.*; import arc.struct.*; +import arc.util.ArcAnnotate.*; import arc.util.*; -import mindustry.content.*; -import mindustry.gen.*; +import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.game.EventType.*; +import mindustry.gen.*; import mindustry.graphics.*; import mindustry.input.*; import mindustry.type.*; @@ -27,17 +28,16 @@ public class PlacementFragment extends Fragment{ final int rowWidth = 4; public Category currentCategory = Category.distribution; - Array returnArray = new Array<>(); - Array returnCatArray = new Array<>(); + Seq returnArray = new Seq<>(); + Seq returnCatArray = new Seq<>(); boolean[] categoryEmpty = new boolean[Category.all.length]; ObjectMap selectedBlocks = new ObjectMap<>(); ObjectFloatMap scrollPositions = new ObjectFloatMap<>(); - Block hovered, lastDisplay; - Tile lastHover; - Tile hoverTile; + Block menuHoverBlock; + Object lastDisplayState; + boolean wasHovered; Table blockTable, toggler, topTable; ScrollPane blockPane; - boolean lastGround; boolean blockSelectEnd; int blockSelectSeq; long blockSelectSeqMillis; @@ -94,7 +94,7 @@ public class PlacementFragment extends Fragment{ Block tryRecipe = tile == null ? null : tile.block(); Object tryConfig = tile == null ? null : tile.config(); - for(BuildRequest req : player.builder().requests()){ + for(BuildPlan req : player.builder().plans()){ if(!req.breaking && req.block.bounds(req.x, req.y, Tmp.r1).contains(Core.input.mouseWorld())){ tryRecipe = req.block; tryConfig = req.config; @@ -115,7 +115,7 @@ public class PlacementFragment extends Fragment{ for(int i = 0; i < blockSelect.length; i++){ if(Core.input.keyTap(blockSelect[i])){ if(i > 9) { //select block directionally - Array blocks = getByCategory(currentCategory); + Seq blocks = getUnlockedByCategory(currentCategory); Block currentBlock = getSelectedBlock(currentCategory); for(int j = 0; j < blocks.size; j++){ if(blocks.get(j) == currentBlock){ @@ -140,7 +140,7 @@ public class PlacementFragment extends Fragment{ } }else if(blockSelectEnd || Time.timeSinceMillis(blockSelectSeqMillis) > Core.settings.getInt("blockselecttimeout")){ //1st number of combo, select category //select only visible categories - if(!getByCategory(Category.all[i]).isEmpty()){ + if(!getUnlockedByCategory(Category.all[i]).isEmpty()){ currentCategory = Category.all[i]; if(input.block != null){ input.block = getSelectedBlock(currentCategory); @@ -157,7 +157,8 @@ public class PlacementFragment extends Fragment{ i += (blockSelectSeq - (i != 9 ? 0 : 1)) * 10; blockSelectEnd = true; } - Array blocks = getByCategory(currentCategory); + Seq blocks = getByCategory(currentCategory); + if(!unlocked(blocks.get(i))) return true; input.block = (i < blocks.size) ? blocks.get(i) : null; selectedBlocks.put(currentCategory, input.block); blockSelectSeqMillis = Time.millis(); @@ -203,7 +204,8 @@ public class PlacementFragment extends Fragment{ ButtonGroup group = new ButtonGroup<>(); group.setMinCheckCount(0); - for(Block block : getByCategory(currentCategory)){ + for(Block block : getUnlockedByCategory(currentCategory)){ + if(!unlocked(block)) continue; if(index++ % rowWidth == 0){ blockTable.row(); } @@ -222,7 +224,7 @@ public class PlacementFragment extends Fragment{ button.resizeImage(Cicon.medium.size); button.update(() -> { //color unplacable things gray - Tilec core = player.closestCore(); + Tilec core = player.core(); Color color = (state.rules.infiniteResources || (core != null && (core.items().has(block.requirements, state.rules.buildCostMultiplier) || state.rules.infiniteResources))) && player.isBuilder() ? Color.white : Color.gray; button.forEach(elem -> elem.setColor(color)); button.setChecked(control.input.block == block); @@ -232,10 +234,10 @@ public class PlacementFragment extends Fragment{ } }); - button.hovered(() -> hovered = block); + button.hovered(() -> menuHoverBlock = block); button.exited(() -> { - if(hovered == block){ - hovered = null; + if(menuHoverBlock == block){ + menuHoverBlock = null; } }); } @@ -258,27 +260,32 @@ public class PlacementFragment extends Fragment{ frame.table(Tex.buttonEdge2,top -> { topTable = top; top.add(new Table()).growX().update(topTable -> { + + //find current hovered thing + Displayable hovered = hovered(); + Block displayBlock = menuHoverBlock != null ? menuHoverBlock : control.input.block; + Object displayState = displayBlock != null ? displayBlock : hovered; + boolean isHovered = displayBlock == null; //use hovered thing if displayblock is null + //don't refresh unnecessarily - if((tileDisplayBlock() == null && lastDisplay == getSelected() && !lastGround) - || (tileDisplayBlock() != null && lastHover == hoverTile && lastDisplay == tileDisplayBlock() && lastGround)) - return; + //refresh only when the hover state changes, or the displayed block changes + if(wasHovered == isHovered && lastDisplayState == displayState) return; topTable.clear(); topTable.top().left().margin(5); - lastHover = hoverTile; - lastDisplay = getSelected(); - lastGround = tileDisplayBlock() != null; + lastDisplayState = displayState; + wasHovered = isHovered; - if(lastDisplay != null){ //show selected recipe - lastGround = false; + //show details of selected block, with costs + if(displayBlock != null){ topTable.table(header -> { String keyCombo = ""; if(!mobile && Core.settings.getBool("blockselectkeys")){ - Array blocks = getByCategory(currentCategory); + Seq blocks = getByCategory(currentCategory); for(int i = 0; i < blocks.size; i++){ - if(blocks.get(i) == lastDisplay && (i + 1) / 10 - 1 < blockSelect.length){ + if(blocks.get(i) == displayBlock && (i + 1) / 10 - 1 < blockSelect.length){ keyCombo = Core.bundle.format("placement.blockselectkeys", Core.keybinds.get(blockSelect[currentCategory.ordinal()]).key.toString()) + (i < 10 ? "" : Core.keybinds.get(blockSelect[(i + 1) / 10 - 1]).key.toString() + ",") + Core.keybinds.get(blockSelect[i % 10]).key.toString() + "]"; @@ -288,13 +295,13 @@ public class PlacementFragment extends Fragment{ } final String keyComboFinal = keyCombo; header.left(); - header.add(new Image(lastDisplay.icon(Cicon.medium))).size(8 * 4); - header.labelWrap(() -> !unlocked(lastDisplay) ? Core.bundle.get("block.unknown") : lastDisplay.localizedName + keyComboFinal) + header.add(new Image(displayBlock.icon(Cicon.medium))).size(8 * 4); + header.labelWrap(() -> !unlocked(displayBlock) ? Core.bundle.get("block.unknown") : displayBlock.localizedName + keyComboFinal) .left().width(190f).padLeft(5); header.add().growX(); - if(unlocked(lastDisplay)){ + if(unlocked(displayBlock)){ header.button("?", Styles.clearPartialt, () -> { - ui.content.show(lastDisplay); + ui.content.show(displayBlock); Events.fire(new BlockInfoEvent()); }).size(8 * 5).padTop(-5).padRight(-5).right().grow().name("blockinfo"); } @@ -304,13 +311,13 @@ public class PlacementFragment extends Fragment{ topTable.table(req -> { req.top().left(); - for(ItemStack stack : lastDisplay.requirements){ + for(ItemStack stack : displayBlock.requirements){ req.table(line -> { line.left(); line.image(stack.item.icon(Cicon.small)).size(8 * 2); line.add(stack.item.localizedName).maxWidth(140f).fillX().color(Color.lightGray).padLeft(2).left().get().setEllipsis(true); line.labelWrap(() -> { - Tilec core = player.closestCore(); + Tilec core = player.core(); if(core == null || state.rules.infiniteResources) return "*/*"; int amount = core.items().get(stack.item); @@ -324,34 +331,21 @@ public class PlacementFragment extends Fragment{ } }).growX().left().margin(3); - if(!lastDisplay.isPlaceable() || !player.isBuilder()){ + if(!displayBlock.isPlaceable() || !player.isBuilder()){ topTable.row(); topTable.table(b -> { b.image(Icon.cancel).padRight(2).color(Color.scarlet); - b.add(!player.isBuilder() ? "$unit.nobuild" : lastDisplay.unplaceableMessage()).width(190f).wrap(); + b.add(!player.isBuilder() ? "$unit.nobuild" : displayBlock.unplaceableMessage()).width(190f).wrap(); b.left(); }).padTop(2).left(); } - }else if(tileDisplayBlock() != null){ //show selected tile - lastDisplay = tileDisplayBlock(); - topTable.table(t -> { - t.left(); - t.add(new Image(lastDisplay.getDisplayIcon(hoverTile))).size(8 * 4); - t.labelWrap(lastDisplay.getDisplayName(hoverTile)).left().width(190f).padLeft(5); - }).growX().left(); - if(hoverTile.team() == player.team()){ - topTable.row(); - topTable.table(t -> { - t.left().defaults().left(); - if(hoverTile.entity != null){ - hoverTile.entity.display(t); - } - }).left().growX(); - } + }else if(hovered != null){ + //show hovered item, whatever that may be + hovered.display(topTable); } }); - }).colspan(3).fillX().visible(() -> getSelected() != null || tileDisplayBlock() != null).touchable(Touchable.enabled); + }).colspan(3).fillX().visible(this::hasInfoBox).touchable(Touchable.enabled); frame.row(); frame.image().color(Pal.gray).colspan(3).height(4).growX(); frame.row(); @@ -384,7 +378,7 @@ public class PlacementFragment extends Fragment{ //update category empty values for(Category cat : Category.all){ - Array blocks = getByCategory(cat); + Seq blocks = getUnlockedByCategory(cat); categoryEmpty[cat.ordinal()] = blocks.isEmpty(); } @@ -415,70 +409,58 @@ public class PlacementFragment extends Fragment{ }); } - Array getCategories(){ - returnCatArray.clear(); - returnCatArray.addAll(Category.all); - returnCatArray.sort((c1, c2) -> Boolean.compare(categoryEmpty[c1.ordinal()], categoryEmpty[c2.ordinal()])); - return returnCatArray; + Seq getCategories(){ + return returnCatArray.clear().addAll(Category.all).sort((c1, c2) -> Boolean.compare(categoryEmpty[c1.ordinal()], categoryEmpty[c2.ordinal()])); } - Array getByCategory(Category cat){ - returnArray.clear(); - for(Block block : content.blocks()){ - if(block.category == cat && block.isVisible() && unlocked(block)){ - returnArray.add(block); - } - } - returnArray.sort((b1, b2) -> { - int locked = -Boolean.compare(unlocked(b1), unlocked(b2)); - if(locked != 0) return locked; - return Boolean.compare(!b1.isPlaceable(), !b2.isPlaceable()); - }); - return returnArray; + Seq getByCategory(Category cat){ + return returnArray.selectFrom(content.blocks(), block -> block.category == cat && block.isVisible()); + } + + 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())); } Block getSelectedBlock(Category cat){ - if(selectedBlocks.get(cat) == null){ - selectedBlocks.put(cat, getByCategory(cat).find(this::unlocked)); - } - return selectedBlocks.get(cat); + return selectedBlocks.get(cat, () -> getByCategory(cat).find(this::unlocked)); } boolean unlocked(Block block){ - return !state.isCampaign() || data.isUnlocked(block); + return block.unlockedNow(); } - /** Returns the currently displayed block in the top box. */ - Block getSelected(){ - Block toDisplay = null; + boolean hasInfoBox(){ + return control.input.block != null || menuHoverBlock != null || hovered() != null; + } + /** Returns the thing being hovered over. */ + @Nullable + Displayable hovered(){ Vec2 v = topTable.stageToLocalCoordinates(Core.input.mouse()); - //setup hovering tile - if(!Core.scene.hasMouse() && topTable.hit(v.x, v.y, false) == null){ - hoverTile = world.tileWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); - if(hoverTile != null && hoverTile.entity != null){ + //if the mouse intersects the table or the UI has the mouse, no hovering can occur + if(Core.scene.hasMouse() || topTable.hit(v.x, v.y, false) != null) return null; + + //check for a unit + Unitc unit = Units.closestOverlap(player.team(), Core.input.mouseWorldX(), Core.input.mouseWorldY(), 5f, u -> !u.isLocal()); + //if cursor has a unit, display it + if(unit != null) return unit; + + //check tile being hovered over + Tile hoverTile = world.tileWorld(Core.input.mouseWorld().x, Core.input.mouseWorld().y); + if(hoverTile != null){ + //if the tile has an entity, display it + if(hoverTile.entity != null){ hoverTile.entity.updateFlow(true); + return hoverTile.entity; + } + + //if the tile has a drop, display the drop + if(hoverTile.drop() != null){ + return hoverTile; } - }else{ - hoverTile = null; } - //block currently selected - if(control.input.block != null){ - toDisplay = control.input.block; - } - - //block hovered on in build menu - if(hovered != null){ - toDisplay = hovered; - } - - return toDisplay; - } - - /** Returns the block currently being hovered over in the world. */ - Block tileDisplayBlock(){ - return hoverTile == null ? null : hoverTile.block().synthetic() ? hoverTile.block() : hoverTile.drop() != null && hoverTile.block() == Blocks.air ? hoverTile.overlay().itemDrop != null ? hoverTile.overlay() : hoverTile.floor() : null; + return null; } } diff --git a/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java b/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java index 524bf08770..7a057a262d 100644 --- a/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java +++ b/core/src/mindustry/ui/fragments/ScriptConsoleFragment.java @@ -20,7 +20,7 @@ import static mindustry.Vars.*; public class ScriptConsoleFragment extends Table{ private final static int messagesShown = 30; - private Array messages = new Array<>(); + private Seq messages = new Seq<>(); private boolean open = false, shown; private TextField chatfield; private Label fieldlabel = new Label(">"); @@ -29,7 +29,7 @@ public class ScriptConsoleFragment extends Table{ private float offsetx = Scl.scl(4), offsety = Scl.scl(4), fontoffsetx = Scl.scl(2), chatspace = Scl.scl(50); private Color shadowColor = new Color(0, 0, 0, 0.4f); private float textspacing = Scl.scl(10); - private Array history = new Array<>(); + private Seq history = new Seq<>(); private int historyPos = 0; private int scrollPos = 0; private Fragment container = new Fragment(){ diff --git a/core/src/mindustry/ui/layout/BranchTreeLayout.java b/core/src/mindustry/ui/layout/BranchTreeLayout.java index 0e24685705..c2739fbada 100644 --- a/core/src/mindustry/ui/layout/BranchTreeLayout.java +++ b/core/src/mindustry/ui/layout/BranchTreeLayout.java @@ -12,7 +12,7 @@ public class BranchTreeLayout implements TreeLayout{ public float gapBetweenLevels = 10; public float gapBetweenNodes = 10f; - private final FloatArray sizeOfLevel = new FloatArray(); + private final FloatSeq sizeOfLevel = new FloatSeq(); private float boundsLeft = Float.MAX_VALUE; private float boundsRight = Float.MIN_VALUE; private float boundsTop = Float.MAX_VALUE; @@ -229,8 +229,7 @@ public class BranchTreeLayout implements TreeLayout{ TreeNode previousChild = null; for(TreeNode w : v.children){ firstWalk(w, previousChild); - defaultAncestor = apportion(w, defaultAncestor, previousChild, - v); + defaultAncestor = apportion(w, defaultAncestor, previousChild, v); previousChild = w; } executeShifts(v); @@ -257,8 +256,7 @@ public class BranchTreeLayout implements TreeLayout{ }else if(alignment == TreeAlignment.towardsRoot){ y = levelStart + levelChangeSign * (getNodeThickness(v) / 2); }else{ - y = levelStart + levelSize - levelChangeSign - * (getNodeThickness(v) / 2); + y = levelStart + levelSize - levelChangeSign * (getNodeThickness(v) / 2); } if(!levelChangeOnYAxis){ diff --git a/core/src/mindustry/ui/layout/RowTreeLayout.java b/core/src/mindustry/ui/layout/RowTreeLayout.java index 58fa8596e4..c79b01abbf 100644 --- a/core/src/mindustry/ui/layout/RowTreeLayout.java +++ b/core/src/mindustry/ui/layout/RowTreeLayout.java @@ -6,7 +6,7 @@ public class RowTreeLayout implements TreeLayout{ @Override public void layout(TreeNode root){ - layout(root, 0, new IntArray()); + layout(root, 0, new IntSeq()); /* def minimum_ws(tree, depth=0): @@ -18,7 +18,7 @@ public class RowTreeLayout implements TreeLayout{ */ } - void layout(TreeNode node, int depth, IntArray nexts){ + void layout(TreeNode node, int depth, IntSeq nexts){ float size = node.height * 5f; if(nexts.size < depth + 1){ diff --git a/core/src/mindustry/world/Block.java b/core/src/mindustry/world/Block.java index e706110633..601c31fac1 100644 --- a/core/src/mindustry/world/Block.java +++ b/core/src/mindustry/world/Block.java @@ -9,7 +9,6 @@ import arc.graphics.g2d.TextureAtlas.*; import arc.math.*; import arc.math.geom.*; import arc.scene.ui.layout.*; -import arc.struct.Array; import arc.struct.EnumSet; import arc.struct.*; import arc.util.*; @@ -19,6 +18,7 @@ import mindustry.annotations.Annotations.*; import mindustry.ctype.*; import mindustry.entities.*; import mindustry.entities.units.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.graphics.MultiPacker.*; @@ -35,7 +35,7 @@ import java.util.*; import static mindustry.Vars.*; public class Block extends UnlockableContent{ - public static final int crackRegions = 8, maxCrackSize = 5; + public static final int crackRegions = 8, maxCrackSize = 9; public boolean hasItems; public boolean hasLiquids; @@ -173,22 +173,20 @@ public class Block extends UnlockableContent{ public boolean instantTransfer = false; protected Prov entityType = null; //initialized later - //TODO move public ObjectMap, Cons2> configurations = new ObjectMap<>(); //TODO move protected TextureRegion[] generatedIcons; protected TextureRegion[] variantRegions, editorVariantRegions; - public TextureRegion region, editorIcon; - //TODO remove completely - protected TextureRegion[] cacheRegions = {}; - protected Array cacheRegionStrings = new Array<>(); + public TextureRegion region, editorIcon; + public @Load("@-team") TextureRegion teamRegion; + public TextureRegion[] teamRegions; //TODO move public static TextureRegion[][] cracks; - protected static final Array tempTiles = new Array<>(); - protected static final Array tempTileEnts = new Array<>(); + protected static final Seq tempTiles = new Seq<>(); + protected static final Seq tempTileEnts = new Seq<>(); /** Dump timer ID.*/ protected final int timerDump = timers++; @@ -200,7 +198,6 @@ public class Block extends UnlockableContent{ initEntity(); } - //TODO rename to draw() once class refactoring is done. public void drawBase(Tile tile){ //delegates to entity unless it is null if(tile.entity != null){ @@ -283,7 +280,7 @@ public class Block extends UnlockableContent{ } /** Returns whether ot not this block can be place on the specified */ - public boolean canPlaceOn(Tile tile){ + public boolean canPlaceOn(Tile tile, Team team){ return true; } @@ -348,11 +345,11 @@ public class Block extends UnlockableContent{ } /** @return a possible replacement for this block when placed in a line by the player. */ - public Block getReplacement(BuildRequest req, Array requests){ + public Block getReplacement(BuildPlan req, Seq requests){ return this; } - public void drawRequest(BuildRequest req, Eachable list, boolean valid){ + 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)); Draw.alpha(1f); @@ -363,7 +360,7 @@ public class Block extends UnlockableContent{ Draw.reset(); } - public void drawRequestRegion(BuildRequest req, Eachable list){ + public void drawRequestRegion(BuildPlan req, Eachable list){ TextureRegion reg = getRequestRegion(req, list); Draw.rect(reg, req.drawx(), req.drawy(), !rotate ? 0 : req.rotation * 90); @@ -372,15 +369,15 @@ public class Block extends UnlockableContent{ } } - public TextureRegion getRequestRegion(BuildRequest req, Eachable list){ + public TextureRegion getRequestRegion(BuildPlan req, Eachable list){ return icon(Cicon.full); } - public void drawRequestConfig(BuildRequest req, Eachable list){ + public void drawRequestConfig(BuildPlan req, Eachable list){ } - public void drawRequestConfigCenter(BuildRequest req, Object content, String region){ + public void drawRequestConfigCenter(BuildPlan req, Object content, String region){ Color color = content instanceof Item ? ((Item)content).color : content instanceof Liquid ? ((Liquid)content).color : null; if(color == null) return; @@ -389,17 +386,17 @@ public class Block extends UnlockableContent{ Draw.color(); } - public void drawRequestConfigTop(BuildRequest req, Eachable list){ + public void drawRequestConfigTop(BuildPlan req, Eachable list){ } /** Configure when a null value is passed.*/ - public void configClear(Cons cons){ - configurations.put(void.class, (tile, value) -> cons.get((Tilec)tile)); + public void configClear(Cons cons){ + configurations.put(void.class, (tile, value) -> cons.get((E)tile)); } /** Listen for a config by class type. */ - public void config(Class type, Cons2 config){ + public void config(Class type, Cons2 config){ configurations.put(type, config); } @@ -443,13 +440,13 @@ public class Block extends UnlockableContent{ return editorVariantRegions; } - protected TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name)}; + protected TextureRegion[] icons(){ + return new TextureRegion[]{region}; } public TextureRegion[] getGeneratedIcons(){ if(generatedIcons == null){ - generatedIcons = generateIcons(); + generatedIcons = icons(); } return generatedIcons; } @@ -574,19 +571,6 @@ public class Block extends UnlockableContent{ } } - /** Adds a region by name to be loaded, with the final name "{name}-suffix". Returns an ID to looks this region up by in {@link #re(int)}. - * DO NOT USE. This will eventually be removed. */ - protected int re(String suffix){ - cacheRegionStrings.add(name + suffix); - return cacheRegionStrings.size - 1; - } - - /** Returns an internally cached region by ID. - * DO NOT USE. This will eventually be removed*/ - protected TextureRegion re(int id){ - return cacheRegions[id]; - } - @Override public void displayInfo(Table table){ ContentDisplay.displayBlock(table, this); @@ -631,11 +615,6 @@ public class Block extends UnlockableContent{ public void load(){ region = Core.atlas.find(name); - cacheRegions = new TextureRegion[cacheRegionStrings.size]; - for(int i = 0; i < cacheRegions.length; i++){ - cacheRegions[i] = Core.atlas.find(cacheRegionStrings.get(i)); - } - if(cracks == null || (cracks[0][0].getTexture() != null && cracks[0][0].getTexture().isDisposed())){ cracks = new TextureRegion[maxCrackSize][crackRegions]; for(int size = 1; size <= maxCrackSize; size++){ @@ -646,6 +625,16 @@ public class Block extends UnlockableContent{ } ContentRegions.loadRegions(this); + + //load specific team regions + teamRegions = new TextureRegion[Team.all.length]; + for(Team team : Team.all){ + if(team.hasPalette){ + teamRegions[team.uid] = Core.atlas.find(name + "-team-" + team.name); + }else{ + teamRegions[team.uid] = teamRegion; + } + } } @Override diff --git a/core/src/mindustry/world/Build.java b/core/src/mindustry/world/Build.java index 30dc86f5ea..bc6c214fa8 100644 --- a/core/src/mindustry/world/Build.java +++ b/core/src/mindustry/world/Build.java @@ -86,7 +86,7 @@ public class Build{ } if(type.isMultiblock()){ - if((type.canReplace(tile.block()) || (tile.block instanceof BuildBlock && tile.ent().cblock == type)) && tile.block().size == type.size && type.canPlaceOn(tile) && tile.interactable(team)){ + if((type.canReplace(tile.block()) || (tile.block instanceof BuildBlock && tile.ent().cblock == type)) && tile.block().size == type.size && type.canPlaceOn(tile, team) && tile.interactable(team)){ return true; } @@ -95,7 +95,7 @@ public class Build{ return false; } - if(!type.canPlaceOn(tile)){ + if(!type.canPlaceOn(tile, team)){ return false; } @@ -124,7 +124,7 @@ public class Build{ && (!type.requiresWater || tile.floor().liquidDrop == Liquids.water) && (((type.canReplace(tile.block()) || (tile.block instanceof BuildBlock && tile.ent().cblock == type)) && !(type == tile.block() && rotation == tile.rotation() && type.rotate)) || tile.block().alwaysReplace || tile.block() == Blocks.air) - && tile.block().isMultiblock() == type.isMultiblock() && type.canPlaceOn(tile); + && tile.block().isMultiblock() == type.isMultiblock() && type.canPlaceOn(tile, team); } } diff --git a/core/src/mindustry/world/Tile.java b/core/src/mindustry/world/Tile.java index 545378c23a..975806bee7 100644 --- a/core/src/mindustry/world/Tile.java +++ b/core/src/mindustry/world/Tile.java @@ -4,6 +4,8 @@ import arc.func.*; import arc.math.*; import arc.math.geom.*; import arc.math.geom.QuadTree.*; +import arc.scene.ui.*; +import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.ArcAnnotate.*; import mindustry.annotations.Annotations.*; @@ -11,11 +13,12 @@ import mindustry.content.*; import mindustry.game.*; import mindustry.gen.*; import mindustry.type.*; +import mindustry.ui.*; import mindustry.world.blocks.environment.*; import static mindustry.Vars.*; -public class Tile implements Position, QuadTreeObject{ +public class Tile implements Position, QuadTreeObject, Displayable{ static final ObjectSet tileSet = new ObjectSet<>(); /** Tile traversal cost. */ @@ -23,8 +26,6 @@ public class Tile implements Position, QuadTreeObject{ /** Tile entity, usually null. */ public @Nullable Tilec entity; public short x, y; - /** Extra data. Used for dumping. */ - public byte data; protected @NonNull Block block; protected @NonNull Floor floor; protected @NonNull Floor overlay; @@ -348,10 +349,6 @@ public class Tile implements Position, QuadTreeObject{ return block.destructible || block.breakable || block.update; } - public boolean isEnemyCheat(){ - return team() == state.rules.waveTeam && state.rules.enemyCheat; - } - /** * Returns the list of all tiles linked to this multiblock, or just itself if it's not a multiblock. * This array contains all linked tiles, including this tile itself. @@ -376,7 +373,7 @@ public class Tile implements Position, QuadTreeObject{ * Returns the list of all tiles linked to this multiblock. * This array contains all linked tiles, including this tile itself. */ - public Array getLinkedTiles(Array tmpArray){ + public Seq getLinkedTiles(Seq tmpArray){ tmpArray.clear(); getLinkedTiles(tmpArray::add); return tmpArray; @@ -386,7 +383,7 @@ public class Tile implements Position, QuadTreeObject{ * Returns the list of all tiles linked to this multiblock if it were this block. * This array contains all linked tiles, including this tile itself. */ - public Array getLinkedTilesAs(Block block, Array tmpArray){ + public Seq getLinkedTilesAs(Block block, Seq tmpArray){ tmpArray.clear(); if(block.isMultiblock()){ int offsetx = -(block.size - 1) / 2; @@ -589,6 +586,17 @@ public class Tile implements Position, QuadTreeObject{ } } + @Override + public void display(Table table){ + Block toDisplay = overlay.itemDrop != null ? overlay : floor; + + table.table(t -> { + t.left(); + t.add(new Image(toDisplay.getDisplayIcon(this))).size(8 * 4); + t.labelWrap(toDisplay.getDisplayName(this)).left().width(190f).padLeft(5); + }).growX().left(); + } + @Override public float getX(){ return drawx(); diff --git a/core/src/mindustry/world/blocks/Autotiler.java b/core/src/mindustry/world/blocks/Autotiler.java index bfa4c309e0..a1c7cd7e5c 100644 --- a/core/src/mindustry/world/blocks/Autotiler.java +++ b/core/src/mindustry/world/blocks/Autotiler.java @@ -17,7 +17,7 @@ public interface Autotiler{ //holds some static temporary variables, required due to some RoboVM bugs class AutotilerHolder{ static final int[] blendresult = new int[5]; - static final BuildRequest[] directionals = new BuildRequest[4]; + static final BuildPlan[] directionals = new BuildPlan[4]; } /** slices a texture region: @@ -44,9 +44,9 @@ public interface Autotiler{ return region; } - default @Nullable int[] getTiling(BuildRequest req, Eachable list){ + default @Nullable int[] getTiling(BuildPlan req, Eachable list){ if(req.tile() == null) return null; - BuildRequest[] directionals = AutotilerHolder.directionals; + BuildPlan[] directionals = AutotilerHolder.directionals; Arrays.fill(directionals, null); list.each(other -> { @@ -78,7 +78,7 @@ public interface Autotiler{ * [3]: a 4-bit mask with bits 0-3 indicating blend state in that direction (0 being 0 degrees, 1 being 90, etc) * [4]: same as [3] but only blends with non-square sprites * */ - default int[] buildBlending(Tile tile, int rotation, BuildRequest[] directional, boolean world){ + default int[] buildBlending(Tile tile, int rotation, BuildPlan[] directional, boolean world){ int[] blendresult = AutotilerHolder.blendresult; blendresult[0] = 0; blendresult[1] = blendresult[2] = 1; @@ -134,10 +134,10 @@ public interface Autotiler{ return Point2.equals(x + Geometry.d4(rotation).x,y + Geometry.d4(rotation).y, x2, y2); } - default boolean blends(Tile tile, int rotation, @Nullable BuildRequest[] directional, int direction, boolean checkWorld){ + default boolean blends(Tile tile, int rotation, @Nullable BuildPlan[] directional, int direction, boolean checkWorld){ int realDir = Mathf.mod(rotation - direction, 4); if(directional != null && directional[realDir] != null){ - BuildRequest req = directional[realDir]; + BuildPlan req = directional[realDir]; if(blends(tile, rotation, req.x, req.y, req.rotation, req.block)){ return true; } @@ -163,10 +163,17 @@ public interface Autotiler{ /** @return whether this tile is looking at the other tile, or the other tile is looking at this one. * If the other tile does not rotate, it is always considered to be facing this one. */ - default boolean lookingAt(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ + default boolean lookingAtEither(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ return (Point2.equals(tile.x + Geometry.d4(rotation).x, tile.y + Geometry.d4(rotation).y, otherx, othery) || (!otherblock.rotatedOutput(otherx, othery) || Point2.equals(otherx + Geometry.d4(otherrot).x, othery + Geometry.d4(otherrot).y, tile.x, tile.y))); } + /** @return whether this tile is looking at the other tile. */ + default boolean lookingAt(Tile tile, int rotation, int otherx, int othery, Block otherblock){ + Tile facing = Edges.getFacingEdge(otherblock, otherx, othery, tile); + return facing != null && + Point2.equals(tile.x + Geometry.d4(rotation).x, tile.y + Geometry.d4(rotation).y, facing.x, facing.y); + } + boolean blends(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/BuildBlock.java index eb9e8fafd1..6ff80cee2f 100644 --- a/core/src/mindustry/world/blocks/BuildBlock.java +++ b/core/src/mindustry/world/blocks/BuildBlock.java @@ -154,7 +154,7 @@ public class BuildBlock extends Block{ if(control.input.buildWasAutoPaused && !control.input.isBuilding && player.isBuilder()){ control.input.isBuilding = true; } - player.builder().addBuild(new BuildRequest(tile.x, tile.y, tile.rotation(), cblock), false); + player.builder().addBuild(new BuildPlan(tile.x, tile.y, tile.rotation(), cblock), false); } } @@ -200,7 +200,7 @@ public class BuildBlock extends Block{ setConstruct(previous, cblock); } - float maxProgress = core == null ? amount : checkRequired(core.items(), amount, false); + float maxProgress = core == null || team.rules().infiniteResources ? amount : checkRequired(core.items(), amount, false); for(int i = 0; i < cblock.requirements.length; i++){ int reqamount = Math.round(state.rules.buildCostMultiplier * cblock.requirements[i].amount); @@ -208,7 +208,7 @@ public class BuildBlock extends Block{ totalAccumulator[i] = Math.min(totalAccumulator[i] + reqamount * maxProgress, reqamount); } - maxProgress = core == null ? maxProgress : checkRequired(core.items(), maxProgress, true); + maxProgress = core == null || team.rules().infiniteResources ? maxProgress : checkRequired(core.items(), maxProgress, true); progress = Mathf.clamp(progress + maxProgress); builderID = builder.id(); diff --git a/core/src/mindustry/world/blocks/ItemSelection.java b/core/src/mindustry/world/blocks/ItemSelection.java index 0e2376eb47..921808eb08 100644 --- a/core/src/mindustry/world/blocks/ItemSelection.java +++ b/core/src/mindustry/world/blocks/ItemSelection.java @@ -14,7 +14,7 @@ import static mindustry.Vars.*; public class ItemSelection{ private static float scrollPos = 0f; - public static void buildTable(Table table, Array items, Prov holder, Cons consumer){ + public static void buildTable(Table table, Seq items, Prov holder, Cons consumer){ ButtonGroup group = new ButtonGroup<>(); group.setMinCheckCount(0); @@ -24,7 +24,7 @@ public class ItemSelection{ int i = 0; for(T item : items){ - if(!data.isUnlocked(item) && state.isCampaign()) continue; + if(!item.unlockedNow()) continue; ImageButton button = cont.button(Tex.whiteui, Styles.clearToggleTransi, 24, () -> control.input.frag.config.hideConfig()).group(group).get(); button.changed(() -> consumer.get(button.isChecked() ? item : null)); diff --git a/core/src/mindustry/world/blocks/campaign/CoreLauncher.java b/core/src/mindustry/world/blocks/campaign/CoreLauncher.java deleted file mode 100644 index e61624d757..0000000000 --- a/core/src/mindustry/world/blocks/campaign/CoreLauncher.java +++ /dev/null @@ -1,127 +0,0 @@ -package mindustry.world.blocks.campaign; - -import arc.Graphics.*; -import arc.Graphics.Cursor.*; -import arc.graphics.g2d.*; -import arc.math.*; -import arc.util.*; -import mindustry.*; -import mindustry.annotations.Annotations.*; -import mindustry.content.*; -import mindustry.gen.*; -import mindustry.graphics.*; -import mindustry.ui.*; -import mindustry.world.*; - -import static mindustry.Vars.*; - -public class CoreLauncher extends Block{ - public int range = 1; - - public CoreLauncher(String name){ - super(name); - - hasItems = true; - configurable = true; - update = true; - //will be enabled when needed (if at all) - //buildPlaceability = BuildPlaceability.sectorCaptured; - } - - public class CoreLauncherEntity extends TileEntity{ - - @Override - public void updateTile(){ - super.updateTile(); - } - - @Override - public boolean configTapped(){ - - if(state.isCampaign() && consValid()){ - Vars.ui.planet.show(state.rules.sector, range, this); - } - return false; - } - - @Override - public Cursor getCursor(){ - return consValid() ? SystemCursor.hand : SystemCursor.arrow; - } - - public void launch(){ - LaunchCorec ent = LaunchCoreEntity.create(); - ent.set(this); - ent.block(Blocks.coreShard); - ent.lifetime(Vars.launchDuration); - ent.add(); - - cons.trigger(); - } - } - - @EntityDef(value = LaunchCorec.class, serialize = false) - @Component - static abstract class LaunchCoreComp implements Drawc, Timedc{ - @Import float x, y; - - transient Interval in = new Interval(); - Block block; - - @Override - public void draw(){ - float alpha = fout(Interp.pow5Out); - float scale = (1f - alpha) * 1.4f + 1f; - float cx = cx(), cy = cy(); - float rotation = fin() * (140f + Mathf.randomSeedRange(id(), 50f)); - - Draw.z(Layer.effect + 0.001f); - - Draw.color(Pal.engine); - - float rad = 0.2f + fslope(); - float rscl = (block.size - 1) * 0.85f; - - Fill.light(cx, cy, 10, 25f * (rad + scale-1f) * rscl, Tmp.c2.set(Pal.engine).a(alpha), Tmp.c1.set(Pal.engine).a(0f)); - - Draw.alpha(alpha); - for(int i = 0; i < 4; i++){ - Drawf.tri(cx, cy, 6f * rscl, 40f * (rad + scale-1f) * rscl, i * 90f + rotation); - } - - Draw.color(); - - Draw.z(Layer.weather - 1); - - TextureRegion region = block.icon(Cicon.full); - float rw = region.getWidth() * Draw.scl * scale, rh = region.getHeight() * Draw.scl * scale; - - Draw.alpha(alpha); - Draw.rect(region, cx, cy, rw, rh, rotation - 45); - - Tmp.v1.trns(225f, fin(Interp.pow3In) * 250f); - - Draw.z(Layer.flyingUnit + 1); - Draw.color(0, 0, 0, 0.22f * alpha); - Draw.rect(region, cx + Tmp.v1.x, cy + Tmp.v1.y, rw, rh, rotation - 45); - - Draw.reset(); - } - - float cx(){ - return x + fin(Interp.pow2In) * (12f + Mathf.randomSeedRange(id() + 3, 4f)); - } - - float cy(){ - return y + fin(Interp.pow5In) * (100f + Mathf.randomSeedRange(id() + 2, 30f)); - } - - @Override - public void update(){ - float r = 4f; - if(in.get(3f - fin()*2f)){ - Fx.rocketSmokeLarge.at(cx() + Mathf.range(r), cy() + Mathf.range(r), fin()); - } - } - } -} diff --git a/core/src/mindustry/world/blocks/campaign/LaunchPad.java b/core/src/mindustry/world/blocks/campaign/LaunchPad.java index 7dbded1b5c..5b12cb0ab5 100644 --- a/core/src/mindustry/world/blocks/campaign/LaunchPad.java +++ b/core/src/mindustry/world/blocks/campaign/LaunchPad.java @@ -113,7 +113,7 @@ public class LaunchPad extends Block{ static abstract class LaunchPayloadComp implements Drawc, Timedc, Teamc{ @Import float x,y; - Array stacks = new Array<>(); + Seq stacks = new Seq<>(); transient Interval in = new Interval(); @Override @@ -177,7 +177,8 @@ public class LaunchPad extends Block{ //actually launch the items upon removal if(team() == Vars.state.rules.defaultTeam){ for(ItemStack stack : stacks){ - Vars.data.addItem(stack.item, stack.amount); + //TODO where do the items go? + //Vars.data.addItem(stack.item, stack.amount); Events.fire(new LaunchItemEvent(stack)); } } diff --git a/core/src/mindustry/world/blocks/campaign/ResearchBlock.java b/core/src/mindustry/world/blocks/campaign/ResearchBlock.java index 8f66048fc9..4ae6a39f00 100644 --- a/core/src/mindustry/world/blocks/campaign/ResearchBlock.java +++ b/core/src/mindustry/world/blocks/campaign/ResearchBlock.java @@ -1,15 +1,29 @@ package mindustry.world.blocks.campaign; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import arc.scene.style.*; import arc.scene.ui.layout.*; import arc.util.ArcAnnotate.*; +import arc.util.*; import arc.util.io.*; -import mindustry.*; +import mindustry.annotations.Annotations.*; +import mindustry.content.*; +import mindustry.content.TechTree.*; import mindustry.ctype.*; import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.type.*; +import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.consumers.*; + +import static mindustry.Vars.*; public class ResearchBlock extends Block{ public float researchSpeed = 1f; + public @Load("@-top") TextureRegion topRegion; public ResearchBlock(String name){ super(name); @@ -19,6 +33,11 @@ public class ResearchBlock extends Block{ hasPower = true; hasItems = true; configurable = true; + itemCapacity = 100; + + //TODO requirements shrink as time goes on + consumes.add(new ConsumeItemDynamic((ResearchBlockEntity entity) -> entity.researching != null ? entity.researching.requirements : ItemStack.empty)); + config(TechNode.class, ResearchBlockEntity::setTo); } @Override @@ -26,12 +45,106 @@ public class ResearchBlock extends Block{ return false; } + @Override + public void setBars(){ + super.setBars(); + + bars.add("progress", (ResearchBlockEntity e) -> new Bar("bar.progress", Pal.ammo, () -> e.researching == null ? 0f : e.researching.progress / e.researching.time)); + } + public class ResearchBlockEntity extends TileEntity{ - public @Nullable UnlockableContent researching; + public @Nullable TechNode researching; + + public double[] accumulator; + public double[] totalAccumulator; @Override public void updateTile(){ + if(researching != null){ + //don't research something that is already researched + if(researching.content.unlocked()){ + setTo(null); + }else{ + double totalTicks = researching.time * 60.0; + double amount = researchSpeed * edelta() / totalTicks; + double maxProgress = checkRequired(amount, false); + + for(int i = 0; i < researching.requirements.length; i++){ + int reqamount = Math.round(state.rules.buildCostMultiplier * researching.requirements[i].amount); + accumulator[i] += Math.min(reqamount * maxProgress, reqamount - totalAccumulator[i] + 0.00001); //add min amount progressed to the accumulator + totalAccumulator[i] = Math.min(totalAccumulator[i] + reqamount * maxProgress, reqamount); + } + + maxProgress = checkRequired(maxProgress, true); + + float increment = (float)(maxProgress * researching.time); + researching.progress += increment; + + //check if it has been researched + if(researching.progress >= researching.time){ + researching.content.unlock(); + + setTo(null); + } + } + } + } + + private double checkRequired(double amount, boolean remove){ + double maxProgress = amount; + + for(int i = 0; i < researching.requirements.length; i++){ + int ramount = researching.requirements[i].amount; + int required = (int)(accumulator[i]); //calculate items that are required now + + if(!items.has(researching.requirements[i].item) && ramount > 0){ + maxProgress = 0f; + }else if(required > 0){ //if this amount is positive... + //calculate how many items it can actually use + int maxUse = Math.min(required, items.get(researching.requirements[i].item)); + //get this as a fraction + double fraction = maxUse / (double)required; + + //move max progress down if this fraction is less than 1 + maxProgress = Math.min(maxProgress, maxProgress * fraction); + + accumulator[i] -= maxUse; + + //remove stuff that is actually used + if(remove){ + items.remove(researching.requirements[i].item, maxUse); + } + } + //else, no items are required yet, so just keep going + } + + return maxProgress; + } + + private void setTo(@Nullable TechNode value){ + researching = value; + if(value != null){ + accumulator = new double[researching.requirements.length]; + totalAccumulator = new double[researching.requirements.length]; + } + } + + @Override + public void display(Table table){ + super.display(table); + + TextureRegionDrawable reg = new TextureRegionDrawable(); + + table.row(); + table.table(t -> { + t.image().update(i -> { + i.setDrawable(researching == null ? Icon.cancel : reg.set(researching.content.icon(Cicon.medium))); + i.setScaling(Scaling.fit); + i.setColor(researching == null ? Color.lightGray : Color.white); + }).size(32).pad(3); + t.label(() -> researching == null ? "$none" : researching.content.localizedName).color(Color.lightGray); + }).left().padTop(4); } @Override @@ -39,10 +152,36 @@ public class ResearchBlock extends Block{ } + @Override + public void draw(){ + super.draw(); + + Draw.mixcol(Color.white, Mathf.absin(10f, 0.2f)); + Draw.rect(topRegion, x, y); + Draw.reset(); + } + + @Override + public boolean acceptItem(Tilec source, Item item){ + return items.get(item) < getMaximumAccepted(item); + } + + @Override + public int getMaximumAccepted(Item item){ + if(researching == null) return 0; + for(int i = 0; i < researching.requirements.length; i++){ + if(researching.requirements[i].item == item) return researching.requirements[i].amount; + } + return 0; + } + @Override public boolean configTapped(){ - //TODO select target - Vars.ui.tech.show(); + //configure with tech node + ui.tech.show(node -> { + configure(node); + ui.tech.hide(); + }); return false; } @@ -52,8 +191,8 @@ public class ResearchBlock extends Block{ super.write(write); if(researching != null){ - write.b(researching.getContentType().ordinal()); - write.s(researching.id); + write.b(researching.content.getContentType().ordinal()); + write.s(researching.content.id); }else{ write.b(-1); } @@ -65,7 +204,7 @@ public class ResearchBlock extends Block{ byte type = read.b(); if(type != -1){ - researching = Vars.content.getByID(ContentType.all[type], read.s()); + setTo(TechTree.get(content.getByID(ContentType.all[type], read.s()))); }else{ researching = null; } diff --git a/core/src/mindustry/world/blocks/defense/Door.java b/core/src/mindustry/world/blocks/defense/Door.java index 54e6aed17c..50624123e1 100644 --- a/core/src/mindustry/world/blocks/defense/Door.java +++ b/core/src/mindustry/world/blocks/defense/Door.java @@ -28,17 +28,16 @@ public class Door extends Wall{ solidifes = true; consumesTap = true; - config(Boolean.class, (entity, open) -> { - DoorEntity door = (DoorEntity)entity; - door.open = open; - pathfinder.updateTile(door.tile()); - (open ? closefx : openfx).at(door); - Sounds.door.at(door); + config(Boolean.class, (DoorEntity entity, Boolean open) -> { + entity.open = open; + pathfinder.updateTile(entity.tile()); + (open ? closefx : openfx).at(entity); + Sounds.door.at(entity); }); } @Override - public TextureRegion getRequestRegion(BuildRequest req, Eachable list){ + public TextureRegion getRequestRegion(BuildPlan req, Eachable list){ return req.config == Boolean.TRUE ? openRegion : region; } diff --git a/core/src/mindustry/world/blocks/defense/ForceProjector.java b/core/src/mindustry/world/blocks/defense/ForceProjector.java index 003d68e781..544f3d58c4 100644 --- a/core/src/mindustry/world/blocks/defense/ForceProjector.java +++ b/core/src/mindustry/world/blocks/defense/ForceProjector.java @@ -163,15 +163,17 @@ public class ForceProjector extends Block{ if(Core.settings.getBool("animatedshields")){ Fill.poly(x, y, 6, radius); - Draw.z(Layer.shields + 0.1f); + Draw.z(Layer.shields + 0.01f); - Draw.color(Color.white); - Draw.alpha(hit); - Fill.poly(x, y, 6, radius); - Draw.color(); + if(hit > 0){ + Draw.color(Color.white); + Draw.alpha(1f); + Fill.poly(x, y, 6, radius); + Draw.color(); + } }else{ Lines.stroke(1.5f); - Draw.alpha(0.09f + 0.08f * hit); + Draw.alpha(0.09f + Mathf.clamp(0.08f * hit)); Fill.poly(x, y, 6, radius); Draw.alpha(1f); Lines.poly(x, y, 6, radius); diff --git a/core/src/mindustry/world/blocks/defense/MendProjector.java b/core/src/mindustry/world/blocks/defense/MendProjector.java index d9c25dc27b..cd8d979a56 100644 --- a/core/src/mindustry/world/blocks/defense/MendProjector.java +++ b/core/src/mindustry/world/blocks/defense/MendProjector.java @@ -62,7 +62,7 @@ public class MendProjector extends Block{ @Override public void updateTile(){ - heat = Mathf.lerpDelta(heat, consValid() || tile.isEnemyCheat() ? 1f : 0f, 0.08f); + heat = Mathf.lerpDelta(heat, consValid() || cheating() ? 1f : 0f, 0.08f); charge += heat * delta(); phaseHeat = Mathf.lerpDelta(phaseHeat, Mathf.num(cons().optionalValid()), 0.1f); @@ -110,7 +110,7 @@ public class MendProjector extends Block{ @Override public void drawLight(){ - Drawf.light(x, y, 50f * efficiency(), baseColor, 0.7f * efficiency()); + Drawf.light(team, x, y, 50f * efficiency(), baseColor, 0.7f * efficiency()); } @Override diff --git a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java index a6f174eaf3..239c6ecaac 100644 --- a/core/src/mindustry/world/blocks/defense/OverdriveProjector.java +++ b/core/src/mindustry/world/blocks/defense/OverdriveProjector.java @@ -67,7 +67,7 @@ public class OverdriveProjector extends Block{ @Override public void drawLight(){ - Drawf.light(x, y, 50f * efficiency(), baseColor, 0.7f * efficiency()); + Drawf.light(team, x, y, 50f * efficiency(), baseColor, 0.7f * efficiency()); } @Override diff --git a/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java b/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java index 9998973ab6..cbb58d8420 100644 --- a/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java +++ b/core/src/mindustry/world/blocks/defense/PointDefenseTurret.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.defense; -import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -15,7 +14,7 @@ import mindustry.gen.*; import mindustry.graphics.*; import mindustry.world.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class PointDefenseTurret extends Block{ public final int timerTarget = timers++; @@ -48,8 +47,8 @@ public class PointDefenseTurret extends Block{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find("block-" + size), Core.atlas.find(name)}; + public TextureRegion[] icons(){ + return new TextureRegion[]{baseRegion, region}; } public class PointDefenseEntity extends TileEntity{ diff --git a/core/src/mindustry/world/blocks/defense/Wall.java b/core/src/mindustry/world/blocks/defense/Wall.java index 6c05e2ead9..1b46442793 100644 --- a/core/src/mindustry/world/blocks/defense/Wall.java +++ b/core/src/mindustry/world/blocks/defense/Wall.java @@ -33,7 +33,7 @@ public class Wall extends Block{ } @Override - public TextureRegion[] generateIcons(){ + public TextureRegion[] icons(){ return new TextureRegion[]{Core.atlas.find(Core.atlas.has(name) ? name : name + "1")}; } diff --git a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java index 4cb155fc99..4ffdcb4904 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -42,7 +42,7 @@ public class ItemTurret extends Turret{ @Override public void build(Tilec tile, Table table){ MultiReqImage image = new MultiReqImage(); - content.items().each(i -> filter.get(i) && (!state.isCampaign() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium)), + content.items().each(i -> filter.get(i) && i.unlockedNow(), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium)), () -> tile != null && !((ItemTurretEntity)tile).ammo.isEmpty() && ((ItemEntry)((ItemTurretEntity)tile).ammo.peek()).item == item))); table.add(image).size(8 * 4); @@ -67,7 +67,7 @@ public class ItemTurret extends Turret{ super.onProximityAdded(); //add first ammo item to cheaty blocks so they can shoot properly - if(tile.isEnemyCheat() && ammo.size > 0){ + if(cheating() && ammo.size > 0){ handleItem(this, ammoTypes.entries().next().key); } } diff --git a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java index 9cb5992bdb..54278241a0 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LaserTurret.java @@ -68,7 +68,7 @@ public class LaserTurret extends PowerTurret{ Liquid liquid = liquids().current(); float maxUsed = consumes.get(ConsumeType.liquid).amount; - float used = (tile.isEnemyCheat() ? maxUsed * Time.delta() : Math.min(liquids.get(liquid), maxUsed * Time.delta())) * liquid.heatCapacity * coolantMultiplier; + float used = (cheating() ? maxUsed * Time.delta() : Math.min(liquids.get(liquid), maxUsed * Time.delta())) * liquid.heatCapacity * coolantMultiplier; reload -= used; liquids.remove(liquid, used); @@ -85,7 +85,7 @@ public class LaserTurret extends PowerTurret{ return; } - if(reload <= 0 && (consValid() || tile.isEnemyCheat())){ + if(reload <= 0 && (consValid() || cheating())){ BulletType type = peekAmmo(); shoot(type); diff --git a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java index 12b7b08139..b65325ec65 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/LiquidTurret.java @@ -101,7 +101,7 @@ public class LiquidTurret extends Turret{ @Override public BulletType useAmmo(){ - if(tile.isEnemyCheat()) return ammoTypes.get(liquids.current()); + if(cheating()) return ammoTypes.get(liquids.current()); BulletType type = ammoTypes.get(liquids.current()); liquids.remove(liquids.current(), type.ammoMultiplier); return type; diff --git a/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java b/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java index 7abbfe9924..fd62367feb 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/PowerTurret.java @@ -47,7 +47,7 @@ public class PowerTurret extends Turret{ @Override protected float baseReloadSpeed(){ - return tile.isEnemyCheat() ? 1f : power.status; + return cheating() ? 1f : power.status; } } } diff --git a/core/src/mindustry/world/blocks/defense/turrets/Turret.java b/core/src/mindustry/world/blocks/defense/turrets/Turret.java index e7ac459f39..1376ea9f5a 100644 --- a/core/src/mindustry/world/blocks/defense/turrets/Turret.java +++ b/core/src/mindustry/world/blocks/defense/turrets/Turret.java @@ -123,8 +123,8 @@ public abstract class Turret extends Block{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find("block-" + size), Core.atlas.find(name)}; + public TextureRegion[] icons(){ + return new TextureRegion[]{baseRegion, region}; } @Override @@ -139,7 +139,7 @@ public abstract class Turret extends Block{ } public class TurretEntity extends TileEntity implements ControlBlock{ - public Array ammo = new Array<>(); + public Seq ammo = new Seq<>(); public int totalAmmo; public float reload, rotation = 90, recoil, heat; public int shotCounter; @@ -281,7 +281,7 @@ public abstract class Turret extends Block{ /** Consume ammo and return a type. */ public BulletType useAmmo(){ - if(tile.isEnemyCheat()) return peekAmmo(); + if(cheating()) return peekAmmo(); AmmoEntry entry = ammo.peek(); entry.amount -= ammoPerShot; diff --git a/core/src/mindustry/world/blocks/distribution/Conveyor.java b/core/src/mindustry/world/blocks/distribution/Conveyor.java index a2dae61ea5..40c39f8617 100644 --- a/core/src/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/mindustry/world/blocks/distribution/Conveyor.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.distribution; -import arc.*; import arc.func.*; import arc.graphics.g2d.*; import arc.math.*; @@ -57,7 +56,7 @@ public class Conveyor extends Block implements Autotiler{ } @Override - public void drawRequestRegion(BuildRequest req, Eachable list){ + public void drawRequestRegion(BuildPlan req, Eachable list){ int[] bits = getTiling(req, list); if(bits == null) return; @@ -68,12 +67,13 @@ public class Conveyor extends Block implements Autotiler{ @Override public boolean blends(Tile tile, int rotation, int otherx, int othery, int otherrot, Block otherblock){ - return otherblock.outputsItems() && lookingAt(tile, rotation, otherx, othery, otherrot, otherblock); + return (otherblock.outputsItems() || lookingAt(tile, rotation, otherx, othery, otherblock)) + && lookingAtEither(tile, rotation, otherx, othery, otherrot, otherblock); } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name + "-0-0")}; + public TextureRegion[] icons(){ + return new TextureRegion[]{regions[0][0]}; } @Override @@ -82,7 +82,7 @@ public class Conveyor extends Block implements Autotiler{ } @Override - public Block getReplacement(BuildRequest req, Array requests){ + public Block getReplacement(BuildPlan req, Seq requests){ Boolf cont = p -> requests.contains(o -> o.x == req.x + p.x && o.y == req.y + p.y && o.rotation == req.rotation && (req.block instanceof Conveyor || req.block instanceof Junction)); return cont.get(Geometry.d4(req.rotation)) && cont.get(Geometry.d4(req.rotation - 2)) && @@ -337,7 +337,7 @@ public class Conveyor extends Block implements Autotiler{ for(int i = 0; i < amount; i++){ int val = read.i(); - byte id = (byte)(val >> 24); + short id = (short)(((byte)(val >> 24)) & 0xff); float x = (float)((byte)(val >> 16)) / 127f; float y = ((float)((byte)(val >> 8)) + 128f) / 255f; if(i < capacity){ diff --git a/core/src/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/mindustry/world/blocks/distribution/ItemBridge.java index eab96ee848..1e8f7087ed 100644 --- a/core/src/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/mindustry/world/blocks/distribution/ItemBridge.java @@ -20,7 +20,7 @@ import mindustry.world.meta.*; import static mindustry.Vars.*; public class ItemBridge extends Block{ - private static BuildRequest otherReq; + private static BuildPlan otherReq; public final int timerTransport = timers++; public int range; @@ -44,13 +44,13 @@ public class ItemBridge extends Block{ canOverdrive = false; //point2 config is relative - config(Point2.class, (tile, i) -> ((ItemBridgeEntity)tile).link = Point2.pack(i.x + tile.tileX(), i.y + tile.tileY())); + config(Point2.class, (ItemBridgeEntity tile, Point2 i) -> tile.link = Point2.pack(i.x + tile.tileX(), i.y + tile.tileY())); //integer is not - config(Integer.class, (tile, i) -> ((ItemBridgeEntity)tile).link = i); + config(Integer.class, (ItemBridgeEntity tile, Integer i) -> tile.link = i); } @Override - public void drawRequestConfigTop(BuildRequest req, Eachable list){ + public void drawRequestConfigTop(BuildPlan req, Eachable list){ otherReq = null; list.each(other -> { if(other.block == this && req != other && req.config instanceof Point2 && ((Point2)req.config).equals(other.x - req.x, other.y - req.y)){ @@ -112,7 +112,7 @@ public class ItemBridge extends Block{ return false; } - return other.block() == this && (other.team() == tile.team() || tile.block() != this) && (!checkDouble || other.ent().link != tile.pos()); + return (other.block() == tile.block() || (!(tile.block() instanceof ItemBridge) && other.block() == this)) && (other.team() == tile.team() || tile.block() != this) && (!checkDouble || other.ent().link != tile.pos()); } public Tile findLink(int x, int y){ @@ -140,6 +140,51 @@ public class ItemBridge extends Block{ lastPlaced = tile.pos(); } + @Override + public void drawSelect(){ + if(linkValid(tile, world.tile(link))){ + drawInput(world.tile(link)); + }else{ + incoming.each(pos -> drawInput(world.tile(pos))); + } + + Draw.reset(); + } + + private void drawInput(Tile other){ + if(!linkValid(tile, other, false)) return; + boolean linked = other.pos() == link; + if(!linked && !(other.ent().link == tile.pos())) return; + + Tmp.v2.trns(tile.angleTo(other), 2f); + float tx = tile.drawx(), ty = tile.drawy(); + float ox = other.drawx(), oy = other.drawy(); + float alpha = Math.abs((linked ? 100 : 0)-(Time.time() * 2f) % 100f) / 100f; + float x = Mathf.lerp(ox, tx, alpha); + float y = Mathf.lerp(oy, ty, alpha); + + Tile otherLink = linked ? other : tile; + int rel = (linked ? tile : other).absoluteRelativeTo(otherLink.x, otherLink.y); + + //draw "background" + Draw.color(Pal.gray); + Lines.stroke(2.5f); + Lines.square(ox, oy, 2f, 45f); + Lines.stroke(2.5f); + Lines.line(tx + Tmp.v2.x, ty + Tmp.v2.y, ox - Tmp.v2.x, oy - Tmp.v2.y); + + //draw foreground colors + Draw.color(linked ? Pal.place : Pal.accent); + Lines.stroke(1f); + Lines.line(tx + Tmp.v2.x, ty + Tmp.v2.y, ox - Tmp.v2.x, oy - Tmp.v2.y); + + Lines.square(ox, oy, 2f, 45f); + Draw.mixcol(Draw.getColor(), 1f); + Draw.color(); + Draw.rect(arrowRegion, x, y, rel * 90); + Draw.mixcol(); + } + @Override public void drawConfigure(){ Drawf.select(x, y, tile.block().size * tilesize / 2f + 2f, Pal.accent); @@ -280,35 +325,15 @@ public class ItemBridge extends Block{ if(rel == rel2) return false; }else{ - return source.block() instanceof ItemBridge && ((ItemBridgeEntity)source).link == tile.pos() && items.total() < itemCapacity; + return source.block() instanceof ItemBridge && linkValid(source.tile(), tile) && items.total() < itemCapacity; } return items.total() < itemCapacity; } - @Override public boolean canDumpLiquid(Tilec to, Liquid liquid){ - Tile other = world.tile(link); - if(!linkValid(tile, other)){ - Tile edge = Edges.getFacingEdge(to.tile(), tile); - int i = relativeTo(edge.x, edge.y); - - IntSetIterator it = incoming.iterator(); - - while(it.hasNext){ - int v = it.next(); - if(relativeTo(Point2.x(v), Point2.y(v)) == i){ - return false; - } - } - return true; - } - - int rel = relativeTo(other.x, other.y); - int rel2 = relativeTo(to.tileX(), to.tileY()); - - return rel != rel2; + return checkDump(to); } @Override @@ -322,7 +347,7 @@ public class ItemBridge extends Block{ int rel2 = relativeTo(Edges.getFacingEdge(source, this)); if(rel == rel2) return false; - }else if(!(source.block() instanceof ItemBridge && ((ItemBridgeEntity)source).link == tile.pos())){ + }else if(!(source.block() instanceof ItemBridge && linkValid(source.tile(), tile))){ return false; } @@ -331,6 +356,10 @@ public class ItemBridge extends Block{ @Override public boolean canDump(Tilec to, Item item){ + return checkDump(to); + } + + protected boolean checkDump(Tilec to){ Tile other = world.tile(link); if(!linkValid(tile, other)){ Tile edge = Edges.getFacingEdge(to.tile(), tile); diff --git a/core/src/mindustry/world/blocks/distribution/MassDriver.java b/core/src/mindustry/world/blocks/distribution/MassDriver.java index b39bfeda18..3a008a0a75 100644 --- a/core/src/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/mindustry/world/blocks/distribution/MassDriver.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.distribution; -import arc.*; import arc.graphics.g2d.*; import arc.math.*; import arc.math.geom.*; @@ -43,13 +42,13 @@ public class MassDriver extends Block{ hasPower = true; outlineIcon = true; //point2 is relative - config(Point2.class, (tile, point) -> ((MassDriverEntity)tile).link = Point2.pack(point.x + tile.tileX(), point.y + tile.tileY())); - config(Integer.class, (tile, point) -> ((MassDriverEntity)tile).link = point); + config(Point2.class, (MassDriverEntity tile, Point2 point) -> tile.link = Point2.pack(point.x + tile.tileX(), point.y + tile.tileY())); + config(Integer.class, (MassDriverEntity tile, Integer point) -> tile.link = point); } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name + "-base"), Core.atlas.find(name)}; + public TextureRegion[] icons(){ + return new TextureRegion[]{baseRegion, region}; } @Override diff --git a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java index a090f0e286..d3035e9997 100644 --- a/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/PayloadConveyor.java @@ -32,7 +32,7 @@ public class PayloadConveyor extends Block{ } @Override - protected TextureRegion[] generateIcons(){ + protected TextureRegion[] icons(){ return new TextureRegion[]{Core.atlas.find(name + "-icon")}; } @@ -68,8 +68,16 @@ public class PayloadConveyor extends Block{ Tilec accept = nearby(Geometry.d4(rotation()).x * size, Geometry.d4(rotation()).y * size); //next block must be aligned and of the same size - if(accept != null && accept.block().size == size && - tileX() + Geometry.d4(rotation()).x * size == accept.tileX() && tileY() + Geometry.d4(rotation()).y * size == accept.tileY()){ + 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()) || + + //differing sizes + (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 + )))){ next = accept; }else{ next = null; diff --git a/core/src/mindustry/world/blocks/distribution/PayloadRouter.java b/core/src/mindustry/world/blocks/distribution/PayloadRouter.java index e0a721024e..2fea02a283 100644 --- a/core/src/mindustry/world/blocks/distribution/PayloadRouter.java +++ b/core/src/mindustry/world/blocks/distribution/PayloadRouter.java @@ -18,7 +18,7 @@ public class PayloadRouter extends PayloadConveyor{ } @Override - public void drawRequestRegion(BuildRequest req, Eachable list){ + public void drawRequestRegion(BuildPlan req, Eachable list){ super.drawRequestRegion(req, list); Draw.rect(overRegion, req.drawx(), req.drawy()); diff --git a/core/src/mindustry/world/blocks/distribution/Sorter.java b/core/src/mindustry/world/blocks/distribution/Sorter.java index fba4125554..9b2529856c 100644 --- a/core/src/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/mindustry/world/blocks/distribution/Sorter.java @@ -28,12 +28,12 @@ public class Sorter extends Block{ unloadable = false; saveConfig = true; - config(Item.class, (tile, item) -> ((SorterEntity)tile).sortItem = item); - configClear(tile -> ((SorterEntity)tile).sortItem = null); + config(Item.class, (SorterEntity tile, Item item) -> tile.sortItem = item); + configClear((SorterEntity tile) -> tile.sortItem = null); } @Override - public void drawRequestConfig(BuildRequest req, Eachable list){ + public void drawRequestConfig(BuildPlan req, Eachable list){ drawRequestConfigCenter(req, req.config, "center"); } diff --git a/core/src/mindustry/world/blocks/distribution/StackConveyor.java b/core/src/mindustry/world/blocks/distribution/StackConveyor.java index b81b5b2248..1b70f40a0a 100644 --- a/core/src/mindustry/world/blocks/distribution/StackConveyor.java +++ b/core/src/mindustry/world/blocks/distribution/StackConveyor.java @@ -55,7 +55,7 @@ public class StackConveyor extends Block implements Autotiler{ if(tile.entity instanceof StackConveyorEntity){ int state = ((StackConveyorEntity)tile.entity).state; if(state == stateLoad){ //standard conveyor mode - return otherblock.outputsItems() && lookingAt(tile, rotation, otherx, othery, otherrot, otherblock); + return otherblock.outputsItems() && lookingAtEither(tile, rotation, otherx, othery, otherrot, otherblock); }else if(state == stateUnload){ //router mode return (otherblock.hasItems || otherblock.outputsItems() || otherblock.acceptsItems) && (notLookingAt(tile, rotation, otherx, othery, otherrot, otherblock) || @@ -67,7 +67,7 @@ public class StackConveyor extends Block implements Autotiler{ } @Override - public void drawRequestRegion(BuildRequest req, Eachable list){ + public void drawRequestRegion(BuildPlan req, Eachable list){ int[] bits = getTiling(req, list); if(bits == null) return; diff --git a/core/src/mindustry/world/blocks/environment/Floor.java b/core/src/mindustry/world/blocks/environment/Floor.java index d3b3929975..bd858602fc 100644 --- a/core/src/mindustry/world/blocks/environment/Floor.java +++ b/core/src/mindustry/world/blocks/environment/Floor.java @@ -64,7 +64,7 @@ public class Floor extends Block{ public Block decoration = Blocks.air; protected TextureRegion[][] edges; - protected Array blenders = new Array<>(); + protected Seq blenders = new Seq<>(); protected IntSet blended = new IntSet(); protected TextureRegion edgeRegion; @@ -132,7 +132,7 @@ public class Floor extends Block{ Color color = new Color(); Color color2 = new Color(); - PixmapRegion image = Core.atlas.getPixmap((AtlasRegion)generateIcons()[0]); + PixmapRegion image = Core.atlas.getPixmap((AtlasRegion)icons()[0]); PixmapRegion edge = Core.atlas.getPixmap("edge-stencil"); Pixmap result = new Pixmap(edge.width, edge.height); @@ -146,11 +146,6 @@ public class Floor extends Block{ packer.add(PageType.environment, name + "-edge", result); } - @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(Core.atlas.has(name) ? name : name + "1")}; - } - @Override public void drawBase(Tile tile){ Mathf.random.setSeed(tile.pos()); @@ -165,6 +160,11 @@ public class Floor extends Block{ } } + @Override + public TextureRegion[] icons(){ + return new TextureRegion[]{Core.atlas.find(Core.atlas.has(name) ? name : name + "1")}; + } + public boolean isDeep(){ return drownTime > 0; } diff --git a/core/src/mindustry/world/blocks/environment/Rock.java b/core/src/mindustry/world/blocks/environment/Rock.java index d6f1457a99..1c3abc1a15 100644 --- a/core/src/mindustry/world/blocks/environment/Rock.java +++ b/core/src/mindustry/world/blocks/environment/Rock.java @@ -26,8 +26,8 @@ public class Rock extends Block{ } @Override - public TextureRegion[] generateIcons(){ - return variants == 0 ? super.generateIcons() : new TextureRegion[]{Core.atlas.find(name + "1")}; + public TextureRegion[] icons(){ + return variants == 0 ? super.icons() : new TextureRegion[]{Core.atlas.find(name + "1")}; } @Override diff --git a/core/src/mindustry/world/blocks/experimental/BlockForge.java b/core/src/mindustry/world/blocks/experimental/BlockForge.java index 22e415e609..20036d943f 100644 --- a/core/src/mindustry/world/blocks/experimental/BlockForge.java +++ b/core/src/mindustry/world/blocks/experimental/BlockForge.java @@ -8,7 +8,6 @@ import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.io.*; import mindustry.*; -import mindustry.annotations.Annotations.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -22,7 +21,6 @@ import mindustry.world.consumers.*; public class BlockForge extends PayloadAcceptor{ public float buildSpeed = 0.4f; - public @Load(value = "@-out", fallback = "factory-out") TextureRegion outRegion; public BlockForge(String name){ super(name); @@ -35,17 +33,9 @@ public class BlockForge extends PayloadAcceptor{ hasPower = true; rotate = true; - config(Block.class, (tile, block) -> ((BlockForgeEntity)tile).recipe = block); + config(Block.class, (BlockForgeEntity tile, Block block) -> tile.recipe = block); - consumes.add(new ConsumeItemDynamic(e -> { - BlockForgeEntity entity = (BlockForgeEntity)e; - - if(entity.recipe != null){ - return entity.recipe.requirements; - } - - return ItemStack.empty; - })); + consumes.add(new ConsumeItemDynamic((BlockForgeEntity e) -> e.recipe != null ? e.recipe.requirements : ItemStack.empty)); } @Override @@ -56,7 +46,7 @@ public class BlockForge extends PayloadAcceptor{ } @Override - public void drawRequestRegion(BuildRequest req, Eachable list){ + public void drawRequestRegion(BuildPlan req, Eachable list){ Draw.rect(region, req.drawx(), req.drawy()); Draw.rect(outRegion, req.drawx(), req.drawy(), req.rotation * 90); } @@ -108,7 +98,7 @@ public class BlockForge extends PayloadAcceptor{ @Override public void buildConfiguration(Table table){ - Array blocks = Vars.content.blocks().select(b -> b.isVisible() && b.size <= 2); + Seq blocks = Vars.content.blocks().select(b -> b.isVisible() && b.size <= 2); ItemSelection.buildTable(table, blocks, () -> recipe, block -> recipe = block); } diff --git a/core/src/mindustry/world/blocks/experimental/BlockLoader.java b/core/src/mindustry/world/blocks/experimental/BlockLoader.java index ad005673d7..ee152813b9 100644 --- a/core/src/mindustry/world/blocks/experimental/BlockLoader.java +++ b/core/src/mindustry/world/blocks/experimental/BlockLoader.java @@ -2,7 +2,6 @@ package mindustry.world.blocks.experimental; import arc.graphics.g2d.*; import arc.util.*; -import mindustry.annotations.Annotations.*; import mindustry.entities.units.*; import mindustry.gen.*; import mindustry.graphics.*; @@ -20,10 +19,6 @@ public class BlockLoader extends PayloadAcceptor{ public int itemsLoaded = 5; public float liquidsLoaded = 5f; - public @Load(value = "@-top", fallback = "factory-top") TextureRegion topRegion; - public @Load(value = "@-out", fallback = "factory-out") TextureRegion outRegion; - public @Load(value = "@-in", fallback = "factory-in") TextureRegion inRegion; - public BlockLoader(String name){ super(name); @@ -49,7 +44,7 @@ public class BlockLoader extends PayloadAcceptor{ } @Override - public void drawRequestRegion(BuildRequest req, Eachable list){ + public void drawRequestRegion(BuildPlan req, Eachable list){ Draw.rect(region, req.drawx(), req.drawy()); Draw.rect(outRegion, req.drawx(), req.drawy(), req.rotation * 90); Draw.rect(topRegion, req.drawx(), req.drawy()); @@ -76,7 +71,7 @@ public class BlockLoader extends PayloadAcceptor{ //draw input for(int i = 0; i < 4; i++){ - if(blends(this, i) && i != rotation()){ + if(blends(i) && i != rotation()){ Draw.rect(inRegion, x, y, i * 90); } } diff --git a/core/src/mindustry/world/blocks/experimental/ProcessorBlock.java b/core/src/mindustry/world/blocks/experimental/ProcessorBlock.java index 97ffad9c34..9fa481beba 100644 --- a/core/src/mindustry/world/blocks/experimental/ProcessorBlock.java +++ b/core/src/mindustry/world/blocks/experimental/ProcessorBlock.java @@ -14,7 +14,7 @@ public class ProcessorBlock extends Block{ public class ProcessorEntity extends TileEntity{ //all tiles in the block network - does not include itself - Array network = new Array<>(); + Seq network = new Seq<>(); @Override public boolean onConfigureTileTapped(Tilec other){ diff --git a/core/src/mindustry/world/blocks/liquid/Conduit.java b/core/src/mindustry/world/blocks/liquid/Conduit.java index 30c28e7a06..9150dafed3 100644 --- a/core/src/mindustry/world/blocks/liquid/Conduit.java +++ b/core/src/mindustry/world/blocks/liquid/Conduit.java @@ -17,7 +17,7 @@ import mindustry.type.*; import mindustry.world.*; import mindustry.world.blocks.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class Conduit extends LiquidBlock implements Autotiler{ public final int timerFlow = timers++; @@ -38,7 +38,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ } @Override - public void drawRequestRegion(BuildRequest req, Eachable list){ + public void drawRequestRegion(BuildPlan req, Eachable list){ int[] bits = getTiling(req, list); if(bits == null) return; @@ -53,7 +53,7 @@ public class Conduit extends LiquidBlock implements Autotiler{ } @Override - public Block getReplacement(BuildRequest req, Array requests){ + public Block getReplacement(BuildPlan req, Seq requests){ Boolf cont = p -> requests.contains(o -> o.x == req.x + p.x && o.y == req.y + p.y && o.rotation == req.rotation && (req.block instanceof Conduit || req.block instanceof LiquidJunction)); return cont.get(Geometry.d4(req.rotation)) && cont.get(Geometry.d4(req.rotation - 2)) && @@ -64,12 +64,12 @@ 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 && lookingAt(tile, rotation, otherx, othery, otherrot, otherblock); + return otherblock.hasLiquids && otherblock.outputsLiquid && lookingAtEither(tile, rotation, otherx, othery, otherrot, otherblock); } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find("conduit-bottom"), Core.atlas.find(name + "-top-0")}; + public TextureRegion[] icons(){ + return new TextureRegion[]{Core.atlas.find("conduit-bottom"), topRegions[0]}; } public class ConduitEntity extends LiquidBlockEntity{ diff --git a/core/src/mindustry/world/blocks/liquid/LiquidBlock.java b/core/src/mindustry/world/blocks/liquid/LiquidBlock.java index 5820c4ac1b..5aca8a9f31 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidBlock.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidBlock.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.liquid; -import arc.*; import arc.graphics.g2d.*; import mindustry.annotations.Annotations.*; import mindustry.gen.*; @@ -22,8 +21,8 @@ public class LiquidBlock extends Block{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name + "-top")}; + public TextureRegion[] icons(){ + return new TextureRegion[]{bottomRegion, topRegion}; } public class LiquidBlockEntity extends TileEntity{ diff --git a/core/src/mindustry/world/blocks/liquid/LiquidJunction.java b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java index 1a85be6af8..5902a5a834 100644 --- a/core/src/mindustry/world/blocks/liquid/LiquidJunction.java +++ b/core/src/mindustry/world/blocks/liquid/LiquidJunction.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.liquid; -import arc.*; import arc.graphics.g2d.*; import mindustry.gen.*; import mindustry.type.*; @@ -25,8 +24,8 @@ public class LiquidJunction extends LiquidBlock{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name)}; + public TextureRegion[] icons(){ + return new TextureRegion[]{region}; } public class LiquidJunctionEntity extends TileEntity{ diff --git a/core/src/mindustry/world/blocks/power/BurnerGenerator.java b/core/src/mindustry/world/blocks/power/BurnerGenerator.java index fee2d5135a..b9f270fcdf 100644 --- a/core/src/mindustry/world/blocks/power/BurnerGenerator.java +++ b/core/src/mindustry/world/blocks/power/BurnerGenerator.java @@ -1,9 +1,13 @@ package mindustry.world.blocks.power; -import mindustry.type.Item; -import mindustry.type.Liquid; +import arc.graphics.g2d.*; +import mindustry.annotations.Annotations.*; +import mindustry.type.*; public class BurnerGenerator extends ItemLiquidGenerator{ + public @Load(value = "@-turbine#", length = 2) TextureRegion[] turbineRegions; + public @Load("@-cap") TextureRegion capRegion; + public float turbineSpeed = 2f; public BurnerGenerator(String name){ super(true, false, name); @@ -18,4 +22,24 @@ public class BurnerGenerator extends ItemLiquidGenerator{ protected float getItemEfficiency(Item item){ return item.flammability; } + + @Override + public TextureRegion[] icons(){ + return turbineRegions[0].found() ? new TextureRegion[]{region, turbineRegions[0], turbineRegions[1], capRegion} : super.icons(); + } + + public class BurnerGeneratorEntity extends ItemLiquidGeneratorEntity{ + + @Override + public void draw(){ + super.draw(); + + if(turbineRegions[0].found()){ + Draw.rect(turbineRegions[0], x, y, totalTime * turbineSpeed); + Draw.rect(turbineRegions[1], x, y, -totalTime * turbineSpeed); + + Draw.rect(capRegion, x, y); + } + } + } } diff --git a/core/src/mindustry/world/blocks/power/ImpactReactor.java b/core/src/mindustry/world/blocks/power/ImpactReactor.java index 38bffe2135..545e07dca0 100644 --- a/core/src/mindustry/world/blocks/power/ImpactReactor.java +++ b/core/src/mindustry/world/blocks/power/ImpactReactor.java @@ -43,11 +43,11 @@ public class ImpactReactor extends PowerGenerator{ public void setBars(){ super.setBars(); - bars.add("poweroutput", entity -> new Bar(() -> + bars.add("poweroutput", (GeneratorEntity entity) -> new Bar(() -> Core.bundle.format("bar.poweroutput", Strings.fixed(Math.max(entity.getPowerProduction() - consumes.getPower().usage, 0) * 60 * entity.timeScale(), 1)), () -> Pal.powerBar, - () -> ((GeneratorEntity)entity).productionEfficiency)); + () -> entity.productionEfficiency)); } @Override @@ -60,8 +60,8 @@ public class ImpactReactor extends PowerGenerator{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name + "-bottom"), Core.atlas.find(name)}; + public TextureRegion[] icons(){ + return new TextureRegion[]{bottomRegion, region}; } public class FusionReactorEntity extends GeneratorEntity{ @@ -115,8 +115,7 @@ public class ImpactReactor extends PowerGenerator{ @Override public void drawLight(){ - float fract = tile.ent().warmup; - Drawf.light(x, y, (110f + Mathf.absin(5, 5f)) * fract, Tmp.c1.set(plasma2).lerp(plasma1, Mathf.absin(7f, 0.2f)), 0.8f * fract); + Drawf.light(team, x, y, (110f + Mathf.absin(5, 5f)) * warmup, Tmp.c1.set(plasma2).lerp(plasma1, Mathf.absin(7f, 0.2f)), 0.8f * warmup); } @Override diff --git a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java index 641245b8ac..4b4d99aac7 100644 --- a/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java +++ b/core/src/mindustry/world/blocks/power/ItemLiquidGenerator.java @@ -45,7 +45,6 @@ public class ItemLiquidGenerator extends PowerGenerator{ public ItemLiquidGenerator(String name){ super(name); - this.entityType = ItemLiquidGeneratorEntity::new; } protected void setDefaults(){ @@ -86,8 +85,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ } public class ItemLiquidGeneratorEntity extends GeneratorEntity{ - public float explosiveness; - public float heat; + public float explosiveness, heat, totalTime; @Override public boolean productionValid(){ @@ -100,6 +98,8 @@ public class ItemLiquidGenerator extends PowerGenerator{ //Power amount is delta'd by PowerGraph class already. float calculationDelta = delta(); + heat = Mathf.lerpDelta(heat, generateTime >= 0.001f ? 1f : 0f, 0.05f); + if(!consValid()){ productionEfficiency = 0.0f; return; @@ -113,7 +113,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ } } - heat = Mathf.lerpDelta(heat, generateTime >= 0.001f ? 1f : 0f, 0.05f); + totalTime += heat; //liquid takes priority over solids if(hasLiquids && liquid != null && liquids.get(liquid) >= 0.001f){ @@ -174,7 +174,7 @@ public class ItemLiquidGenerator extends PowerGenerator{ @Override public void drawLight(){ - Drawf.light(x, y, (60f + Mathf.absin(10f, 5f)) * productionEfficiency * size, Color.orange, 0.5f); + Drawf.light(team, x, y, (60f + Mathf.absin(10f, 5f)) * size, Color.orange, 0.5f * heat); } } } diff --git a/core/src/mindustry/world/blocks/power/LightBlock.java b/core/src/mindustry/world/blocks/power/LightBlock.java index 0415b04a77..7d89bdcdf7 100644 --- a/core/src/mindustry/world/blocks/power/LightBlock.java +++ b/core/src/mindustry/world/blocks/power/LightBlock.java @@ -24,7 +24,7 @@ public class LightBlock extends Block{ configurable = true; saveConfig = true; - config(Integer.class, (tile, value) -> ((LightEntity)tile).color = value); + config(Integer.class, (LightEntity tile, Integer value) -> tile.color = value); } public class LightEntity extends TileEntity{ @@ -50,7 +50,7 @@ public class LightBlock extends Block{ @Override public void drawLight(){ - Drawf.light(x, y, radius, Tmp.c1.set(color), brightness * efficiency()); + Drawf.light(team, x, y, radius, Tmp.c1.set(color), brightness * efficiency()); } @Override diff --git a/core/src/mindustry/world/blocks/power/NuclearReactor.java b/core/src/mindustry/world/blocks/power/NuclearReactor.java index ec2e8b6461..51db86567f 100644 --- a/core/src/mindustry/world/blocks/power/NuclearReactor.java +++ b/core/src/mindustry/world/blocks/power/NuclearReactor.java @@ -60,7 +60,7 @@ public class NuclearReactor extends PowerGenerator{ @Override public void setBars(){ super.setBars(); - bars.add("heat", entity -> new Bar("bar.heat", Pal.lightOrange, () -> ((NuclearReactorEntity)entity).heat)); + bars.add("heat", (NuclearReactorEntity entity) -> new Bar("bar.heat", Pal.lightOrange, () -> entity.heat)); } public class NuclearReactorEntity extends GeneratorEntity{ @@ -143,7 +143,7 @@ public class NuclearReactor extends PowerGenerator{ @Override public void drawLight(){ float fract = productionEfficiency; - Drawf.light(x, y, (90f + Mathf.absin(5, 5f)) * fract, Tmp.c1.set(lightColor).lerp(Color.scarlet, heat), 0.6f * fract); + Drawf.light(team, x, y, (90f + Mathf.absin(5, 5f)) * fract, Tmp.c1.set(lightColor).lerp(Color.scarlet, heat), 0.6f * fract); } @Override diff --git a/core/src/mindustry/world/blocks/power/PowerDiode.java b/core/src/mindustry/world/blocks/power/PowerDiode.java index 53bed896ee..75f74814b8 100644 --- a/core/src/mindustry/world/blocks/power/PowerDiode.java +++ b/core/src/mindustry/world/blocks/power/PowerDiode.java @@ -32,7 +32,7 @@ public class PowerDiode extends Block{ } @Override - public void drawRequestRegion(BuildRequest req, Eachable list){ + public void drawRequestRegion(BuildPlan req, Eachable list){ Draw.rect(icon(Cicon.full), req.drawx(), req.drawy()); Draw.rect(arrow, req.drawx(), req.drawy(), !rotate ? 0 : req.rotation * 90); } diff --git a/core/src/mindustry/world/blocks/power/PowerGenerator.java b/core/src/mindustry/world/blocks/power/PowerGenerator.java index cb8e4c6009..804b359f43 100644 --- a/core/src/mindustry/world/blocks/power/PowerGenerator.java +++ b/core/src/mindustry/world/blocks/power/PowerGenerator.java @@ -32,11 +32,11 @@ public class PowerGenerator extends PowerDistributor{ super.setBars(); if(hasPower && outputsPower && !consumes.hasPower()){ - bars.add("power", entity -> new Bar(() -> + bars.add("power", (GeneratorEntity entity) -> new Bar(() -> Core.bundle.format("bar.poweroutput", Strings.fixed(entity.getPowerProduction() * 60 * entity.timeScale(), 1)), () -> Pal.powerBar, - () -> ((GeneratorEntity)entity).productionEfficiency)); + () -> entity.productionEfficiency)); } } diff --git a/core/src/mindustry/world/blocks/power/PowerGraph.java b/core/src/mindustry/world/blocks/power/PowerGraph.java index da360d9343..9078e56685 100644 --- a/core/src/mindustry/world/blocks/power/PowerGraph.java +++ b/core/src/mindustry/world/blocks/power/PowerGraph.java @@ -9,8 +9,8 @@ import mindustry.world.consumers.*; public class PowerGraph{ private final static Queue queue = new Queue<>(); - private final static Array outArray1 = new Array<>(); - private final static Array outArray2 = new Array<>(); + private final static Seq outArray1 = new Seq<>(); + private final static Seq outArray2 = new Seq<>(); private final static IntSet closedSet = new IntSet(); private final ObjectSet producers = new ObjectSet<>(); @@ -178,7 +178,7 @@ public class PowerGraph{ public void update(){ if(Core.graphics.getFrameId() == lastFrameUpdated){ return; - }else if(!consumers.isEmpty() && consumers.first().tile().isEnemyCheat()){ + }else if(!consumers.isEmpty() && consumers.first().cheating()){ //when cheating, just set status to 1 for(Tilec tile : consumers){ tile.power().status = 1f; diff --git a/core/src/mindustry/world/blocks/power/PowerNode.java b/core/src/mindustry/world/blocks/power/PowerNode.java index 88b670fdb5..911827f247 100644 --- a/core/src/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/mindustry/world/blocks/power/PowerNode.java @@ -11,6 +11,7 @@ import arc.util.ArcAnnotate.*; import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.entities.units.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.ui.*; @@ -22,7 +23,7 @@ import static mindustry.Vars.*; public class PowerNode extends PowerBlock{ protected static boolean returnValue = false; - protected static BuildRequest otherReq; + protected static BuildPlan otherReq; protected final ObjectSet graphs = new ObjectSet<>(); protected final Vec2 t1 = new Vec2(), t2 = new Vec2(); @@ -131,7 +132,7 @@ public class PowerNode extends PowerBlock{ Draw.reset(); } - protected void drawLaser(float x1, float y1, float x2, float y2, float satisfaction, int size1, int size2){ + 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; @@ -148,7 +149,7 @@ public class PowerNode extends PowerBlock{ Draw.color(Color.white, Pal.powerLight, fract * 0.86f + Mathf.absin(3f, 0.1f)); Draw.alpha(opacity); - Drawf.laser(laser, laserEnd, x1, y1, x2, y2, 0.25f); + Drawf.laser(team, laser, laserEnd, x1, y1, x2, y2, 0.25f); Draw.color(); } @@ -201,7 +202,7 @@ public class PowerNode extends PowerBlock{ } @Override - public void drawRequestConfigTop(BuildRequest req, Eachable list){ + public void drawRequestConfigTop(BuildPlan req, Eachable list){ if(req.config instanceof Point2[]){ for(Point2 point : (Point2[])req.config){ otherReq = null; @@ -213,7 +214,7 @@ public class PowerNode extends PowerBlock{ if(otherReq == null || otherReq.block == null) return; - drawLaser(req.drawx(), req.drawy(), otherReq.drawx(), otherReq.drawy(), 1f, size, otherReq.block.size); + drawLaser(player.team(), req.drawx(), req.drawy(), otherReq.drawx(), otherReq.drawy(), 1f, size, otherReq.block.size); } } } @@ -386,7 +387,7 @@ public class PowerNode extends PowerBlock{ } protected void drawLaserTo(Tilec target){ - drawLaser(x, y, target.x(), target.y(), power.graph.getSatisfaction(), size, target.block().size); + drawLaser(team, x, y, target.x(), target.y(), power.graph.getSatisfaction(), size, target.block().size); } @Override diff --git a/core/src/mindustry/world/blocks/power/ThermalGenerator.java b/core/src/mindustry/world/blocks/power/ThermalGenerator.java index 2eaa29da29..83d2212eb5 100644 --- a/core/src/mindustry/world/blocks/power/ThermalGenerator.java +++ b/core/src/mindustry/world/blocks/power/ThermalGenerator.java @@ -5,6 +5,7 @@ import arc.graphics.*; import arc.math.*; import mindustry.content.*; import mindustry.entities.*; +import mindustry.game.*; import mindustry.graphics.*; import mindustry.world.*; import mindustry.world.meta.*; @@ -30,7 +31,7 @@ public class ThermalGenerator extends PowerGenerator{ } @Override - public boolean canPlaceOn(Tile tile){ + public boolean canPlaceOn(Tile tile, Team team){ //make sure there's heat at this location return tile.getLinkedTilesAs(this, tempTiles).sumf(other -> other.floor().attributes.get(attribute)) > 0.01f; } @@ -45,7 +46,7 @@ public class ThermalGenerator extends PowerGenerator{ @Override public void drawLight(){ - Drawf.light(x, y, (40f + Mathf.absin(10f, 5f)) * productionEfficiency * size, Color.scarlet, 0.4f); + Drawf.light(team, x, y, (40f + Mathf.absin(10f, 5f)) * productionEfficiency * size, Color.scarlet, 0.4f); } @Override diff --git a/core/src/mindustry/world/blocks/production/Cultivator.java b/core/src/mindustry/world/blocks/production/Cultivator.java index a7c182739c..f4587a4a82 100644 --- a/core/src/mindustry/world/blocks/production/Cultivator.java +++ b/core/src/mindustry/world/blocks/production/Cultivator.java @@ -31,11 +31,11 @@ public class Cultivator extends GenericCrafter{ @Override public void setBars(){ super.setBars(); - bars.add("multiplier", entity -> new Bar(() -> + bars.add("multiplier", (CultivatorEntity entity) -> new Bar(() -> Core.bundle.formatFloat("bar.efficiency", - ((((CultivatorEntity)entity).boost + 1f) * ((CultivatorEntity)entity).warmup) * 100f, 1), + ((entity.boost + 1f) * entity.warmup) * 100f, 1), () -> Pal.ammo, - () -> ((CultivatorEntity)entity).warmup)); + () -> entity.warmup)); } @Override @@ -51,8 +51,8 @@ public class Cultivator extends GenericCrafter{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-top"),}; + public TextureRegion[] icons(){ + return new TextureRegion[]{region, topRegion}; } public class CultivatorEntity extends GenericCrafterEntity{ diff --git a/core/src/mindustry/world/blocks/production/Drill.java b/core/src/mindustry/world/blocks/production/Drill.java index 15409f8408..31a469da45 100644 --- a/core/src/mindustry/world/blocks/production/Drill.java +++ b/core/src/mindustry/world/blocks/production/Drill.java @@ -10,6 +10,7 @@ import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.entities.units.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.type.*; @@ -23,7 +24,7 @@ public class Drill extends Block{ public float hardnessDrillMultiplier = 50f; protected final ObjectIntMap oreCount = new ObjectIntMap<>(); - protected final Array itemArray = new Array<>(); + protected final Seq itemArray = new Seq<>(); /** Maximum tier of blocks this drill can mine. */ public int tier; @@ -68,7 +69,7 @@ public class Drill extends Block{ } @Override - public void drawRequestConfigTop(BuildRequest req, Eachable list){ + public void drawRequestConfigTop(BuildPlan req, Eachable list){ if(!req.worldContext) return; Tile tile = req.tile(); if(tile == null) return; @@ -85,11 +86,8 @@ public class Drill extends Block{ public void setBars(){ super.setBars(); - bars.add("drillspeed", e -> { - DrillEntity entity = (DrillEntity)e; - - return new Bar(() -> Core.bundle.format("bar.drillspeed", Strings.fixed(entity.lastDrillSpeed * 60 * entity.timeScale(), 2)), () -> Pal.ammo, () -> entity.warmup); - }); + bars.add("drillspeed", (DrillEntity e) -> + new Bar(() -> Core.bundle.format("bar.drillspeed", Strings.fixed(e.lastDrillSpeed * 60 * e.timeScale(), 2)), () -> Pal.ammo, () -> e.warmup)); } public Item getDrop(Tile tile){ @@ -97,7 +95,7 @@ public class Drill extends Block{ } @Override - public boolean canPlaceOn(Tile tile){ + public boolean canPlaceOn(Tile tile, Team team){ if(isMultiblock()){ for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){ if(canMine(other)){ @@ -138,7 +136,7 @@ public class Drill extends Block{ super.setStats(); stats.add(BlockStat.drillTier, table -> { - Array list = content.blocks().select(b -> b.isFloor() && b.asFloor().itemDrop != null && b.asFloor().itemDrop.hardness <= tier); + Seq list = content.blocks().select(b -> b.isFloor() && b.asFloor().itemDrop != null && b.asFloor().itemDrop.hardness <= tier); table.table(l -> { l.left(); @@ -164,8 +162,8 @@ public class Drill extends Block{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-rotator"), Core.atlas.find(name + "-top")}; + public TextureRegion[] icons(){ + return new TextureRegion[]{region, rotatorRegion, topRegion}; } void countOre(Tile tile){ @@ -208,15 +206,14 @@ public class Drill extends Block{ } public class DrillEntity extends TileEntity{ - float progress; - int index; - float warmup; - float timeDrilled; - float lastDrillSpeed; - - int dominantItems; - Item dominantItem; + public float progress; + public int index; + public float warmup; + public float timeDrilled; + public float lastDrillSpeed; + public int dominantItems; + public Item dominantItem; @Override public boolean shouldConsume(){ @@ -284,7 +281,6 @@ public class Drill extends Block{ if(dominantItems > 0 && progress >= delay && items.total() < itemCapacity){ offload(dominantItem); - useContent(dominantItem); index ++; progress %= delay; diff --git a/core/src/mindustry/world/blocks/production/Fracker.java b/core/src/mindustry/world/blocks/production/Fracker.java index bae1612869..12649b8f06 100644 --- a/core/src/mindustry/world/blocks/production/Fracker.java +++ b/core/src/mindustry/world/blocks/production/Fracker.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.production; -import arc.*; import arc.graphics.g2d.*; import mindustry.annotations.Annotations.*; import mindustry.world.meta.*; @@ -30,8 +29,8 @@ public class Fracker extends SolidPump{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-rotator"), Core.atlas.find(name + "-top")}; + public TextureRegion[] icons(){ + return new TextureRegion[]{region, rotatorRegion, topRegion}; } public class FrackerEntity extends SolidPumpEntity{ diff --git a/core/src/mindustry/world/blocks/production/GenericCrafter.java b/core/src/mindustry/world/blocks/production/GenericCrafter.java index 26416deeaa..c70c08973c 100644 --- a/core/src/mindustry/world/blocks/production/GenericCrafter.java +++ b/core/src/mindustry/world/blocks/production/GenericCrafter.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.production; -import arc.func.*; import arc.graphics.g2d.*; import arc.math.*; import arc.util.io.*; @@ -10,6 +9,7 @@ import mindustry.gen.*; import mindustry.type.*; import mindustry.world.*; import mindustry.world.consumers.*; +import mindustry.world.draw.*; import mindustry.world.meta.*; public class GenericCrafter extends Block{ @@ -21,8 +21,10 @@ public class GenericCrafter extends Block{ public Effect updateEffect = Fx.none; public float updateEffectChance = 0.04f; - public Cons drawer = null; - public Prov drawIcons = null; + public DrawBlock drawer = new DrawBlock(); + + //public Cons drawer = null; + //public Prov drawIcons = null; public GenericCrafter(String name){ super(name); @@ -54,6 +56,13 @@ public class GenericCrafter extends Block{ } } + @Override + public void load(){ + super.load(); + + drawer.load(this); + } + @Override public void init(){ outputsLiquid = outputLiquid != null; @@ -61,8 +70,8 @@ public class GenericCrafter extends Block{ } @Override - public TextureRegion[] generateIcons(){ - return drawIcons == null ? super.generateIcons() : drawIcons.get(); + public TextureRegion[] icons(){ + return drawer.icons(this); } @Override @@ -77,11 +86,7 @@ public class GenericCrafter extends Block{ @Override public void draw(){ - if(drawer == null){ - super.draw(); - }else{ - drawer.get(this); - } + drawer.draw(this); } @Override @@ -111,14 +116,12 @@ public class GenericCrafter extends Block{ consume(); if(outputItem != null){ - useContent(outputItem.item); for(int i = 0; i < outputItem.amount; i++){ offload(outputItem.item); } } if(outputLiquid != null){ - useContent(outputLiquid.liquid); handleLiquid(this, outputLiquid.liquid, outputLiquid.amount); } diff --git a/core/src/mindustry/world/blocks/production/GenericSmelter.java b/core/src/mindustry/world/blocks/production/GenericSmelter.java index 297803c694..bb1260d3c7 100644 --- a/core/src/mindustry/world/blocks/production/GenericSmelter.java +++ b/core/src/mindustry/world/blocks/production/GenericSmelter.java @@ -41,7 +41,7 @@ public class GenericSmelter extends GenericCrafter{ @Override public void drawLight(){ - Drawf.light(x, y, (60f + Mathf.absin(10f, 5f)) * warmup * size, flameColor, 0.65f); + Drawf.light(team, x, y, (60f + Mathf.absin(10f, 5f)) * warmup * size, flameColor, 0.65f); } } } diff --git a/core/src/mindustry/world/blocks/production/LiquidConverter.java b/core/src/mindustry/world/blocks/production/LiquidConverter.java index 1b63548e62..d722d00211 100644 --- a/core/src/mindustry/world/blocks/production/LiquidConverter.java +++ b/core/src/mindustry/world/blocks/production/LiquidConverter.java @@ -43,14 +43,13 @@ public class LiquidConverter extends GenericCrafter{ ConsumeLiquidBase cl = consumes.get(ConsumeType.liquid); if(cons.valid()){ - float use = Math.min(cl.amount * delta(), liquidCapacity - liquids.get(outputLiquid.liquid)) * efficiency(); + float use = Math.min(cl.amount * edelta(), liquidCapacity - liquids.get(outputLiquid.liquid)); - useContent(outputLiquid.liquid); - progress += use / cl.amount / craftTime; + progress += use / cl.amount; liquids.add(outputLiquid.liquid, use); - if(progress >= 1f){ + if(progress >= craftTime){ consume(); - progress = 0f; + progress %= craftTime; } } diff --git a/core/src/mindustry/world/blocks/production/PayloadAcceptor.java b/core/src/mindustry/world/blocks/production/PayloadAcceptor.java index 56a485befe..694472734d 100644 --- a/core/src/mindustry/world/blocks/production/PayloadAcceptor.java +++ b/core/src/mindustry/world/blocks/production/PayloadAcceptor.java @@ -5,6 +5,7 @@ import arc.math.*; import arc.math.geom.*; import arc.util.ArcAnnotate.*; import arc.util.io.*; +import mindustry.annotations.Annotations.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.world.*; @@ -15,6 +16,10 @@ import static mindustry.Vars.tilesize; public class PayloadAcceptor extends Block{ public float payloadSpeed = 0.5f; + public @Load(value = "@-top", fallback = "factory-top-$size") TextureRegion topRegion; + public @Load(value = "@-out", fallback = "factory-out-$size") TextureRegion outRegion; + public @Load(value = "@-in", fallback = "factory-in-$size") TextureRegion inRegion; + public PayloadAcceptor(String name){ super(name); @@ -25,11 +30,20 @@ public class PayloadAcceptor extends Block{ int size = tile.block().size; Tilec accept = tile.nearby(Geometry.d4(direction).x * size, Geometry.d4(direction).y * size); return accept != null && - accept.block().size == size && accept.block().outputsPayload && - //block must either be facing this one, or not be rotating + + //if size is the same, block must either be facing this one, or not be rotating + ((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.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 + ); } public class PayloadAcceptorEntity extends TileEntity{ @@ -58,6 +72,10 @@ public class PayloadAcceptor extends Block{ return t; } + public boolean blends(int direction){ + return PayloadAcceptor.blends(this, direction); + } + public void updatePayload(){ if(payload != null){ payload.set(x + payVector.x, y + payVector.y, payRotation); @@ -92,7 +110,7 @@ public class PayloadAcceptor extends Block{ if(movePayload(payload)){ payload = null; } - }else if(front != null && !front.tile().solid()){ + }else if(front == null || !front.tile().solid()){ dumpPayload(); } } diff --git a/core/src/mindustry/world/blocks/production/Pump.java b/core/src/mindustry/world/blocks/production/Pump.java index 4d8c655ec3..0dff2b248b 100644 --- a/core/src/mindustry/world/blocks/production/Pump.java +++ b/core/src/mindustry/world/blocks/production/Pump.java @@ -3,6 +3,7 @@ package mindustry.world.blocks.production; import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; +import mindustry.game.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; @@ -12,8 +13,6 @@ import mindustry.world.meta.*; import static mindustry.Vars.*; public class Pump extends LiquidBlock{ - public final int timerContentCheck = timers++; - /** Pump amount, total. */ protected float pumpAmount = 1f; @@ -55,12 +54,12 @@ public class Pump extends LiquidBlock{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name)}; + public TextureRegion[] icons(){ + return new TextureRegion[]{region}; } @Override - public boolean canPlaceOn(Tile tile){ + public boolean canPlaceOn(Tile tile, Team team){ if(isMultiblock()){ Liquid last = null; for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){ @@ -114,10 +113,6 @@ public class Pump extends LiquidBlock{ liquids.add(liquidDrop, maxPump); } - if(liquids.currentAmount() > 0f && timer(timerContentCheck, 10)){ - useContent(liquids.current()); - } - dumpLiquid(liquids.current()); } } diff --git a/core/src/mindustry/world/blocks/production/SolidPump.java b/core/src/mindustry/world/blocks/production/SolidPump.java index 8aecc70d85..64f6570d63 100644 --- a/core/src/mindustry/world/blocks/production/SolidPump.java +++ b/core/src/mindustry/world/blocks/production/SolidPump.java @@ -8,6 +8,7 @@ import arc.util.*; import mindustry.annotations.Annotations.*; import mindustry.content.*; import mindustry.entities.*; +import mindustry.game.*; import mindustry.graphics.*; import mindustry.type.*; import mindustry.ui.*; @@ -42,11 +43,11 @@ public class SolidPump extends Pump{ @Override public void setBars(){ super.setBars(); - bars.add("efficiency", entity -> new Bar(() -> + bars.add("efficiency", (SolidPumpEntity entity) -> new Bar(() -> Core.bundle.formatFloat("bar.pumpspeed", - ((SolidPumpEntity)entity).lastPump / Time.delta() * 60, 1), + entity.lastPump / Time.delta() * 60, 1), () -> Pal.ammo, - () -> ((SolidPumpEntity)entity).warmup)); + () -> entity.warmup)); } @Override @@ -61,7 +62,7 @@ public class SolidPump extends Pump{ } @Override - public boolean canPlaceOn(Tile tile){ + public boolean canPlaceOn(Tile tile, Team team){ if(isMultiblock()){ for(Tile other : tile.getLinkedTilesAs(this, tempTiles)){ if(canPump(other)){ @@ -80,8 +81,8 @@ public class SolidPump extends Pump{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-rotator"), Core.atlas.find(name + "-top")}; + public TextureRegion[] icons(){ + return new TextureRegion[]{region, rotatorRegion, topRegion}; } public class SolidPumpEntity extends PumpEntity{ @@ -123,7 +124,6 @@ public class SolidPump extends Pump{ liquids.add(result, maxPump); lastPump = maxPump; warmup = Mathf.lerpDelta(warmup, 1f, 0.02f); - if(timer(timerContentCheck, 10)) useContent(result); if(Mathf.chance(delta() * updateEffectChance)) updateEffect.at(getX() + Mathf.range(size * 2f), getY() + Mathf.range(size * 2f)); }else{ diff --git a/core/src/mindustry/world/blocks/sandbox/ItemSource.java b/core/src/mindustry/world/blocks/sandbox/ItemSource.java index aab3e3979a..c4fa61590a 100644 --- a/core/src/mindustry/world/blocks/sandbox/ItemSource.java +++ b/core/src/mindustry/world/blocks/sandbox/ItemSource.java @@ -24,8 +24,8 @@ public class ItemSource extends Block{ configurable = true; saveConfig = true; - config(Item.class, (tile, item) -> ((ItemSourceEntity)tile).outputItem = item); - configClear(tile -> ((ItemSourceEntity)tile).outputItem = null); + config(Item.class, (ItemSourceEntity tile, Item item) -> tile.outputItem = item); + configClear((ItemSourceEntity tile) -> tile.outputItem = null); } @Override @@ -35,7 +35,7 @@ public class ItemSource extends Block{ } @Override - public void drawRequestConfig(BuildRequest req, Eachable list){ + public void drawRequestConfig(BuildPlan req, Eachable list){ drawRequestConfigCenter(req, req.config, "center"); } diff --git a/core/src/mindustry/world/blocks/sandbox/LiquidSource.java b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java index 9ce4edc8e8..178a41db41 100644 --- a/core/src/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/mindustry/world/blocks/sandbox/LiquidSource.java @@ -25,8 +25,8 @@ public class LiquidSource extends Block{ outputsLiquid = true; saveConfig = true; - config(Liquid.class, (tile, l) -> ((LiquidSourceEntity)tile).source = l); - configClear(tile -> ((LiquidSourceEntity)tile).source = null); + config(Liquid.class, (LiquidSourceEntity tile, Liquid l) -> tile.source = l); + configClear((LiquidSourceEntity tile) -> tile.source = null); } @Override @@ -37,7 +37,7 @@ public class LiquidSource extends Block{ } @Override - public void drawRequestConfig(BuildRequest req, Eachable list){ + public void drawRequestConfig(BuildPlan req, Eachable list){ drawRequestConfigCenter(req, req.config, "center"); } diff --git a/core/src/mindustry/world/blocks/storage/CoreBlock.java b/core/src/mindustry/world/blocks/storage/CoreBlock.java index 3d6f59e7a2..571a09b8b2 100644 --- a/core/src/mindustry/world/blocks/storage/CoreBlock.java +++ b/core/src/mindustry/world/blocks/storage/CoreBlock.java @@ -17,6 +17,7 @@ import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; import mindustry.world.blocks.*; +import mindustry.world.blocks.units.*; import mindustry.world.meta.*; import mindustry.world.modules.*; @@ -25,6 +26,15 @@ import static mindustry.Vars.*; public class CoreBlock extends StorageBlock{ public UnitType unitType = UnitTypes.alpha; + public final int timerResupply = timers++; + + public int launchRange = 1; + + public int ammoAmount = 5; + public float resupplyRate = 10f; + public float resupplyRange = 60f; + public Item resupplyItem = Items.copper; + public CoreBlock(String name){ super(name); @@ -61,11 +71,11 @@ public class CoreBlock extends StorageBlock{ public void setStats(){ super.setStats(); - bars.add("capacity", e -> + bars.add("capacity", (CoreEntity e) -> new Bar( - () -> Core.bundle.format("bar.capacity", ui.formatAmount(((CoreEntity)e).storageCapacity)), + () -> Core.bundle.format("bar.capacity", ui.formatAmount(e.storageCapacity)), () -> Pal.items, - () -> e.items().total() / (float)(((CoreEntity)e).storageCapacity * content.items().count(i -> i.type == ItemType.material)) + () -> e.items().total() / ((float)e.storageCapacity * content.items().count(i -> i.type == ItemType.material)) )); bars.add("units", e -> @@ -101,9 +111,18 @@ public class CoreBlock extends StorageBlock{ Call.onPlayerSpawn(tile, player); } + @Override + public void updateTile(){ + + //resupply nearby units + if(items.has(resupplyItem) && timer(timerResupply, resupplyRate) && ResupplyPoint.resupply(this, resupplyRange, ammoAmount, resupplyItem.color)){ + items.remove(resupplyItem, 1); + } + } + @Override public void drawLight(){ - Drawf.light(x, y, 30f * size, Pal.accent, 0.5f + Mathf.absin(20f, 0.1f)); + Drawf.light(team, x, y, 30f * size, Pal.accent, 0.5f + Mathf.absin(20f, 0.1f)); } @Override diff --git a/core/src/mindustry/world/blocks/storage/MessageBlock.java b/core/src/mindustry/world/blocks/storage/MessageBlock.java index d3f34b7726..a6adb2e411 100644 --- a/core/src/mindustry/world/blocks/storage/MessageBlock.java +++ b/core/src/mindustry/world/blocks/storage/MessageBlock.java @@ -29,9 +29,7 @@ public class MessageBlock extends Block{ solid = true; destructible = true; - config(String.class, (tile, text) -> { - MessageBlockEntity entity = (MessageBlockEntity)tile; - + config(String.class, (MessageBlockEntity tile, String text) -> { if(net.server() && text.length() > maxTextLength){ throw new ValidateException(player, "Player has gone above text limit."); } @@ -51,8 +49,8 @@ public class MessageBlock extends Block{ } } - entity.message = result.toString(); - entity.lines = entity.message.split("\n"); + tile.message = result.toString(); + tile.lines = tile.message.split("\n"); }); } diff --git a/core/src/mindustry/world/blocks/storage/Unloader.java b/core/src/mindustry/world/blocks/storage/Unloader.java index 4809b8f47c..2611328563 100644 --- a/core/src/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/mindustry/world/blocks/storage/Unloader.java @@ -27,16 +27,12 @@ public class Unloader extends Block{ saveConfig = true; itemCapacity = 0; - config(Item.class, (tile, item) -> { - tile.items().clear(); - ((UnloaderEntity)tile).sortItem = item; - }); - - configClear(tile -> ((UnloaderEntity)tile).sortItem = null); + config(Item.class, (UnloaderEntity tile, Item item) -> tile.sortItem = item); + configClear((UnloaderEntity tile) -> tile.sortItem = null); } @Override - public void drawRequestConfig(BuildRequest req, Eachable list){ + public void drawRequestConfig(BuildPlan req, Eachable list){ drawRequestConfigCenter(req, req.config, "unloader-center"); } diff --git a/core/src/mindustry/world/blocks/units/Reconstructor.java b/core/src/mindustry/world/blocks/units/Reconstructor.java index 7670c7f801..5783f9f3d6 100644 --- a/core/src/mindustry/world/blocks/units/Reconstructor.java +++ b/core/src/mindustry/world/blocks/units/Reconstructor.java @@ -3,7 +3,7 @@ package mindustry.world.blocks.units; import arc.graphics.g2d.*; import arc.math.*; import arc.util.*; -import mindustry.annotations.Annotations.*; +import mindustry.*; import mindustry.content.*; import mindustry.entities.*; import mindustry.entities.units.*; @@ -12,32 +12,36 @@ import mindustry.graphics.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.blocks.payloads.*; +import mindustry.world.consumers.*; import mindustry.world.meta.*; -import static mindustry.Vars.state; +import static mindustry.Vars.*; public class Reconstructor extends UnitBlock{ - public @Load(value = "@-top", fallback = "factory-top") TextureRegion topRegion; - public @Load(value = "@-out", fallback = "factory-out") TextureRegion outRegion; - public @Load(value = "@-in", fallback = "factory-in") TextureRegion inRegion; public float constructTime = 60 * 2; public UnitType[][] upgrades = {}; + public int[] capacities; public Reconstructor(String name){ super(name); } @Override - public void drawRequestRegion(BuildRequest req, Eachable list){ + public void drawRequestRegion(BuildPlan req, Eachable list){ Draw.rect(region, req.drawx(), req.drawy()); Draw.rect(outRegion, req.drawx(), req.drawy(), req.rotation * 90); Draw.rect(topRegion, req.drawx(), req.drawy()); } + @Override + public TextureRegion[] icons(){ + return new TextureRegion[]{region, outRegion, topRegion}; + } + @Override public void setBars(){ super.setBars(); - bars.add("progress", entity -> new Bar("bar.progress", Pal.ammo, ((ReconstructorEntity)entity)::fraction)); + bars.add("progress", (ReconstructorEntity entity) -> new Bar("bar.progress", Pal.ammo, entity::fraction)); } @Override @@ -47,6 +51,19 @@ public class Reconstructor extends UnitBlock{ stats.add(BlockStat.productionTime, constructTime / 60f, StatUnit.seconds); } + @Override + public void init(){ + capacities = new int[Vars.content.items().size]; + if(consumes.has(ConsumeType.item) && consumes.get(ConsumeType.item) instanceof ConsumeItems){ + for(ItemStack stack : consumes.get(ConsumeType.item).items){ + capacities[stack.item.id] = Math.max(capacities[stack.item.id], stack.amount * 2); + itemCapacity = Math.max(itemCapacity, stack.amount * 2); + } + } + + super.init(); + } + public class ReconstructorEntity extends UnitBlockEntity{ public float fraction(){ @@ -61,13 +78,18 @@ public class Reconstructor extends UnitBlock{ && hasUpgrade(((UnitPayload)payload).unit.type()); } + @Override + public int getMaximumAccepted(Item item){ + return capacities[item.id]; + } + @Override public void draw(){ Draw.rect(region, x, y); //draw input for(int i = 0; i < 4; i++){ - if(blends(this, i) && i != rotation()){ + if(blends(i) && i != rotation()){ Draw.rect(inRegion, x, y, i * 90); } } diff --git a/core/src/mindustry/world/blocks/units/RepairPoint.java b/core/src/mindustry/world/blocks/units/RepairPoint.java index 36fa27b435..971a9c6ec6 100644 --- a/core/src/mindustry/world/blocks/units/RepairPoint.java +++ b/core/src/mindustry/world/blocks/units/RepairPoint.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.units; -import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -14,7 +13,7 @@ import mindustry.graphics.*; import mindustry.world.*; import mindustry.world.meta.*; -import static mindustry.Vars.tilesize; +import static mindustry.Vars.*; public class RepairPoint extends Block{ private static final Rect rect = new Rect(); @@ -56,8 +55,8 @@ public class RepairPoint extends Block{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name + "-base"), Core.atlas.find(name)}; + public TextureRegion[] icons(){ + return new TextureRegion[]{baseRegion, region}; } public class RepairPointEntity extends TileEntity{ @@ -77,7 +76,7 @@ public class RepairPoint extends Block{ float len = 5f; Draw.color(Color.valueOf("e8ffd7")); - Drawf.laser(laser, laserEnd, + Drawf.laser(team, laser, laserEnd, x + Angles.trnsx(ang, len), y + Angles.trnsy(ang, len), target.x(), target.y(), strength); Draw.color(); diff --git a/core/src/mindustry/world/blocks/units/ResupplyPoint.java b/core/src/mindustry/world/blocks/units/ResupplyPoint.java new file mode 100644 index 0000000000..c12a8d49e3 --- /dev/null +++ b/core/src/mindustry/world/blocks/units/ResupplyPoint.java @@ -0,0 +1,65 @@ +package mindustry.world.blocks.units; + +import arc.graphics.*; +import mindustry.content.*; +import mindustry.entities.*; +import mindustry.gen.*; +import mindustry.graphics.*; +import mindustry.world.*; + +import static mindustry.Vars.*; + +public class ResupplyPoint extends Block{ + public final int timerResupply = timers++; + + public int ammoAmount = 10; + public float resupplyRate = 5f; + public float range = 60f; + public Color ammoColor = Items.copper.color; + + public ResupplyPoint(String name){ + super(name); + solid = update = true; + hasItems = true; + } + + @Override + public boolean outputsItems(){ + return false; + } + + @Override + public void drawPlace(int x, int y, int rotation, boolean valid){ + Drawf.dashCircle(x * tilesize + offset(), y * tilesize + offset(), range, Pal.placing); + } + + public class ResupplyPointEntity extends TileEntity{ + + @Override + public void drawSelect(){ + Drawf.dashCircle(x, y, range, team.color); + } + + @Override + public void updateTile(){ + if(consValid() && timer(timerResupply, resupplyRate / timeScale) && resupply(this, range, ammoAmount, ammoColor)){ + consume(); + } + } + } + + /** Tries to resupply nearby units. + * @return whether resupplying was successful. If unit ammo is disabled, always returns false. */ + public static boolean resupply(TileEntity tile, float range, int ammoAmount, Color ammoColor){ + if(!state.rules.unitAmmo) return false; + + Unitc unit = Units.closest(tile.team, tile.x, tile.y, range, u -> 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)); + return true; + } + + return false; + } +} diff --git a/core/src/mindustry/world/blocks/units/UnitFactory.java b/core/src/mindustry/world/blocks/units/UnitFactory.java index 0bac7424bb..6567054ffd 100644 --- a/core/src/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/mindustry/world/blocks/units/UnitFactory.java @@ -1,6 +1,5 @@ package mindustry.world.blocks.units; -import arc.*; import arc.graphics.*; import arc.graphics.g2d.*; import arc.math.*; @@ -10,7 +9,6 @@ import arc.struct.*; import arc.util.*; import arc.util.io.*; import mindustry.*; -import mindustry.annotations.Annotations.*; import mindustry.entities.*; import mindustry.entities.units.*; import mindustry.gen.*; @@ -23,8 +21,6 @@ import mindustry.world.consumers.*; import mindustry.world.meta.*; public class UnitFactory extends UnitBlock{ - public @Load(value = "@-top", fallback = "factory-top") TextureRegion topRegion; - public @Load(value = "@-out", fallback = "factory-out") TextureRegion outRegion; public int[] capacities; public UnitPlan[] plans = new UnitPlan[0]; @@ -41,38 +37,31 @@ public class UnitFactory extends UnitBlock{ outputsPayload = true; rotate = true; - config(Integer.class, (tile, i) -> { - ((UnitFactoryEntity)tile).currentPlan = i < 0 || i >= plans.length ? -1 : i; - ((UnitFactoryEntity)tile).progress = 0; + config(Integer.class, (UnitFactoryEntity tile, Integer i) -> { + tile.currentPlan = i < 0 || i >= plans.length ? -1 : i; + tile.progress = 0; }); - consumes.add(new ConsumeItemDynamic(e -> { - UnitFactoryEntity entity = (UnitFactoryEntity)e; - - if(entity.currentPlan != -1){ - return plans[entity.currentPlan].requirements; - } - - return ItemStack.empty; - })); + consumes.add(new ConsumeItemDynamic((UnitFactoryEntity e) -> e.currentPlan != -1 ? plans[e.currentPlan].requirements : ItemStack.empty)); } @Override public void init(){ - super.init(); - capacities = new int[Vars.content.items().size]; for(UnitPlan plan : plans){ for(ItemStack stack : plan.requirements){ capacities[stack.item.id] = Math.max(capacities[stack.item.id], stack.amount * 2); + itemCapacity = Math.max(itemCapacity, stack.amount * 2); } } + + super.init(); } @Override public void setBars(){ super.setBars(); - bars.add("progress", entity -> new Bar("bar.progress", Pal.ammo, ((UnitFactoryEntity)entity)::fraction)); + bars.add("progress", (UnitFactoryEntity entity) -> new Bar("bar.progress", Pal.ammo, entity::fraction)); } @Override @@ -88,12 +77,12 @@ public class UnitFactory extends UnitBlock{ } @Override - public TextureRegion[] generateIcons(){ - return new TextureRegion[]{Core.atlas.find(name), Core.atlas.find(name + "-out"), Core.atlas.find(name + "-top")}; + public TextureRegion[] icons(){ + return new TextureRegion[]{region, outRegion, topRegion}; } @Override - public void drawRequestRegion(BuildRequest req, Eachable list){ + public void drawRequestRegion(BuildPlan req, Eachable list){ Draw.rect(region, req.drawx(), req.drawy()); Draw.rect(outRegion, req.drawx(), req.drawy(), req.rotation * 90); Draw.rect(topRegion, req.drawx(), req.drawy()); @@ -122,7 +111,7 @@ public class UnitFactory extends UnitBlock{ @Override public void buildConfiguration(Table table){ - Array units = Array.with(plans).map(u -> u.unit); + Seq units = Seq.with(plans).map(u -> u.unit); ItemSelection.buildTable(table, units, () -> currentPlan == -1 ? null : plans[currentPlan].unit, unit -> configure(units.indexOf(unit))); } diff --git a/core/src/mindustry/world/consumers/Consume.java b/core/src/mindustry/world/consumers/Consume.java index cfcd77f708..c37c5ab668 100644 --- a/core/src/mindustry/world/consumers/Consume.java +++ b/core/src/mindustry/world/consumers/Consume.java @@ -61,9 +61,7 @@ public abstract class Consume{ public abstract void build(Tilec tile, Table table); /** Called when a consumption is triggered manually. */ - public void trigger(Tilec entity){ - - } + public void trigger(Tilec entity){} public abstract String getIcon(); diff --git a/core/src/mindustry/world/consumers/ConsumeItemDynamic.java b/core/src/mindustry/world/consumers/ConsumeItemDynamic.java index 75401a6c8e..d85e38ea5d 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemDynamic.java +++ b/core/src/mindustry/world/consumers/ConsumeItemDynamic.java @@ -1,6 +1,7 @@ package mindustry.world.consumers; import arc.func.*; +import arc.math.*; import arc.scene.ui.layout.*; import arc.struct.*; import arc.util.ArcAnnotate.*; @@ -12,8 +13,8 @@ import mindustry.world.meta.*; public class ConsumeItemDynamic extends Consume{ public final @NonNull Func items; - public ConsumeItemDynamic(Func items){ - this.items = items; + public ConsumeItemDynamic(Func items){ + this.items = (Func)items; } @Override @@ -43,7 +44,7 @@ public class ConsumeItemDynamic extends Consume{ private void rebuild(Tilec tile, Table table){ 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(5); + () -> tile.items() != null && tile.items().has(stack.item, stack.amount))).size(8 * 4).padRight(6 * Mathf.digits(stack.amount)); } } diff --git a/core/src/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/mindustry/world/consumers/ConsumeItemFilter.java index e97afbf883..2ff850f843 100644 --- a/core/src/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeItemFilter.java @@ -33,7 +33,7 @@ public class ConsumeItemFilter extends Consume{ @Override public void build(Tilec tile, Table table){ MultiReqImage image = new MultiReqImage(); - content.items().each(i -> filter.get(i) && (!state.isCampaign() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium), 1), + content.items().each(i -> filter.get(i) && i.unlockedNow(), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium), 1), () -> tile.items() != null && tile.items().has(item)))); table.add(image).size(8 * 4); diff --git a/core/src/mindustry/world/consumers/ConsumeItems.java b/core/src/mindustry/world/consumers/ConsumeItems.java index 0889ac7ad1..bd916b81e4 100644 --- a/core/src/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/mindustry/world/consumers/ConsumeItems.java @@ -1,5 +1,6 @@ package mindustry.world.consumers; +import arc.math.*; import arc.struct.*; import arc.scene.ui.layout.*; import arc.util.ArcAnnotate.*; @@ -37,7 +38,7 @@ public class ConsumeItems extends Consume{ public void build(Tilec 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(5); + () -> tile.items() != null && tile.items().has(stack.item, stack.amount))).size(8 * 4).padRight(Mathf.digits(stack.amount) * 6); } } diff --git a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java index e582d2eb2c..962986905a 100644 --- a/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -29,7 +29,7 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ @Override public void build(Tilec tile, Table table){ - Array list = content.liquids().select(l -> !l.isHidden() && filter.get(l)); + Seq list = content.liquids().select(l -> !l.isHidden() && filter.get(l)); MultiReqImage image = new MultiReqImage(); list.each(liquid -> image.add(new ReqImage(liquid.icon(Cicon.medium), () -> tile.liquids() != null && tile.liquids().get(liquid) >= use(tile)))); diff --git a/core/src/mindustry/world/draw/DrawAnimation.java b/core/src/mindustry/world/draw/DrawAnimation.java new file mode 100644 index 0000000000..1187cdf498 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawAnimation.java @@ -0,0 +1,46 @@ +package mindustry.world.draw; + +import arc.*; +import arc.graphics.*; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.world.*; +import mindustry.world.blocks.production.GenericCrafter.*; + +public class DrawAnimation extends DrawBlock{ + public int frameCount = 3; + public float frameSpeed = 5f; + public boolean sine = true; + public TextureRegion[] frames; + public TextureRegion liquid, top; + + @Override + public void draw(GenericCrafterEntity entity){ + Draw.rect(entity.block.region, entity.x, entity.y); + Draw.rect( + sine ? + frames[(int)Mathf.absin(entity.totalProgress, frameSpeed, frameCount - 0.001f)] : + frames[(int)((entity.totalProgress / frameSpeed) % frameCount)], + entity.x, entity.y); + Draw.color(Color.clear, entity.liquids.current().color, entity.liquids.total() / entity.block.liquidCapacity); + Draw.rect(liquid, entity.x, entity.y); + Draw.color(); + Draw.rect(top, entity.x, entity.y); + } + + @Override + public void load(Block block){ + frames = new TextureRegion[frameCount]; + for(int i = 0; i < frameCount; i++){ + frames[i] = Core.atlas.find(block.name + "-frame" + i); + } + + liquid = Core.atlas.find(block.name + "-liquid"); + top = Core.atlas.find(block.name + "-top"); + } + + @Override + public TextureRegion[] icons(Block block){ + return new TextureRegion[]{block.region, top}; + } +} \ No newline at end of file diff --git a/core/src/mindustry/world/draw/DrawBlock.java b/core/src/mindustry/world/draw/DrawBlock.java new file mode 100644 index 0000000000..0752c66602 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawBlock.java @@ -0,0 +1,25 @@ +package mindustry.world.draw; + +import arc.graphics.g2d.*; +import mindustry.world.*; +import mindustry.world.blocks.production.GenericCrafter.*; + +/** An implementation of custom rendering behavior for a block. + * This is used mostly for mods. */ +public class DrawBlock{ + + /** Draws the block. */ + public void draw(GenericCrafterEntity entity){ + Draw.rect(entity.block.region, entity.x, entity.y, entity.block.rotate ? entity.rotdeg() : 0); + } + + /** Load any relevant texture regions. */ + public void load(Block block){ + + } + + /** @return the generated icons to be used for this block. */ + public TextureRegion[] icons(Block block){ + return new TextureRegion[]{block.region}; + } +} diff --git a/core/src/mindustry/world/draw/DrawGlow.java b/core/src/mindustry/world/draw/DrawGlow.java new file mode 100644 index 0000000000..27ae1233da --- /dev/null +++ b/core/src/mindustry/world/draw/DrawGlow.java @@ -0,0 +1,25 @@ +package mindustry.world.draw; + +import arc.*; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.world.*; +import mindustry.world.blocks.production.GenericCrafter.*; + +public class DrawGlow extends DrawBlock{ + public float glowAmount = 0.9f, glowScale = 3f; + public TextureRegion top; + + @Override + public void draw(GenericCrafterEntity entity){ + Draw.rect(entity.block.region, entity.x, entity.y); + Draw.alpha(Mathf.absin(entity.totalProgress, glowScale, glowAmount) * entity.warmup); + Draw.rect(top, entity.x, entity.y); + Draw.reset(); + } + + @Override + public void load(Block block){ + top = Core.atlas.find(block.name + "-top"); + } +} diff --git a/core/src/mindustry/world/draw/DrawMixer.java b/core/src/mindustry/world/draw/DrawMixer.java new file mode 100644 index 0000000000..50ad9e011d --- /dev/null +++ b/core/src/mindustry/world/draw/DrawMixer.java @@ -0,0 +1,39 @@ +package mindustry.world.draw; + +import arc.*; +import arc.graphics.g2d.*; +import mindustry.world.*; +import mindustry.world.blocks.production.*; +import mindustry.world.blocks.production.GenericCrafter.*; + +public class DrawMixer extends DrawBlock{ + public TextureRegion liquid, top, bottom; + + @Override + public void draw(GenericCrafterEntity entity){ + float rotation = entity.block.rotate ? entity.rotdeg() : 0; + + Draw.rect(bottom, entity.x, entity.y, rotation); + + if(entity.liquids.total() > 0.001f){ + Draw.color(((GenericCrafter)entity.block).outputLiquid.liquid.color); + Draw.alpha(entity.liquids.get(((GenericCrafter)entity.block).outputLiquid.liquid) / entity.block.liquidCapacity); + Draw.rect(liquid, entity.x, entity.y, rotation); + Draw.color(); + } + + Draw.rect(top, entity.x, entity.y, rotation); + } + + @Override + public void load(Block block){ + liquid = Core.atlas.find(block.name + "-liquid"); + top = Core.atlas.find(block.name + "-top"); + bottom = Core.atlas.find(block.name + "-bottom"); + } + + @Override + public TextureRegion[] icons(Block block){ + return new TextureRegion[]{bottom, top}; + } +} diff --git a/core/src/mindustry/world/draw/DrawRotator.java b/core/src/mindustry/world/draw/DrawRotator.java new file mode 100644 index 0000000000..ef326f4e32 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawRotator.java @@ -0,0 +1,26 @@ +package mindustry.world.draw; + +import arc.*; +import arc.graphics.g2d.*; +import mindustry.world.*; +import mindustry.world.blocks.production.GenericCrafter.*; + +public class DrawRotator extends DrawBlock{ + public TextureRegion rotator; + + @Override + public void draw(GenericCrafterEntity entity){ + Draw.rect(entity.block.region, entity.x, entity.y); + Draw.rect(rotator, entity.x, entity.y, entity.totalProgress * 2f); + } + + @Override + public void load(Block block){ + rotator = Core.atlas.find(block.name + "-rotator"); + } + + @Override + public TextureRegion[] icons(Block block){ + return new TextureRegion[]{block.region, rotator}; + } +} diff --git a/core/src/mindustry/world/draw/DrawWeave.java b/core/src/mindustry/world/draw/DrawWeave.java new file mode 100644 index 0000000000..8d398fc8d9 --- /dev/null +++ b/core/src/mindustry/world/draw/DrawWeave.java @@ -0,0 +1,43 @@ +package mindustry.world.draw; + +import arc.*; +import arc.graphics.g2d.*; +import arc.math.*; +import mindustry.*; +import mindustry.graphics.*; +import mindustry.world.*; +import mindustry.world.blocks.production.GenericCrafter.*; + +public class DrawWeave extends DrawBlock{ + public TextureRegion weave, bottom; + + @Override + public void draw(GenericCrafterEntity entity){ + Draw.rect(bottom, entity.x(), entity.y()); + Draw.rect(weave, entity.x(), entity.y(), entity.totalProgress); + + Draw.color(Pal.accent); + Draw.alpha(entity.warmup); + + Lines.lineAngleCenter( + entity.x() + Mathf.sin(entity.totalProgress, 6f, Vars.tilesize / 3f * entity.block.size), + entity.y(), + 90, + entity.block.size * Vars.tilesize / 2f); + + Draw.reset(); + + Draw.rect(entity.block.region, entity.x, entity.y); + } + + @Override + public void load(Block block){ + weave = Core.atlas.find(block.name + "-weave"); + bottom = Core.atlas.find(block.name + "-bottom"); + } + + @Override + public TextureRegion[] icons(Block block){ + return new TextureRegion[]{bottom, block.region, weave}; + } +} diff --git a/core/src/mindustry/world/meta/BlockBars.java b/core/src/mindustry/world/meta/BlockBars.java index ec47b7ae47..eb0e3e88a3 100644 --- a/core/src/mindustry/world/meta/BlockBars.java +++ b/core/src/mindustry/world/meta/BlockBars.java @@ -8,13 +8,13 @@ import mindustry.ui.Bar; public class BlockBars{ private OrderedMap> bars = new OrderedMap<>(); - public void add(String name, Func sup){ - bars.put(name, sup); + public void add(String name, Func sup){ + bars.put(name, (Func)sup); } public void remove(String name){ if(!bars.containsKey(name)) - throw new RuntimeException("No bar with name '" + name + "' found; current bars: " + bars.keys().toArray()); + throw new RuntimeException("No bar with name '" + name + "' found; current bars: " + bars.keys().toSeq()); bars.remove(name); } diff --git a/core/src/mindustry/world/meta/BlockStats.java b/core/src/mindustry/world/meta/BlockStats.java index c5f1dc0f5b..2917a92aa3 100644 --- a/core/src/mindustry/world/meta/BlockStats.java +++ b/core/src/mindustry/world/meta/BlockStats.java @@ -9,7 +9,7 @@ import mindustry.world.meta.values.*; /** Hold and organizes a list of block stats. */ public class BlockStats{ - private final OrderedMap>> map = new OrderedMap<>(); + private final OrderedMap>> map = new OrderedMap<>(); private boolean dirty; /** Adds a single float value with this stat, formatted to 2 decimal places. */ @@ -59,7 +59,7 @@ public class BlockStats{ map.put(stat.category, new OrderedMap<>()); } - map.get(stat.category).get(stat, Array::new).add(value); + map.get(stat.category).get(stat, Seq::new).add(value); dirty = true; } @@ -75,11 +75,11 @@ public class BlockStats{ dirty = true; } - public OrderedMap>> toMap(){ + public OrderedMap>> toMap(){ //sort stats by index if they've been modified if(dirty){ map.orderedKeys().sort(); - for(Entry>> entry : map.entries()){ + for(Entry>> entry : map.entries()){ entry.value.orderedKeys().sort(); } diff --git a/core/src/mindustry/world/meta/BuildVisibility.java b/core/src/mindustry/world/meta/BuildVisibility.java index ccf9ccaa72..a25e8ff749 100644 --- a/core/src/mindustry/world/meta/BuildVisibility.java +++ b/core/src/mindustry/world/meta/BuildVisibility.java @@ -9,7 +9,8 @@ public enum BuildVisibility{ debugOnly(() -> false), sandboxOnly(() -> Vars.state.rules.infiniteResources), campaignOnly(() -> Vars.state.isCampaign()), - lightingOnly(() -> Vars.state.rules.lighting); + lightingOnly(() -> Vars.state.rules.lighting), + ammoOnly(() -> Vars.state.rules.unitAmmo); private final Boolp visible; diff --git a/core/src/mindustry/world/meta/Producers.java b/core/src/mindustry/world/meta/Producers.java index eaa52f76cf..c54a5172f5 100644 --- a/core/src/mindustry/world/meta/Producers.java +++ b/core/src/mindustry/world/meta/Producers.java @@ -4,7 +4,7 @@ import arc.struct.*; import mindustry.gen.*; public class Producers{ - private Array producers = new Array<>(); + private Seq producers = new Seq<>(); public void add(Produce prod){ producers.add(prod); diff --git a/core/src/mindustry/world/meta/values/ItemFilterValue.java b/core/src/mindustry/world/meta/values/ItemFilterValue.java index 72928e173f..8f9420ff95 100644 --- a/core/src/mindustry/world/meta/values/ItemFilterValue.java +++ b/core/src/mindustry/world/meta/values/ItemFilterValue.java @@ -1,6 +1,6 @@ package mindustry.world.meta.values; -import arc.struct.Array; +import arc.struct.Seq; import arc.func.Boolf; import arc.scene.ui.layout.Table; import mindustry.type.Item; @@ -18,7 +18,7 @@ public class ItemFilterValue implements StatValue{ @Override public void display(Table table){ - Array list = content.items().select(filter); + Seq list = content.items().select(filter); for(int i = 0; i < list.size; i++){ Item item = list.get(i); diff --git a/core/src/mindustry/world/meta/values/LiquidFilterValue.java b/core/src/mindustry/world/meta/values/LiquidFilterValue.java index 9e44f97ed2..a88a912981 100644 --- a/core/src/mindustry/world/meta/values/LiquidFilterValue.java +++ b/core/src/mindustry/world/meta/values/LiquidFilterValue.java @@ -1,6 +1,6 @@ package mindustry.world.meta.values; -import arc.struct.Array; +import arc.struct.Seq; import arc.func.Boolf; import arc.scene.ui.layout.Table; import mindustry.type.Liquid; @@ -22,7 +22,7 @@ public class LiquidFilterValue implements StatValue{ @Override public void display(Table table){ - Array list = new Array<>(); + Seq list = new Seq<>(); for(Liquid item : content.liquids()){ if(!item.isHidden() && filter.get(item)) list.add(item); diff --git a/core/src/mindustry/world/modules/ConsumeModule.java b/core/src/mindustry/world/modules/ConsumeModule.java index 67fc49a881..fc1936be2a 100644 --- a/core/src/mindustry/world/modules/ConsumeModule.java +++ b/core/src/mindustry/world/modules/ConsumeModule.java @@ -26,8 +26,8 @@ public class ConsumeModule extends BlockModule{ } public void update(){ - //everything is valid here - if(entity.tile().isEnemyCheat()){ + //everything is valid when cheating + if(entity.cheating()){ valid = optionalValid = true; return; } diff --git a/core/src/mindustry/world/modules/LiquidModule.java b/core/src/mindustry/world/modules/LiquidModule.java index 192706cb93..067278df04 100644 --- a/core/src/mindustry/world/modules/LiquidModule.java +++ b/core/src/mindustry/world/modules/LiquidModule.java @@ -46,7 +46,7 @@ public class LiquidModule extends BlockModule{ return smoothLiquid; } - /** Returns total amount of liquids. */ + /** @return total amount of liquids. */ public float total(){ return total; } diff --git a/core/src/mindustry/world/modules/PowerModule.java b/core/src/mindustry/world/modules/PowerModule.java index ac503ab825..6f05f94304 100644 --- a/core/src/mindustry/world/modules/PowerModule.java +++ b/core/src/mindustry/world/modules/PowerModule.java @@ -1,6 +1,6 @@ package mindustry.world.modules; -import arc.struct.IntArray; +import arc.struct.IntSeq; import arc.util.io.*; import mindustry.world.blocks.power.PowerGraph; @@ -12,7 +12,7 @@ public class PowerModule extends BlockModule{ */ public float status = 0.0f; public PowerGraph graph = new PowerGraph(); - public IntArray links = new IntArray(); + public IntSeq links = new IntSeq(); @Override public void write(Writes write){ diff --git a/desktop/build.gradle b/desktop/build.gradle index 59b4a86ec1..3955380145 100644 --- a/desktop/build.gradle +++ b/desktop/build.gradle @@ -4,7 +4,6 @@ import com.badlogicgames.packr.PackrConfig import java.nio.ByteBuffer import java.security.MessageDigest -sourceCompatibility = 1.8 sourceSets.main.java.srcDirs = [ "src/" ] project.ext.mainClassName = "mindustry.desktop.DesktopLauncher" diff --git a/desktop/src/mindustry/desktop/DesktopLauncher.java b/desktop/src/mindustry/desktop/DesktopLauncher.java index 4fda014cac..ce8c3fb2bf 100644 --- a/desktop/src/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/mindustry/desktop/DesktopLauncher.java @@ -16,10 +16,10 @@ import mindustry.*; import mindustry.core.*; import mindustry.desktop.steam.*; import mindustry.game.EventType.*; -import mindustry.gen.*; import mindustry.net.*; import mindustry.net.Net.*; import mindustry.type.*; +import mindustry.gen.*; import java.io.*; import java.net.*; @@ -29,12 +29,10 @@ import static mindustry.Vars.*; public class DesktopLauncher extends ClientLauncher{ public final static String discordID = "610508934456934412"; - - boolean useDiscord = OS.is64Bit && !OS.hasProp("nodiscord"), loadError = false; + boolean useDiscord = OS.is64Bit && !OS.isARM && !OS.hasProp("nodiscord"), loadError = false; Throwable steamError; public static void main(String[] arg){ - try{ Vars.loadLogger(); new SdlApplication(new DesktopLauncher(arg), new SdlConfig(){{ @@ -53,18 +51,17 @@ public class DesktopLauncher extends ClientLauncher{ public DesktopLauncher(String[] args){ Version.init(); boolean useSteam = Version.modifier.contains("steam"); - testMobile = Array.with(args).contains("-testMobile"); + testMobile = Seq.with(args).contains("-testMobile"); if(useDiscord){ try{ - DiscordEventHandlers handlers = new DiscordEventHandlers(); - DiscordRPC.INSTANCE.Discord_Initialize(discordID, handlers, true, "1127400"); + DiscordRPC.INSTANCE.Discord_Initialize(discordID, null, true, "1127400"); Log.info("Initialized Discord rich presence."); - Runtime.getRuntime().addShutdownHook(new Thread(DiscordRPC.INSTANCE::Discord_Shutdown)); }catch(Throwable t){ useDiscord = false; - Log.err("Failed to initialize discord.", t); + Log.err("Failed to initialize discord. Enable debug logging for details."); + Log.debug("Discord init error: \n@\n", Strings.getStackTrace(t)); } } @@ -115,7 +112,7 @@ public class DesktopLauncher extends ClientLauncher{ loadError = true; Log.err(e); try(OutputStream s = new FileOutputStream(new File("steam-error-log-" + System.nanoTime() + ".txt"))){ - String log = Strings.parseException(e, true); + String log = Strings.neatError(e); s.write(log.getBytes()); }catch(Exception e2){ Log.err(e2); @@ -196,7 +193,7 @@ public class DesktopLauncher extends ClientLauncher{ } @Override - public Array getWorkshopContent(Class type){ + public Seq getWorkshopContent(Class type){ return !steam ? super.getWorkshopContent(type) : SVars.workshop.getWorkshopFiles(type); } diff --git a/desktop/src/mindustry/desktop/steam/SNet.java b/desktop/src/mindustry/desktop/steam/SNet.java index 00ba48b970..e264932666 100644 --- a/desktop/src/mindustry/desktop/steam/SNet.java +++ b/desktop/src/mindustry/desktop/steam/SNet.java @@ -160,7 +160,9 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, smat.addRequestLobbyListResultCountFilter(32); smat.requestLobbyList(); lobbyCallback = callback; - lobbyDoneCallback = done; + + //after the steam lobby is done discovering, look for local network servers. + lobbyDoneCallback = () -> provider.discoverServers(callback, done); } @Override @@ -298,7 +300,7 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, Log.info("found @ matches @", matches, lobbyDoneCallback); if(lobbyDoneCallback != null){ - Array hosts = new Array<>(); + Seq hosts = new Seq<>(); for(int i = 0; i < matches; i++){ try{ SteamID lobby = smat.getLobbyByIndex(i); diff --git a/desktop/src/mindustry/desktop/steam/SStats.java b/desktop/src/mindustry/desktop/steam/SStats.java index cc53717d10..4beb269bb5 100644 --- a/desktop/src/mindustry/desktop/steam/SStats.java +++ b/desktop/src/mindustry/desktop/steam/SStats.java @@ -93,7 +93,7 @@ public class SStats implements SteamUserStatsCallback{ }); Events.on(Trigger.newGame, () -> Core.app.post(() -> { - if(campaign() && player.closestCore() != null && player.closestCore().items().total() >= 10 * 1000){ + if(campaign() && player.core() != null && player.core().items().total() >= 10 * 1000){ drop10kitems.complete(); } })); diff --git a/desktop/src/mindustry/desktop/steam/SWorkshop.java b/desktop/src/mindustry/desktop/steam/SWorkshop.java index 9f064db597..8475d8d720 100644 --- a/desktop/src/mindustry/desktop/steam/SWorkshop.java +++ b/desktop/src/mindustry/desktop/steam/SWorkshop.java @@ -21,9 +21,9 @@ import static mindustry.Vars.*; public class SWorkshop implements SteamUGCCallback{ public final SteamUGC ugc = new SteamUGC(this); - private ObjectMap, Array> workshopFiles = new ObjectMap<>(); - private ObjectMap, SteamResult>> detailHandlers = new ObjectMap<>(); - private Array> itemHandlers = new Array<>(); + private ObjectMap, Seq> workshopFiles = new ObjectMap<>(); + private ObjectMap, SteamResult>> detailHandlers = new ObjectMap<>(); + private Seq> itemHandlers = new Seq<>(); private ObjectMap updatedHandlers = new ObjectMap<>(); public SWorkshop(){ @@ -32,7 +32,7 @@ public class SWorkshop implements SteamUGCCallback{ ItemInstallInfo info = new ItemInstallInfo(); ugc.getSubscribedItems(ids); - Array folders = Array.with(ids).map(f -> { + Seq folders = Seq.with(ids).map(f -> { ugc.getItemInstallInfo(f, info); return new Fi(info.getFolder()); }).select(f -> f != null && f.list().length > 0); @@ -50,8 +50,8 @@ public class SWorkshop implements SteamUGCCallback{ }); } - public Array getWorkshopFiles(Class type){ - return workshopFiles.get(type, () -> new Array<>(0)); + public Seq getWorkshopFiles(Class type){ + return workshopFiles.get(type, () -> new Seq<>(0)); } /** Publish a new item and submit an update for it. @@ -158,7 +158,7 @@ public class SWorkshop implements SteamUGCCallback{ ugc.setItemDescription(h, p.steamDescription()); } - Array tags = p.extraTags(); + Seq tags = p.extraTags(); tags.add(p.steamTag()); ugc.setItemTitle(h, p.steamTitle()); @@ -195,7 +195,7 @@ public class SWorkshop implements SteamUGCCallback{ dialog.show(); } - void query(SteamUGCQuery query, Cons2, SteamResult> handler){ + void query(SteamUGCQuery query, Cons2, SteamResult> handler){ Log.info("POST QUERY " + query); detailHandlers.put(query, handler); ugc.sendQueryUGCRequest(query); @@ -241,7 +241,7 @@ public class SWorkshop implements SteamUGCCallback{ Log.info("Query being handled..."); if(numResultsReturned > 0){ Log.info("@ q results", numResultsReturned); - Array details = new Array<>(); + Seq details = new Seq<>(); for(int i = 0; i < numResultsReturned; i++){ details.add(new SteamUGCDetails()); ugc.getQueryUGCResult(query, i, details.get(i)); @@ -249,7 +249,7 @@ public class SWorkshop implements SteamUGCCallback{ detailHandlers.get(query).get(details, result); }else{ Log.info("Nothing found."); - detailHandlers.get(query).get(new Array<>(), SteamResult.FileNotFound); + detailHandlers.get(query).get(new Seq<>(), SteamResult.FileNotFound); } detailHandlers.remove(query); diff --git a/gradle.properties b/gradle.properties index b326804b67..5cc5f35899 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=35b389b71386e7eb9bcffed7e61f015144fd182f +archash=23b2fc721fa7ebb52e2edb0ce72b87731050e76e diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4f0001d20..622ab64a3c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/ios/build.gradle b/ios/build.gradle index da9faeeb12..6faa19c97a 100644 --- a/ios/build.gradle +++ b/ios/build.gradle @@ -1,8 +1,5 @@ sourceSets.main.java.srcDirs = ["src/"] -sourceCompatibility = '1.8' -[compileJava, compileTestJava]*.options*.encoding = 'UTF-8' - ext{ mainClassName = "mindustry.ios.IOSLauncher" } diff --git a/ios/src/mindustry/ios/IOSLauncher.java b/ios/src/mindustry/ios/IOSLauncher.java index 4b43b1c305..b241e6f901 100644 --- a/ios/src/mindustry/ios/IOSLauncher.java +++ b/ios/src/mindustry/ios/IOSLauncher.java @@ -172,7 +172,7 @@ public class IOSLauncher extends IOSApplication.Delegate{ UINavigationController.attemptRotationToDeviceOrientation(); } }, new IOSApplicationConfiguration(){{ - //errorHandler = ModCrashHandler::handle; + }}); } diff --git a/server/build.gradle b/server/build.gradle index 9260ca6d3b..a62fb66121 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -1,4 +1,3 @@ -sourceCompatibility = 1.8 sourceSets.main.java.srcDirs = ["src/"] project.ext.mainClassName = "mindustry.server.ServerLauncher" diff --git a/server/src/mindustry/server/ServerControl.java b/server/src/mindustry/server/ServerControl.java index 96ea86692e..5fcb4ceece 100644 --- a/server/src/mindustry/server/ServerControl.java +++ b/server/src/mindustry/server/ServerControl.java @@ -3,7 +3,7 @@ package mindustry.server; import arc.*; import arc.files.*; import arc.struct.*; -import arc.struct.Array.*; +import arc.struct.Seq.*; import arc.util.ArcAnnotate.*; import arc.util.*; import arc.util.Timer; @@ -85,7 +85,7 @@ public class ServerControl implements ApplicationListener{ registerCommands(); Core.app.post(() -> { - Array commands = new Array<>(); + Seq commands = new Seq<>(); if(args.length > 0){ commands.addAll(Strings.join(" ", args).split(",")); @@ -134,7 +134,7 @@ public class ServerControl implements ApplicationListener{ } //set next map to be played - Map map = nextMapOverride != null ? nextMapOverride : maps.getNextMap(state.map); + Map map = nextMapOverride != null ? nextMapOverride : maps.getNextMap(lastMode, state.map); nextMapOverride = null; if(map != null){ Call.onInfoMessage((state.rules.pvp @@ -209,19 +209,6 @@ public class ServerControl implements ApplicationListener{ } if(lastTask != null) lastTask.cancel(); - - Map result; - if(arg.length > 0){ - result = maps.all().find(map -> map.name().equalsIgnoreCase(arg[0].replace('_', ' ')) || map.name().equalsIgnoreCase(arg[0])); - - if(result == null){ - err("No map with name &y'@'&lr found.", arg[0]); - return; - } - }else{ - result = maps.getShuffleMode().next(state.map); - info("Randomized next map to be @.", result.name()); - } Gamemode preset = Gamemode.survival; @@ -233,6 +220,19 @@ public class ServerControl implements ApplicationListener{ return; } } + + Map result; + if(arg.length > 0){ + result = maps.all().find(map -> map.name().equalsIgnoreCase(arg[0].replace('_', ' ')) || map.name().equalsIgnoreCase(arg[0])); + + if(result == null){ + err("No map with name &y'@'&lr found.", arg[0]); + return; + } + }else{ + result = maps.getShuffleMode().next(preset, state.map); + info("Randomized next map to be @.", result.name()); + } info("Loading map..."); @@ -616,7 +616,7 @@ public class ServerControl implements ApplicationListener{ }); handler.register("bans", "List all banned IPs and IDs.", arg -> { - Array bans = netServer.admins.getBanned(); + Seq bans = netServer.admins.getBanned(); if(bans.size == 0){ info("No ID-banned players have been found."); @@ -627,7 +627,7 @@ public class ServerControl implements ApplicationListener{ } } - Array ipbans = netServer.admins.getBannedIPs(); + Seq ipbans = netServer.admins.getBannedIPs(); if(ipbans.size == 0){ info("No IP-banned players have been found."); @@ -699,7 +699,7 @@ public class ServerControl implements ApplicationListener{ }); handler.register("admins", "List all admins.", arg -> { - Array admins = netServer.admins.getAdmins(); + Seq admins = netServer.admins.getAdmins(); if(admins.size == 0){ info("No admins have been found."); @@ -879,7 +879,7 @@ public class ServerControl implements ApplicationListener{ private void play(boolean wait, Runnable run){ inExtraRound = true; Runnable r = () -> { - Array players = new Array<>(); + Seq players = new Seq<>(); for(Playerc p : Groups.player){ players.add(p); p.clearUnit(); @@ -897,7 +897,7 @@ public class ServerControl implements ApplicationListener{ p.reset(); if(state.rules.pvp){ - p.team(netServer.assignTeam(p, new ArrayIterable<>(players))); + p.team(netServer.assignTeam(p, new SeqIterable<>(players))); } netServer.sendWorldData(p); } diff --git a/settings.gradle b/settings.gradle index 5cec16025f..6883be3f0d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,7 +1,3 @@ -if(JavaVersion.current() != JavaVersion.VERSION_1_8){ - throw new GradleException("!!! YOU MUST USE JAVA 8 TO COMPILE AND RUN MINDUSTRY !!! Read the README. Your version: ${System.properties["java.version"]}") -} - include 'desktop', 'core', 'server', 'ios', 'annotations', 'tools', 'tests' def use = { ... names -> diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index 6cfc6bf7cf..1afcce5fa3 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -369,7 +369,7 @@ public class ApplicationTests{ world.tile(0, 0).setBlock(Blocks.itemSource); world.tile(0, 0).entity.configureAny(Items.copper); - Array entities = Array.with(world.tile(0, 0).entity); + Seq entities = Seq.with(world.tile(0, 0).entity); for(int i = 0; i < length; i++){ world.tile(i + 1, 0).setBlock(Blocks.conveyor); @@ -429,13 +429,13 @@ public class ApplicationTests{ @Test void arrayIterators(){ - Array arr = Array.with("a", "b" , "c", "d", "e", "f"); - Array results = new Array<>(); + Seq arr = Seq.with("a", "b" , "c", "d", "e", "f"); + Seq results = new Seq<>(); for(String s : arr); for(String s : results); - Array.iteratorsAllocated = 0; + Seq.iteratorsAllocated = 0; //simulate non-enhanced for loops, which should be correct @@ -455,7 +455,7 @@ public class ApplicationTests{ } assertEquals(results.size, index); - assertEquals(0, Array.iteratorsAllocated, "No new iterators must have been allocated."); + assertEquals(0, Seq.iteratorsAllocated, "No new iterators must have been allocated."); } @Test @@ -492,8 +492,8 @@ public class ApplicationTests{ d1.set(0f, 0f); d2.set(20f, 20f); - d1.addBuild(new BuildRequest(0, 0, 0, Blocks.copperWallLarge)); - d2.addBuild(new BuildRequest(1, 1, 0, Blocks.copperWallLarge)); + d1.addBuild(new BuildPlan(0, 0, 0, Blocks.copperWallLarge)); + d2.addBuild(new BuildPlan(1, 1, 0, Blocks.copperWallLarge)); d1.update(); d2.update(); @@ -514,8 +514,8 @@ public class ApplicationTests{ d1.set(10f, 20f); d2.set(10f, 20f); - d1.addBuild(new BuildRequest(0, 0, 0, Blocks.copperWallLarge)); - d2.addBuild(new BuildRequest(1, 1)); + d1.addBuild(new BuildPlan(0, 0, 0, Blocks.copperWallLarge)); + d2.addBuild(new BuildPlan(1, 1)); Time.setDeltaProvider(() -> 3f); d1.update(); @@ -532,7 +532,7 @@ public class ApplicationTests{ assertEquals(Blocks.copperWallLarge, world.tile(1, 1).block()); d2.clearBuilding(); - d2.addBuild(new BuildRequest(1, 1)); + d2.addBuild(new BuildPlan(1, 1)); d2.update(); assertEquals(Blocks.air, world.tile(0, 0).block()); @@ -542,7 +542,7 @@ public class ApplicationTests{ @Test void allBlockTest(){ - Tiles tiles = world.resize(256*2 + 20, 10); + Tiles tiles = world.resize(256*3 + 20, 10); world.beginMapLoad(); for(int x = 0; x < tiles.width; x++){ diff --git a/tests/src/test/java/IOTests.java b/tests/src/test/java/IOTests.java index 47b1e42e64..e44270e9c2 100644 --- a/tests/src/test/java/IOTests.java +++ b/tests/src/test/java/IOTests.java @@ -10,11 +10,6 @@ import static org.junit.jupiter.api.Assertions.*; public class IOTests{ - @Test - void writeEntities(){ - //TODO - } - @Test void writeEnglish(){ ByteBuffer buffer = ByteBuffer.allocate(500); diff --git a/tests/src/test/java/SectorTests.java b/tests/src/test/java/SectorTests.java index 68cb6793c7..1cad120b64 100644 --- a/tests/src/test/java/SectorTests.java +++ b/tests/src/test/java/SectorTests.java @@ -30,7 +30,7 @@ public class SectorTests{ @TestFactory DynamicTest[] testZoneValidity(){ - Array out = new Array<>(); + Seq out = new Seq<>(); if(world == null) world = new World(); for(SectorPreset zone : content.sectors()){ @@ -57,15 +57,19 @@ public class SectorTests{ } } - Array spawns = state.rules.spawns; + Seq spawns = state.rules.spawns; int bossWave = 0; - outer: - for(int i = 1; i <= 1000; i++){ - for(SpawnGroup spawn : spawns){ - if(spawn.effect == StatusEffects.boss && spawn.getUnitsSpawned(i) > 0){ - bossWave = i; - break outer; + if(state.rules.winWave > 0){ + bossWave = state.rules.winWave; + }else{ + outer: + for(int i = 1; i <= 1000; i++){ + for(SpawnGroup spawn : spawns){ + if(spawn.effect == StatusEffects.boss && spawn.getUnitsSpawned(i) > 0){ + bossWave = i; + break outer; + } } } } diff --git a/tools/build.gradle b/tools/build.gradle index baa2953413..3b246be80d 100644 --- a/tools/build.gradle +++ b/tools/build.gradle @@ -1,9 +1,9 @@ -sourceCompatibility = 1.8 sourceSets.main.java.srcDirs = ["src/"] import arc.struct.* import arc.graphics.* import arc.packer.* +import arc.util.Tmp import javax.imageio.ImageIO import java.awt.* @@ -33,7 +33,7 @@ def transformColors = { List> list -> //d4816b -transformColors([["a387ea", "8a73c6", "5c5e9f"], ["6e7080", "989aa4", "b0bac0"], ["bc5452", "ea8878", "feb380"], ["de9458", "f8c266", "ffe18f"], ["feb380", "ea8878", "bc5452"]]) +transformColors([["a387ea", "8a73c6", "5c5e9f"], ["6e7080", "989aa4", "b0bac0"], ["bc5452", "ea8878", "feb380"], ["de9458", "f8c266", "ffe18f"], ["feb380", "ea8878", "bc5452"], ["d4816b", "eab678", "ffd37f"]]) def antialias = { File file -> if(!doAntialias) return @@ -114,7 +114,7 @@ def medianBlur = { File file -> def image = ImageIO.read(file) def result = new BufferedImage(image.width, image.height, BufferedImage.TYPE_INT_ARGB) def radius = 4 - IntArray array = new IntArray() + IntSeq array = new IntSeq() def getRGB = { int ix, int iy -> return image.getRGB(Math.max(Math.min(ix, image.width - 1), 0), Math.max(Math.min(iy, image.height - 1), 0)) @@ -234,25 +234,30 @@ task swapColors(){ def carr = new File(getProperty("colors")).text.split("\n") def map = [:] def swaps = 0 - carr.each{ str -> map[Color.argb8888(Color.valueOf(str.split("=")[0]))] = Color.argb8888(Color.valueOf(str.split("=")[1])) } + carr.each{ str -> map[Color.valueOf(str.split("=")[0]).argb8888()] = Color.valueOf(str.split("=")[1]).argb8888() } def tmpc = new Color() fileTree(dir: '../core/assets-raw/sprites', include: "**/*.png").visit{ file -> if(file.isDirectory()) return - swaps++ + + boolean found = false def img = ImageIO.read(file.file) for(x in (0..img.getWidth() - 1)){ for(y in (0..img.getHeight() - 1)){ def c = img.getRGB(x, y) - Color.argb8888ToColor(tmpc, c) + tmpc.argb8888(c) if(tmpc.a < 0.1f) continue if(map.containsKey(c)){ img.setRGB(x, y, (int)map.get(c)) + found = true } } } - ImageIO.write(img, "png", file.file) + if(found){ + swaps++ + ImageIO.write(img, "png", file.file) + } } println "Swapped $swaps images." }else{ @@ -261,6 +266,35 @@ task swapColors(){ } } +task genPalette(){ + doLast{ + def total = 0 + def size = 32 + def outImage = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB) + def colorsUsed = new IntSet() + + fileTree(dir: '../core/assets-raw/sprites/blocks', include: "**/*.png").visit{ file -> + if(file.isDirectory()) return + + def img = ImageIO.read(file.file) + for(x in (0..img.getWidth() - 1)){ + for(y in (0..img.getHeight() - 1)){ + def c = img.getRGB(x, y) + + if(Tmp.c1.argb8888(c).a > 0.999f && colorsUsed.add(c)){ + outImage.setRGB((int)(total / size), total % size, c) + total ++ + } + } + } + } + + ImageIO.write(outImage, "png", new File("palette.png")) + println "Found $total colors." + + } +} + task antialiasImages(){ doLast{ for(def img : project.getProperty("images").split(",")){ @@ -337,8 +371,20 @@ task pack(dependsOn: classes){ e.printStackTrace() } + println("\n\nPacking normal 4096 sprites...\n\n") + //pack normal sprites TexturePacker.process("core/assets-raw/sprites_out/", "core/assets/sprites/", "sprites.atlas") + + println("\n\nPacking fallback 2048 sprites...\n\n") + + //replace config file contents + fileTree(dir: '../core/assets-raw/sprites_out/', include: "**/*.json").visit{ file -> + if(!file.isDirectory()) file.file.text = file.file.text.replace("4096", "2048") + } + + //pack fallback 2048x2048 sprites + TexturePacker.process("core/assets-raw/sprites_out/", "core/assets/sprites/fallback/", "sprites.atlas") } } diff --git a/tools/src/mindustry/tools/BundleLauncher.java b/tools/src/mindustry/tools/BundleLauncher.java index a52ea5fb31..fe1484175a 100644 --- a/tools/src/mindustry/tools/BundleLauncher.java +++ b/tools/src/mindustry/tools/BundleLauncher.java @@ -11,9 +11,9 @@ public class BundleLauncher{ public static void main(String[] args){ OrderedMap base = new OrderedMap<>(); PropertiesUtils.load(base, Fi.get("bundle.properties").reader()); - Array removals = new Array<>(); + Seq removals = new Seq<>(); String str = Fi.get("bundle.properties").readString(); - ObjectSet newlines = Array.with(str.split("\n")).select(l -> l.contains(" = ") && str.indexOf(l) + l.length() < str.length() - 2 && str.charAt(str.indexOf(l) + l.length() + 1) == '\n').map(l -> l.split(" = ")[0]).asSet(); + ObjectSet newlines = Seq.with(str.split("\n")).select(l -> l.contains(" = ") && str.indexOf(l) + l.length() < str.length() - 2 && str.charAt(str.indexOf(l) + l.length() + 1) == '\n').map(l -> l.split(" = ")[0]).asSet(); Fi.get(".").walk(child -> { if(child.name().equals("bundle.properties") || child.toString().contains("output")) return; diff --git a/tools/src/mindustry/tools/Edgifier.java b/tools/src/mindustry/tools/Edgifier.java index abbd649281..f83694d13a 100644 --- a/tools/src/mindustry/tools/Edgifier.java +++ b/tools/src/mindustry/tools/Edgifier.java @@ -17,7 +17,7 @@ public class Edgifier{ private static Pixmap edgify(Pixmap in, int chunk){ Pixmap out = new Pixmap(in.getWidth(), in.getHeight()); - IntArray side1 = new IntArray(), side2 = new IntArray(); + IntSeq side1 = new IntSeq(), side2 = new IntSeq(); for(int x = 0; x < in.getWidth(); x += chunk){ for(int y = 0; y < in.getHeight(); y += chunk){ diff --git a/tools/src/mindustry/tools/Generators.java b/tools/src/mindustry/tools/Generators.java index 7efaa8ef76..46bae59da6 100644 --- a/tools/src/mindustry/tools/Generators.java +++ b/tools/src/mindustry/tools/Generators.java @@ -9,13 +9,16 @@ import arc.struct.*; import arc.util.*; import arc.util.noise.*; import mindustry.ctype.*; +import mindustry.game.*; import mindustry.gen.*; import mindustry.graphics.*; import mindustry.tools.ImagePacker.*; import mindustry.type.*; import mindustry.ui.*; import mindustry.world.*; +import mindustry.world.blocks.*; import mindustry.world.blocks.environment.*; +import mindustry.world.blocks.legacy.*; import static mindustry.Vars.*; @@ -99,10 +102,13 @@ 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; + + block.load(); + TextureRegion[] regions = block.getGeneratedIcons(); if(block instanceof Floor){ - block.load(); for(TextureRegion region : block.variantRegions()){ GenRegion gen = (GenRegion)region; if(gen.path == null) continue; @@ -110,6 +116,28 @@ public class Generators{ } } + Image shardTeamTop = null; + + if(block.teamRegion.found()){ + Image teamr = ImagePacker.get(block.teamRegion); + + for(Team team : Team.all){ + if(team.hasPalette){ + Image out = new Image(teamr.width, teamr.height); + teamr.each((x, y) -> { + int color = teamr.getColor(x, y).rgba8888(); + int index = color == 0xffffffff ? 0 : color == 0xdcc6c6ff ? 1 : color == 0x9d7f7fff ? 2 : -1; + out.draw(x, y, index == -1 ? teamr.getColor(x, y) : team.palette[index]); + }); + out.save(block.name + "-team-" + team.name); + + if(team == Team.sharded){ + shardTeamTop = out; + } + } + } + } + if(regions.length == 0){ continue; } @@ -159,9 +187,14 @@ public class Generators{ }else{ image.draw(last); } + + //draw shard (default team top) on top of first sprite + if(i == 1 && shardTeamTop != null){ + image.draw(shardTeamTop); + } } - if(!(regions.length == 1 && regions[0] == Core.atlas.find(block.name))){ + if(!(regions.length == 1 && regions[0] == Core.atlas.find(block.name) && shardTeamTop == null)){ image.save("block-" + block.name + "-full"); } @@ -195,10 +228,8 @@ public class Generators{ //encode square sprite in alpha channel average.a = hasEmpty ? 0.1f : 1f; colors.draw(block.id, 0, average); - }catch(IllegalArgumentException e){ - Log.info("Skipping &ly'@'", block.name); }catch(NullPointerException e){ - Log.err("Block &ly'@'&lr has an null region!"); + Log.err("Block &ly'@'&lr has an null region!", block); } } @@ -229,7 +260,7 @@ public class Generators{ }); ImagePacker.generate("item-icons", () -> { - for(UnlockableContent item : (Array)(Array)Array.withArrays(content.items(), content.liquids())){ + for(UnlockableContent item : Seq.withArrays(content.items(), content.liquids())){ Image base = ImagePacker.get(item.getContentType().name() + "-" + item.name); for(Cicon icon : Cicon.scaled){ //if(icon.size == base.width) continue; @@ -244,45 +275,55 @@ public class Generators{ } }); - ImagePacker.generate("unit-icons", () -> { - content.units().each(type -> { - type.load(); - try{ + ImagePacker.generate("unit-icons", () -> content.units().each(type -> { + if(type.isHidden()) return; //hidden units don't generate - Image image = ImagePacker.get(type.region); + type.load(); - if(type.constructor.get() instanceof Mechc){ - image.drawCenter(type.baseRegion); - image.drawCenter(type.legRegion); - image.drawCenter(type.legRegion, true, false); - } - image.draw(type.region); + 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); + } - Image baseCell = ImagePacker.get(type.cellRegion); - Image cell = new Image(type.cellRegion.getWidth(), type.cellRegion.getHeight()); - cell.each((x, y) -> cell.draw(x, y, baseCell.getColor(x, y).mul(Color.valueOf("ffa665")))); + if(type.constructor.get() instanceof Mechc){ + image.drawCenter(type.baseRegion); + image.drawCenter(type.legRegion); + image.drawCenter(type.legRegion, true, false); + image.draw(type.region); + } - image.draw(cell, image.width / 2 - cell.width / 2, image.height / 2 - cell.height / 2); + 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])); + } - for(Weapon weapon : type.weapons){ - weapon.load(); + if(type.parts > 0){ + image.save(type.name + "-cell"); + } - for(int i : (weapon.mirror ? Mathf.signs : Mathf.one)){ - i *= Mathf.sign(weapon.flipped); + Image cell = new Image(type.cellRegion.getWidth(), type.cellRegion.getHeight()); + cell.each((x, y) -> cell.draw(x, y, baseCell.getColor(x, y).mul(Color.valueOf("ffa665")))); - image.draw(weapon.region, - (int)(i * weapon.x / Draw.scl + image.width / 2 - weapon.region.getWidth() / 2), - (int)(-weapon.y / Draw.scl + image.height / 2f - weapon.region.getHeight() / 2f), - i > 0, false); - } - } + image.draw(cell, image.width / 2 - cell.width / 2, image.height / 2 - cell.height / 2); - image.save("unit-" + type.name + "-full"); - }catch(IllegalArgumentException ignored){ - //skip + for(Weapon weapon : type.weapons){ + weapon.load(); + + for(int i : (weapon.mirror ? Mathf.signs : Mathf.one)){ + i *= Mathf.sign(weapon.flipped); + + image.draw(weapon.region, + (int)(i * weapon.x / Draw.scl + image.width / 2 - weapon.region.getWidth() / 2), + (int)(-weapon.y / Draw.scl + image.height / 2f - weapon.region.getHeight() / 2f), + i > 0, false); } - }); - }); + } + + image.save("unit-" + type.name + "-full"); + })); ImagePacker.generate("ore-icons", () -> { content.blocks().each(b -> b instanceof OreBlock, ore -> { @@ -329,7 +370,7 @@ public class Generators{ } try{ - Image image = gens.get(floor, ImagePacker.get(floor.generateIcons()[0])); + Image image = gens.get(floor, ImagePacker.get(floor.getGeneratedIcons()[0])); Image edge = ImagePacker.get("edge-stencil"); Image result = new Image(edge.width, edge.height); diff --git a/tools/src/mindustry/tools/ImagePacker.java b/tools/src/mindustry/tools/ImagePacker.java index 38754c0935..dbe8413657 100644 --- a/tools/src/mindustry/tools/ImagePacker.java +++ b/tools/src/mindustry/tools/ImagePacker.java @@ -86,6 +86,14 @@ public class ImagePacker{ return (AtlasRegion)regionCache.get(name); } + @Override + public AtlasRegion find(String name, String def){ + if(!regionCache.containsKey(name)){ + return (AtlasRegion)regionCache.get(def); + } + return (AtlasRegion)regionCache.get(name); + } + @Override public boolean has(String s){ return regionCache.containsKey(s); @@ -109,7 +117,7 @@ public class ImagePacker{ ObjectMap content2id = new ObjectMap<>(); map.each((key, val) -> content2id.put(val.split("\\|")[0], key)); - Array cont = Array.withArrays(Vars.content.blocks(), Vars.content.items(), Vars.content.liquids()); + Seq cont = Seq.withArrays(Vars.content.blocks(), Vars.content.items(), Vars.content.liquids()); cont.removeAll(u -> u instanceof BuildBlock || u == Blocks.air); int minid = 0xF8FF; @@ -179,6 +187,11 @@ public class ImagePacker{ this.path = path; } + @Override + public boolean found(){ + return !invalid; + } + static void validate(TextureRegion region){ if(((GenRegion)region).invalid){ ImagePacker.err("Region does not exist: @", ((GenRegion)region).name); diff --git a/tools/src/mindustry/tools/ScriptStubGenerator.java b/tools/src/mindustry/tools/ScriptStubGenerator.java index 50426ec79f..560047b112 100644 --- a/tools/src/mindustry/tools/ScriptStubGenerator.java +++ b/tools/src/mindustry/tools/ScriptStubGenerator.java @@ -1,7 +1,7 @@ package mindustry.tools; import arc.*; -import arc.struct.Array; +import arc.struct.Seq; import arc.struct.*; import arc.files.*; import arc.graphics.*; @@ -23,13 +23,13 @@ public class ScriptStubGenerator{ public static void main(String[] args) throws Exception{ String base = "mindustry"; - Array blacklist = Array.with("plugin", "mod", "net", "io", "tools"); - Array nameBlacklist = Array.with("ClassAccess"); - Array> whitelist = Array.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, + Seq blacklist = Seq.with("plugin", "mod", "net", "io", "tools"); + Seq nameBlacklist = Seq.with("ClassAccess"); + Seq> whitelist = Seq.with(Draw.class, Fill.class, Lines.class, Core.class, TextureAtlas.class, TextureRegion.class, Time.class, System.class, PrintStream.class, AtlasRegion.class, String.class, Mathf.class, Angles.class, Color.class, Runnable.class, Object.class, Icon.class, Tex.class, Sounds.class, Musics.class, Call.class, Texture.class, TextureData.class, Pixmap.class, I18NBundle.class, Interval.class, DataInput.class, DataOutput.class, DataInputStream.class, DataOutputStream.class, Integer.class, Float.class, Double.class, Long.class, Boolean.class, Short.class, Byte.class, Character.class); - Array nopackage = Array.with("java.lang", "java"); + Seq nopackage = Seq.with("java.lang", "java"); List classLoadersList = new LinkedList<>(); classLoadersList.add(ClasspathHelper.contextClassLoader()); @@ -46,7 +46,7 @@ public class ScriptStubGenerator{ .include(FilterBuilder.prefix("arc.math")) )); - Array> classes = Array.with(reflections.getSubTypesOf(Object.class)); + Seq> classes = Seq.with(reflections.getSubTypesOf(Object.class)); classes.addAll(reflections.getSubTypesOf(Enum.class)); classes.addAll(whitelist); classes.sort(Structs.comparing(Class::getName)); diff --git a/tools/src/mindustry/tools/SectorDataGenerator.java b/tools/src/mindustry/tools/SectorDataGenerator.java index 144734f6b0..e0c4828280 100644 --- a/tools/src/mindustry/tools/SectorDataGenerator.java +++ b/tools/src/mindustry/tools/SectorDataGenerator.java @@ -1,9 +1,11 @@ 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.*; @@ -26,6 +28,7 @@ public class SectorDataGenerator{ Core.files = new MockFiles(); Core.app = new MockApplication(); Core.settings = new MockSettings(); + Core.graphics = new MockGraphics(); headless = true; net = new Net(null); @@ -45,7 +48,7 @@ public class SectorDataGenerator{ Fi fi = Fi.get("planets").child(planet.name + ".dat"); - Array list = planet.sectors.map(sector -> { + Seq list = planet.sectors.map(sector -> { SectorData data = new SectorData(); ObjectIntMap floors = new ObjectIntMap<>(); @@ -105,7 +108,7 @@ public class SectorDataGenerator{ } //sort counts in descending order - Array> entries = floors.entries().toArray(); + Seq> entries = floors.entries().toArray(); entries.sort(e -> -e.value); //remove all blocks occuring < 30 times - unimportant entries.removeAll(e -> e.value < 30); @@ -120,6 +123,7 @@ public class SectorDataGenerator{ //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"); if(hasSnow){ data.attributes |= (1 << SectorAttribute.snowy.ordinal()); @@ -129,6 +133,10 @@ public class SectorDataGenerator{ data.attributes |= (1 << SectorAttribute.rainy.ordinal()); } + if(hasDesert){ + data.attributes |= (1 << SectorAttribute.desert.ordinal()); + } + data.resources = content.asArray().sort(Structs.comps(Structs.comparing(Content::getContentType), Structs.comparingInt(c -> c.id))).toArray(UnlockableContent.class); //50% water -> naval attribute