diff --git a/README.md b/README.md index 279de729a6..562f645c4f 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,11 @@ A sandbox tower defense game written in Java. _[Trello Board](https://trello.com/b/aE2tcUwF/mindustry-40-plans)_ -_[Wiki](http://mindustry.wikia.com/wiki/Mindustry_Wiki)_ +_[Wiki](https://mindustrygame.github.io/wiki)_ ### Building -Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://jenkins.hellomouse.net/job/mindustry/). +Bleeding-edge live builds are generated automatically for every commit. You can see them [here](https://github.com/Anuken/MindustryBuilds/releases). Old builds might still be on [jenkins](https://jenkins.hellomouse.net/job/mindustry/). If you'd rather compile on your own, follow these instructions. First, make sure you have Java 8 and JDK 8 installed. Open a terminal in the root directory, `cd` to the Mindustry folder and run the following commands: diff --git a/annotations/src/main/java/io/anuke/annotations/Annotations.java b/annotations/src/main/java/io/anuke/annotations/Annotations.java index e7afef4f9a..6ee59964e9 100644 --- a/annotations/src/main/java/io/anuke/annotations/Annotations.java +++ b/annotations/src/main/java/io/anuke/annotations/Annotations.java @@ -22,20 +22,6 @@ public class Annotations{ public @interface OverrideCallSuper { } - /** Indicates that a method return or field can be null.*/ - @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE}) - @Retention(RetentionPolicy.SOURCE) - public @interface Nullable{ - - } - - /** Indicates that a method return or field cannot be null.*/ - @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE}) - @Retention(RetentionPolicy.SOURCE) - public @interface NonNull{ - - } - /** Marks a class as serializable. */ @Target(ElementType.TYPE) @Retention(RetentionPolicy.SOURCE) diff --git a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java index 9dc159405d..31b213d8ba 100644 --- a/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/AssetsAnnotationProcessor.java @@ -139,7 +139,7 @@ public class AssetsAnnotationProcessor extends AbstractProcessor{ loadBegin.addStatement("io.anuke.arc.Core.assets.load("+filename +", "+rtype+".class).loaded = a -> " + name + " = ("+rtype+")a", filepath, filepath.replace(".ogg", ".mp3")); - dispose.addStatement(name + ".dispose()"); + dispose.addStatement("io.anuke.arc.Core.assets.unload(" + filename + ")"); dispose.addStatement(name + " = null"); type.addField(FieldSpec.builder(ClassName.bestGuess(rtype), name, Modifier.STATIC, Modifier.PUBLIC).initializer("new io.anuke.arc.audio.mock.Mock" + rtype.substring(rtype.lastIndexOf(".") + 1)+ "()").build()); }); diff --git a/annotations/src/main/java/io/anuke/annotations/CallSuperAnnotationProcessor.java b/annotations/src/main/java/io/anuke/annotations/CallSuperAnnotationProcessor.java index 1bdc75c786..1a0102a793 100644 --- a/annotations/src/main/java/io/anuke/annotations/CallSuperAnnotationProcessor.java +++ b/annotations/src/main/java/io/anuke/annotations/CallSuperAnnotationProcessor.java @@ -1,32 +1,29 @@ package io.anuke.annotations; -import com.sun.source.util.TreePath; -import com.sun.source.util.Trees; -import com.sun.tools.javac.tree.JCTree; -import com.sun.tools.javac.tree.JCTree.JCExpressionStatement; -import io.anuke.annotations.Annotations.OverrideCallSuper; +import com.sun.source.util.*; +import com.sun.tools.javac.tree.*; +import com.sun.tools.javac.tree.JCTree.*; +import io.anuke.annotations.Annotations.*; import javax.annotation.processing.*; -import javax.lang.model.SourceVersion; -import javax.lang.model.element.Element; -import javax.lang.model.element.TypeElement; -import javax.tools.Diagnostic.Kind; -import java.util.List; -import java.util.Set; +import javax.lang.model.*; +import javax.lang.model.element.*; +import javax.tools.Diagnostic.*; +import java.util.*; -@SupportedAnnotationTypes("java.lang.Override") +@SupportedAnnotationTypes({"java.lang.Override"}) public class CallSuperAnnotationProcessor extends AbstractProcessor{ private Trees trees; @Override - public void init (ProcessingEnvironment pe) { + public void init(ProcessingEnvironment pe){ super.init(pe); trees = Trees.instance(pe); } - public boolean process (Set annotations, RoundEnvironment roundEnv) { - for (Element e : roundEnv.getElementsAnnotatedWith(Override.class)) { - if (e.getAnnotation(OverrideCallSuper.class) != null) return false; + public boolean process(Set annotations, RoundEnvironment roundEnv){ + for(Element e : roundEnv.getElementsAnnotatedWith(Override.class)){ + if(e.getAnnotation(OverrideCallSuper.class) != null) return false; CodeAnalyzerTreeScanner codeScanner = new CodeAnalyzerTreeScanner(); codeScanner.setMethodName(e.getSimpleName().toString()); @@ -34,10 +31,10 @@ public class CallSuperAnnotationProcessor extends AbstractProcessor{ TreePath tp = trees.getPath(e.getEnclosingElement()); codeScanner.scan(tp, trees); - if (codeScanner.isCallSuperUsed()) { + if(codeScanner.isCallSuperUsed()){ List list = codeScanner.getMethod().getBody().getStatements(); - if (!doesCallSuper(list, codeScanner.getMethodName())) { + if(!doesCallSuper(list, codeScanner.getMethodName())){ processingEnv.getMessager().printMessage(Kind.ERROR, "Overriding method '" + codeScanner.getMethodName() + "' must explicitly call super method from its parent class.", e); } } @@ -46,12 +43,12 @@ public class CallSuperAnnotationProcessor extends AbstractProcessor{ return false; } - private boolean doesCallSuper (List list, String methodName) { - for (Object object : list) { - if (object instanceof JCTree.JCExpressionStatement) { - JCTree.JCExpressionStatement expr = (JCExpressionStatement) object; + private boolean doesCallSuper(List list, String methodName){ + for(Object object : list){ + if(object instanceof JCTree.JCExpressionStatement){ + JCTree.JCExpressionStatement expr = (JCExpressionStatement)object; String exprString = expr.toString(); - if (exprString.startsWith("super." + methodName) && exprString.endsWith(");")) return true; + if(exprString.startsWith("super." + methodName) && exprString.endsWith(");")) return true; } } @@ -59,7 +56,7 @@ public class CallSuperAnnotationProcessor extends AbstractProcessor{ } @Override - public SourceVersion getSupportedSourceVersion () { + public SourceVersion getSupportedSourceVersion(){ return SourceVersion.RELEASE_8; } } diff --git a/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.9.png b/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.9.png deleted file mode 100644 index 7a3bac9b10..0000000000 Binary files a/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.png b/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.png new file mode 100644 index 0000000000..b5056d235a Binary files /dev/null and b/core/assets-raw/sprites/ui/scroll-knob-horizontal-black.png differ diff --git a/core/assets-raw/sprites/ui/scroll-knob-vertical-black.9.png b/core/assets-raw/sprites/ui/scroll-knob-vertical-black.9.png deleted file mode 100644 index 17d9dcf726..0000000000 Binary files a/core/assets-raw/sprites/ui/scroll-knob-vertical-black.9.png and /dev/null differ diff --git a/core/assets-raw/sprites/ui/scroll-knob-vertical-black.png b/core/assets-raw/sprites/ui/scroll-knob-vertical-black.png new file mode 100644 index 0000000000..1d1f180358 Binary files /dev/null and b/core/assets-raw/sprites/ui/scroll-knob-vertical-black.png differ diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 8805c5f2fb..650e4c293e 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -22,6 +22,7 @@ load.map = Maps load.image = Images load.content = Content load.system = System +load.mod = Mods stat.wave = Waves Defeated:[accent] {0} stat.enemiesDestroyed = Enemies Destroyed:[accent] {0} @@ -32,6 +33,7 @@ stat.delivered = Resources Launched: stat.rank = Final Rank: [accent]{0} launcheditems = [accent]Launched Items +launchinfo = [unlaunched][[LAUNCH] your core to obtain the items indicated in blue. map.delete = Are you sure you want to delete the map "[accent]{0}[]"? level.highscore = High Score: [accent]{0} level.select = Level Select @@ -64,6 +66,24 @@ uploadingpreviewfile = Uploading Preview File committingchanges = Comitting Changes done = Done +mods.alphainfo = Keep in mind that mods are in alpha, and[scarlet] may be very buggy[].\nReport any issues you find to the Mindustry Github or Discord. +mods.alpha = [accent](Alpha) +mods = Mods +mods.none = [LIGHT_GRAY]No mods found! +mods.guide = Modding Guide +mods.report = Report Bug +mod.enabled = [lightgray]Enabled +mod.disabled = [scarlet]Disabled +mod.disable = Disable +mod.enable = Enable +mod.requiresrestart = The game will now close to apply the mod changes. +mod.reloadrequired = [scarlet]Reload Required +mod.import = Import Mod +mod.import.github = Import Github Mod +mod.remove.confirm = This mod will be deleted. +mod.author = [LIGHT_GRAY]Author:[] {0} +mod.missing = This save contains mods that you have recently updated or no longer have installed. Save corruption may occur. Are you sure you want to load it?\n[lightgray]Mods:\n{0} + about.button = About name = Name: noname = Pick a[accent] player name[] first. @@ -164,7 +184,7 @@ save.rename.text = New name: selectslot = Select a save. slot = [accent]Slot {0} editmessage = Edit Message -save.corrupted = [accent]Save file corrupted or invalid!\nIf you have just updated your game, this is probably a change in the save format and [scarlet]not[] a bug. +save.corrupted = Save file corrupted or invalid! empty = on = On off = Off @@ -178,6 +198,7 @@ warning = Warning. confirm = Confirm delete = Delete view.workshop = View In Workshop +workshop.listing = Edit Workshop Listing ok = OK open = Open customize = Customize Rules @@ -195,6 +216,7 @@ classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic quit.confirm = Are you sure you want to quit? quit.confirm.tutorial = Are you sure you know what you're doing?\nThe tutorial can be re-taken in[accent] Settings->Game->Re-Take Tutorial.[] loading = [accent]Loading... +reloading = [accent]Reloading Mods... saving = [accent]Saving... wave = [accent]Wave {0} wave.waiting = [lightgray]Wave in {0} @@ -215,7 +237,12 @@ map.nospawn.pvp = This map does not have any enemy cores for player to spawn int map.nospawn.attack = This map does not have any enemy cores for player to attack! Add[SCARLET] red[] cores to this map in the editor. map.invalid = Error loading map: corrupted or invalid map file. map.publish.error = Error publishing map: {0} +map.update = Update Map +map.load.error = Error fetching workshop details: {0} +map.missing = This map has been deleted or moved.\n[lightgray]The workshop listing has now been automatically un-linked from the map. map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up! +map.menu = Select what you would like to do with this map. +map.changelog = Changelog (optional): eula = Steam EULA map.publish = Map published. map.publishing = [accent]Publishing map... @@ -440,8 +467,6 @@ settings.graphics = Graphics settings.cleardata = Clear Game Data... settings.clear.confirm = Are you sure you want to clear this data?\nWhat is done cannot be undone! settings.clearall.confirm = [scarlet]WARNING![]\nThis will clear all data, including saves, maps, unlocks and keybinds.\nOnce you press 'ok' the game will wipe all data and automatically exit. -settings.clearunlocks = Clear Unlocks -settings.clearall = Clear All paused = [accent]< Paused > yes = Yes no = No @@ -609,6 +634,7 @@ keybind.chat.name = Chat keybind.player_list.name = Player list keybind.console.name = Console keybind.rotate.name = Rotate +keybind.rotateplaced.name = Rotate Existing (Hold) keybind.toggle_menus.name = Toggle menus keybind.chat_history_prev.name = Chat history prev keybind.chat_history_next.name = Chat history next @@ -805,7 +831,7 @@ block.lancer.name = Lancer block.conveyor.name = Conveyor block.titanium-conveyor.name = Titanium Conveyor block.armored-conveyor.name = Armored Conveyor -block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors. +block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyor belts. block.junction.name = Junction block.router.name = Router block.distributor.name = Distributor @@ -927,11 +953,11 @@ unit.eradicator.name = Eradicator unit.lich.name = Lich unit.reaper.name = Reaper tutorial.next = [lightgray] -tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nBegin by[accent] mining copper[]. Tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper -tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\n[accent]Right-click[] to stop building, and[accent] Hold Ctrl while scrolling[] to zoom in and out. +tutorial.intro = You have entered the[scarlet] Mindustry Tutorial.[]\nUse [[WASD] to move.\n[accent] Hold [[Ctrl] while scrolling[] to zoom in and out.\nBegin by[accent] mining copper[]. Move close to it, then tap a copper ore vein near your core to do this.\n\n[accent]{0}/{1} copper +tutorial.drill = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nClick the drill tab in the bottom right.\nSelect the[accent] mechanical drill[]. Place it on a copper vein by clicking.\n[accent]Right-click[] to stop building. tutorial.drill.mobile = Mining manually is inefficient.\n[accent]Drills []can mine automatically.\nTap the drill tab in the bottom right.\nSelect the[accent] mechanical drill[].\nPlace it on a copper vein by tapping, then press the[accent] checkmark[] below to confirm your selection.\nPress the[accent] X button[] to cancel placement. tutorial.blockinfo = Each block has different stats. Each drill can only mine certain ores.\nTo check a block's info and stats,[accent] tap the "?" button while selecting it in the build menu.[]\n\n[accent]Access the Mechanical Drill's stats now.[] -tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\n\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core. +tutorial.conveyor = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent]Hold down the mouse to place in a line.[]\nHold[accent] CTRL[] while selecting a line to place diagonally.\nUse the scrollwheel to rotate blocks before placing them.\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core. tutorial.conveyor.mobile = [accent]Conveyors[] are used to transport items to the core.\nMake a line of conveyors from the drill to the core.\n[accent] Place in a line by holding down your finger for a few seconds[] and dragging in a direction.\n\n[accent]Place 2 conveyors with the line tool, then deliver an item into the core. tutorial.turret = Once an item enters your core, it can be used for building.\nKeep in mind that not all items can be used for building.\nItems that are not used for building, such as[accent] coal[] or[accent] scrap[], cannot be put into the core.\nDefensive structures must be built to repel the[lightgray] enemy[].\nBuild a[accent] duo turret[] near your base. tutorial.drillturret = Duo turrets require[accent] copper ammo []to shoot.\nPlace a drill near the turret.\nLead conveyors into the turret to supply it with copper.\n\n[accent]Ammo delivered: 0/1 @@ -945,7 +971,7 @@ tutorial.withdraw = In some situations, taking items directly from blocks is nec tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[] tutorial.waves = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves.[accent] Click[] to shoot.\nBuild more turrets and drills. Mine more copper. tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. -tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. +tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese obtained resources can then be used to research new technology.\n\n[accent]Press the launch button. item.copper.description = The most basic structural material. Used extensively in all types of blocks. item.lead.description = A basic starter material. Used extensively in electronics and liquid transportation blocks. @@ -1071,7 +1097,7 @@ block.core-foundation.description = The second version of the core. Better armor block.core-nucleus.description = The third and final iteration of the core capsule. Extremely well armored. Stores massive amounts of resources. block.vault.description = Stores a large amount of items of each type. An unloader block can be used to retrieve items from the vault. block.container.description = Stores a small amount of items of each type. An unloader block can be used to retrieve items from the container. -block.unloader.description = Unloads items from a container, vault or core onto a conveyor or directly into an adjacent block. The type of item to be unloaded can be changed by tapping. +block.unloader.description = Unloads items from any nearby non-transportation block. The type of item to be unloaded can be changed by tapping. block.launch-pad.description = Launches batches of items without any need for a core launch. block.launch-pad-large.description = An improved version of the launch pad. Stores more items. Launches more frequently. block.duo.description = A small, cheap turret. Useful against ground units. diff --git a/core/assets/bundles/bundle_de.properties b/core/assets/bundles/bundle_de.properties index 2e8e84ad04..bf80cfd8a5 100644 --- a/core/assets/bundles/bundle_de.properties +++ b/core/assets/bundles/bundle_de.properties @@ -1014,7 +1014,7 @@ block.router.description = Akzeptiert Materialien aus einer Richtung und leitet block.distributor.description = Ein weiterentwickelter Verteiler, der Materialien in bis zu sieben Richtungen gleichmäßig verteilt. block.overflow-gate.description = Ein Verteiler, der nur Materialien nach links oder rechts ausgibt, falls der Weg gerade aus blockiert ist. block.mass-driver.description = Ultimativer Transportblock. Sammelt mehrere Materialien und schießt sie zu einem verbundenen Massenbeschleuniger über eine große Reichweite. -block.mechanical-pump.description = Eine günstige, langsame Pumpe, die keine Strom benötigt. +block.mechanical-pump.description = Eine günstige, langsame Pumpe, die keinen Strom benötigt. block.rotary-pump.description = Eine fortgeschrittene Pumpe, die mithilfe von Strom doppelt so schnell pumpt. block.thermal-pump.description = Die ultimative Pumpe, dreimal so schnell wie eine mechanische Pumpe und die einzige Pumpe, die Lava fördern kann. block.conduit.description = Standard Flüssigkeits-Transportblock. Funktioniert wie ein Förderband, nur für Flüssigkeiten. Wird am Besten mit Extraktoren, Pumpen oder anderen Kanälen benutzt. diff --git a/core/assets/bundles/bundle_es.properties b/core/assets/bundles/bundle_es.properties index e40888231a..74396541de 100644 --- a/core/assets/bundles/bundle_es.properties +++ b/core/assets/bundles/bundle_es.properties @@ -646,7 +646,7 @@ item.coal.name = Carbón item.graphite.name = Grafito item.titanium.name = Titanio item.thorium.name = Torio -item.silicon.name = Silicona +item.silicon.name = Silicio item.plastanium.name = Plastanio item.phase-fabric.name = Tejido de fase item.surge-alloy.name = Aleación Eléctrica @@ -792,7 +792,7 @@ block.distributor.name = Distribuidor block.sorter.name = Clasificador block.message.name = Message block.overflow-gate.name = Compuerta de Desborde -block.silicon-smelter.name = Horno para Silicona +block.silicon-smelter.name = Horno para Silicio block.phase-weaver.name = Tejedor de Fase block.pulverizer.name = Pulverizador block.cryofluidmixer.name = Mezclador de Criogénicos @@ -968,11 +968,11 @@ unit.revenant.description = Una unidad aérea pesada con misiles. block.message.description = Stores a message. Used for communication between allies. block.graphite-press.description = Comprime carbón en piezas de grafito puro. block.multi-press.description = Una versión mejorada de la prensa de grafito. Utiliza agua y energía para procesar carbón rápida y eficientemente. -block.silicon-smelter.description = Reduce arena con coque de alta pureza para producir silicona. +block.silicon-smelter.description = Reduce la arena con carbón puro. Produce silicio. block.kiln.description = Funde arena y plomo en metacristal. Requiere cantidades pequeñas de energía. block.plastanium-compressor.description = Produce plastanio con aceite y titanio. block.phase-weaver.description = Produce tejido de fase del torio radioactivo y altas cantidades de arena. -block.alloy-smelter.description = Produce "surge alloy" con titanio, plomo, silicona y cobre. +block.alloy-smelter.description = Produce "surge alloy" con titanio, plomo, silicio y cobre. block.cryofluidmixer.description = Combina agua y titanio en líquido criogénico, que es mucho más eficiente para enfriar. block.blast-mixer.description = Usa aceite para transformar pirotita en un objeto menos inflamable pero más explosivo: compuesto explosivo. block.pyratite-mixer.description = Mezcla carbón, plomo y arena en pirotita altamente inflamable. @@ -999,7 +999,7 @@ block.surge-wall.description = El bloque defensivo más fuerte.\nTiene una peque block.surge-wall-large.description = El bloque defensivo más fuerte.\nTiene una pequeña probabilidad de disparar rayos al atacante.\nOcupa múltiplies casillas. block.door.description = Una puerta pequeña que puede ser abierta y cerrada tocándola.\nSi está abirta, los enemigos pueden moverse y disparar a través de ella. block.door-large.description = Una puerta grande que puede ser abierta y cerrada tocándola.\nSi está abirta, los enemigos pueden moverse y disparar a través de ella.\nOcupa múltiples casillas. -block.mender.description = Repara bloques cercanos periódicamente. Mantiene a las defensas reparadas entre oleadas.Puede usar silicona opcionalmente para mejorar el alcance y la eficiencia. +block.mender.description = Repara bloques cercanos periódicamente. Mantiene a las defensas reparadas entre oleadas. Puede usar silicio opcionalmente para mejorar el alcance y la eficiencia. block.mend-projector.description = Regenera edificios cercanos periódcamente. block.overdrive-projector.description = Aumenta la velocidad de edificios cercanos como taladros y transportadores. block.force-projector.description = Crea un área de fuerza hexagonal alrededor de él, protegiendo edificios y unidades dentro de él del daño de las balas. diff --git a/core/assets/bundles/bundle_pt_BR.properties b/core/assets/bundles/bundle_pt_BR.properties index bacda43305..dd40cf5588 100644 --- a/core/assets/bundles/bundle_pt_BR.properties +++ b/core/assets/bundles/bundle_pt_BR.properties @@ -16,11 +16,13 @@ screenshot.invalid = Mapa grande demais, Potencialmente sem memória suficiente gameover = O núcleo foi destruído. gameover.pvp = O time[accent] {0}[] É vitorioso! highscore = [YELLOW]Novo recorde! + load.sound = Sons load.map = Mapas load.image = Imagens load.content = Conteúdo load.system = Sistema + stat.wave = Hordas derrotadas:[accent] {0} stat.enemiesDestroyed = Inimigos Destruídos:[accent] {0} stat.built = Construções construídas:[accent] {0} @@ -29,6 +31,7 @@ stat.deconstructed = Construções desconstruídas:[accent] {0} stat.delivered = Recursos lançados: stat.rank = Rank Final: [accent]{0} launcheditems = [accent]Itens lançados + map.delete = Certeza que quer deletar o mapa "[accent]{0}[]"? level.highscore = Melhor\npontuação: [accent] {0} level.select = Seleção de Fase @@ -41,7 +44,7 @@ savegame = Salvar Jogo loadgame = Carregar Jogo joingame = Entrar no Jogo addplayers = Adicionar/Remover Jogador -customgame = Jogo Customizado +customgame = Jogo Customi-/nzado newgame = Novo Jogo none = minimap = Mini-Mapa @@ -53,13 +56,14 @@ maps = Mapas maps.browse = Browse Maps continue = Continuar maps.none = [LIGHT_GRAY]Nenhum Mapa Encontrado! -invalid = Invalid -preparingconfig = Preparing Config -preparingcontent = Preparing Content -uploadingcontent = Uploading Content -uploadingpreviewfile = Uploading Preview File -committingchanges = Comitting Changes -done = Done +invalid = Inválido +preparingconfig = Preparando configuração +preparingcontent = Preparando conteúdo +uploadingcontent = Fazendo upload do conteúdo +uploadingpreviewfile = Fazendo upload do arquivo de pré visualização +committingchanges = Enviando mudanças +done = Feito + about.button = Sobre name = Nome: noname = Pegue[accent] um nome[] primeiro. @@ -74,31 +78,31 @@ players = {0} Jogadores Ativos players.single = {0} Jogador Ativo server.closing = [accent]Fechando servidor... server.kicked.kick = Voce foi expulso do servidor! -server.kicked.whitelist = You are not whitelisted here. +server.kicked.whitelist = Você não está na lista branca do servidor. server.kicked.serverClose = Servidor Fechado. server.kicked.vote = Você foi expulso desse servidor. Tchau. server.kicked.clientOutdated = Cliente desatualizado! Atualize seu jogo! server.kicked.serverOutdated = Servidor desatualiado! Peça ao dono para atualizar! server.kicked.banned = Você foi banido do servidor. server.kicked.typeMismatch = Este servidor não é compatível com a sua versão. -server.kicked.playerLimit = This server is full. Wait for an empty slot. +server.kicked.playerLimit = Este servidor está cheio. Espere por uma vaga server.kicked.recentKick = Voce foi banido recentemente.\nEspere para conectar de novo. server.kicked.nameInUse = Este nome já esta sendo usado\nneste servidor. server.kicked.nameEmpty = Voce deve ter pelo menos uma letra ou número. -server.kicked.idInUse = Voce ja está neste servidor! Conectar com duas contas não é permitido. -server.kicked.customClient = Este servidor não suporta construções customizadas. Baixe a versão original. +server.kicked.idInUse = Você ja está neste servidor! Conectar com duas contas não é permitido. +server.kicked.customClient = Este servidor não suporta versões customizadas. Baixe a versão original. server.kicked.gameover = Fim de jogo! server.versions = Sua versão:[accent] {0}[]\nVersão do servidor:[accent] {1}[] -host.info = The [accent]Hospedar[]Botão Hopeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguem esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall -join.info = Aqui, Você pode entar em um [accent]IP De servidor[] Para conectar, Ou descobrir [accent]Servidores[] Da rede local.\nAmbos os servidores LAN e WAN São suportados.\n\n[LIGHT_GRAY]Note: Não tem uma lista de servidores automaticos; Se você quer conectar ao IP de alguem, Você precisa pedir o IP Ao Rosteador. +host.info = The [accent]Hospedar[]Botão Hospeda um servidor no Host[scarlet]6567[] e [scarlet]6568.[]\nQualquer um no [LIGHT_GRAY]Wi-fi Ou Internet local[] Pode ver este servidor na lista de servidores.\n\nSe voce quer poder entrar em qualquer servidor em seu ip, [accent]port forwarding[] é requerido.\n\n[LIGHT_GRAY]Note: Se alguem esta com problemas em conectar no seu servidor lan, Tenha certeza que deixou mindustry Acessar sua internet local nas configurações de firewall +join.info = Aqui, você pode entar em um [accent]IP de servidor[] para conectar, ou descobrir [accent]servidores[] da rede local.\nAmbos os servidores LAN e WAN são suportados.\n\n[LIGHT_GRAY]Note: Não há uma lista de servidores automáticos; Se você quer conectar ao IP de alguém, você precisa pedir o IP ao anfitrião. hostserver = Hospedar servidor -invitefriends = Invite Friends +invitefriends = Convidar amigos hostserver.mobile = Hospedar\nJogo host = Hospedar -hosting = [accent]Abrindo server... +hosting = [accent]Abrindo servidor... hosts.refresh = Atualizar hosts.discovering = Descobrindo jogos em lan -hosts.discovering.any = Discovering games +hosts.discovering.any = Descobrindo jogos server.refreshing = Atualizando servidor hosts.none = [lightgray]Nenhum jogo lan encontrado! host.invalid = [scarlet]Não foi possivel Hospedar. @@ -119,10 +123,10 @@ server.edit = Editar servidor server.outdated = [crimson]Servidor desatualizado![] server.outdated.client = [crimson]Cliente desatualizado![] server.version = [lightgray]Versão: {0} -server.custombuild = [yellow]Construção customizada +server.custombuild = [yellow]Versão customizada confirmban = Certeza que quer banir este jogador? confirmkick = Certeza que quer expulsar o jogador? -confirmvotekick = Are you sure you want to vote-kick this player? +confirmvotekick = Você tem certeza de que quer votar para banir este jogador? confirmunban = Certeza que quer desbanir este jogador? confirmadmin = Certeza que quer fazer este jogador um administrador? confirmunadmin = Certeza que quer remover o estatus de adminstrador deste jogador? @@ -131,30 +135,30 @@ joingame.ip = IP: disconnect = Desconectado. disconnect.error = Connection error. disconnect.closed = Connection closed. -disconnect.timeout = Timed out. +disconnect.timeout = Tempo esgotado. disconnect.data = Falha ao abrir os dados do mundo! -cantconnect = Unable to join game ([accent]{0}[]). +cantconnect = Impossível conectar ([accent]{0}[]). connecting = [accent]Conectando... connecting.data = [accent]Carregando dados do mundo... server.port = Porte: server.addressinuse = Senha em uso! server.invalidport = Numero de porta invalido! server.error = [crimson]Erro ao hospedar o servidor: [accent]{0} -save.old = Este save é para uma versão antiga do jogo, E não pode ser usado.\n\n[LIGHT_GRAY]Salvar Versões antigas vai ser Implementado Na versão 4.0 completa -save.new = Novo Save -save.overwrite = Você tem certeza que quer salvar sobre este slot? +save.old = Este save é para uma versão antiga do jogo, e não pode ser usado.\n\n[LIGHT_GRAY]Salvar versões antigas vai ser implementado na versão 4.0 completa +save.new = Novo salvamento +save.overwrite = Você tem certeza que quer sobrescrever este salvamento? overwrite = Salvar sobre -save.none = Nenhum save encontrado! +save.none = Nenhum salvamento encontrado! saveload = [accent]Salvando... savefail = Falha ao salvar jogo! -save.delete.confirm = Certeza que quer deletar este save? +save.delete.confirm = Certeza que quer deletar este salvamento? save.delete = Deletar save.export = Exportar save -save.import.invalid = [accent]Este save é invalido! -save.import.fail = [crimson]Falha ao importar save: [accent]{0} -save.export.fail = [crimson]Falha ao Exportar save: [accent]{0} -save.import = Importar save -save.newslot = Nome do save: +save.import.invalid = [accent]Este salvamento é inválido! +save.import.fail = [crimson]Falha ao importar salvamento: [accent]{0} +save.export.fail = [crimson]Falha ao exportar salvamento: [accent]{0} +save.import = Importar salvamento +save.newslot = Nome do salvamento: save.rename = Renomear save.rename.text = Novo jogo: selectslot = Selecione um slot para salvar. @@ -173,7 +177,7 @@ save.playtime = Tempo De Jogo: {0} warning = Aviso. confirm = Confirmar delete = Excluir -view.workshop = View In Workshop +view.workshop = Ver na oficina ok = OK open = Abrir customize = Customize @@ -181,15 +185,15 @@ cancel = Cancelar openlink = Abrir Link copylink = Copiar link back = Voltar -data.export = Exportar Data -data.import = Importar Data -data.exported = Data exportada. -data.invalid = Isso não é daa de jogo válida. -data.import.confirm = Importal data externa irá deletar[scarlet] toda[] sua data atual.\n[accent]Isso não pode ser desfeito![]\n\nQuando sua data é importada, seu jogo ira sair imediatamente. -classic.export = Exportar data classica +data.export = Exportar dados +data.import = Importar dados +data.exported = Dados exportados. +data.invalid = Estes dados de jogo não são válidos +data.import.confirm = Importar dados externos irá deletar[scarlet] todos[] os seus dados atuais.\n[accent]Isso não pode ser desfeito![]\n\nQuando sua data é importada, seu jogo ira sair imediatamente. +classic.export = Exportar dados clássicos classic.export.text = [accent]Mindustry[] has just had a major update.\nClassic (v3.5 build 40) save or map data has been detected. Would you like to export these saves to your phone's home folder, for use in the Mindustry Classic app? quit.confirm = Você tem certeza que quer sair? -quit.confirm.tutorial = Você tem certeza você sabe oque Você esta fazendo?\nO tutorial pode ser refeito nas [accent] Configurações->Jogo->Refazer Tutorial.[] +quit.confirm.tutorial = Você tem certeza você sabe o que você esta fazendo?\nO tutorial pode ser refeito nas [accent] Configurações->Jogo->Refazer Tutorial.[] loading = [accent]Carregando... saving = [accent]Salvando... wave = [accent]Horda {0} @@ -197,24 +201,24 @@ wave.waiting = Horda em {0} wave.waveInProgress = [LIGHT_GRAY]Horda Em Progresso waiting = Aguardando... waiting.players = Esperando por jogadores... -wave.enemies = [LIGHT_GRAY]{0} Inimigos Restantes -wave.enemy = [LIGHT_GRAY]{0} Inimigo Restante -loadimage = Carregar\nImagem -saveimage = Salvar\nImagem +wave.enemies = [LIGHT_GRAY]{0} inimigos restantes +wave.enemy = [LIGHT_GRAY]{0} inimigo restante +loadimage = Carregar\nimagem +saveimage = Salvar\nimagem unknown = Desconhecido custom = Customizado builtin = Built-In map.delete.confirm = Certeza que quer deletar este mapa? Isto não pode ser desfeito! map.random = [accent]Mapa aleatório -map.nospawn = Esse mapa não contém um [yellow]núcleo[] para o jogador Nascer! [ROYAL]blue[] Coloque um [yellow]núcleo[] no editor de mapa. +map.nospawn = Este mapa não possui nenhum núcleo para o jogador nascer! Adicione um núcleo[accent] amarelo[] para este mapa no editor. map.nospawn.pvp = Esse mapa não tem núcleos inimigos para os jogadores nascerem! Adicione[SCARLET] Núcleos vermelhos[] no mapa no editor. -map.nospawn.attack = Esse mapa não tem nenhum núcleos enimigos para o jogador atacar! coloque[SCARLET] Núcleos[] vermelhos no editor. +map.nospawn.attack = Esse mapa não tem nenhum núcleo inimigo para o jogador atacar! coloque[SCARLET] Núcleos[] vermelhos no editor. map.invalid = Erro ao carregar o mapa: Arquivo de mapa invalido ou corrupto. map.publish.error = Error publishing map: {0} -map.publish.confirm = Are you sure you want to publish this map?\n\n[lightgray]Make sure you agree to the Workshop EULA first, or your maps will not show up! -eula = Steam EULA -map.publish = Map published. -map.publishing = [accent]Publishing map... +map.publish.confirm = Você tem certeza de que quer publicar este mapa?\n\n[lightgray]Tenha certeza de que você concorda com o EULA da oficina primeiro, ou seus mapas não serão mostrados! +eula = EULA do Steam +map.publish = Mapa publicado. +map.publishing = [accent]Publicando mapa... editor.brush = Pincel editor.openin = Abrir no Editor editor.oregen = Geração de minério @@ -222,14 +226,14 @@ editor.oregen.info = Geração de minério: editor.mapinfo = Informação do mapa editor.author = Autor: editor.description = Descrição: -editor.nodescription = A map must have a description of at least 4 characters before being published. -editor.waves = Ondas: +editor.nodescription = Um mapa deve ter uma descrição de no mínimo 4 caracteres antes de ser publicado. +editor.waves = Hordas: editor.rules = Regras: -editor.generation = Generation: +editor.generation = Geração: editor.ingame = Editar em jogo -editor.publish.workshop = Publish On Workshop +editor.publish.workshop = Publicar na oficina editor.newmap = Novo mapa -workshop = Workshop +workshop = Oficina waves.title = Hordas waves.remove = Remover waves.never = @@ -238,38 +242,38 @@ waves.waves = Hordas(s) waves.perspawn = por spawn waves.to = para waves.boss = Chefe -waves.preview = Prever +waves.preview = Pré visualizar waves.edit = Editar... waves.copy = Copiar para área de transferência -waves.load = carregar da área de transferência +waves.load = Carregar da área de transferência waves.invalid = Hordas inválidas na área de transferência. waves.copied = Hordas copiadas. -waves.none = Sem hordas definidas.\nNote que layouts vazios de ondas serão automaticamente substituídos pelo layout padrão. +waves.none = Sem hordas definidas.\nNote que layouts vazios de hordas serão automaticamente substituídos pelo layout padrão. editor.default = [LIGHT_GRAY] -details = Details... +details = Detalhes... edit = Editar... editor.name = Nome: editor.spawn = Criar unidade editor.removeunit = Remover unidade editor.teams = Time -editor.errorload = Erro carregando arquivo:\n[accent]{0} -editor.errorsave = Erro salvando arquivo:\n[accent]{0} -editor.errorimage = Isso é uma imagem, Não um mapa. Não vá por aí mudando extensões esperando que funcione.\n\nSe você quer importar um mapa legacy, Use o botão 'Importar mapa legacy'no editor. +editor.errorload = Erro ao carregar arquivo:\n[accent]{0} +editor.errorsave = Erro ao salvar arquivo:\n[accent]{0} +editor.errorimage = Isso é uma imagem, não um mapa. Não vá por aí mudando extensões esperando que funcione.\n\nSe você quer importar um mapa legacy, Use o botão 'Importar mapa legacy'no editor. editor.errorlegacy = Esse mapa é velho demais, E usa um formato de mapa legacy que não é mais suportado. -editor.errornot = This is not a map file. +editor.errornot = Este não é um arquivo de mapa. editor.errorheader = Este arquivo de mapa não é mais válido ou está corrompido. -editor.errorname = Mapa não tem nome definido. +editor.errorname = O mapa não tem nome definido. editor.update = Atualizar editor.randomize = Randomizar editor.apply = Aplicar editor.generate = Gerar -editor.resize = Redimen\n sionar -editor.loadmap = Carregar\nMapa -editor.savemap = Salvar\nMapa +editor.resize = Redimen-\nsionar +editor.loadmap = Carregar\nmapa +editor.savemap = Salvar\nmapa editor.saved = Salvo! editor.save.noname = Seu mapa não tem um nome! Coloque um no menu de "Informação do mapa" -editor.save.overwrite = O seu mapa Substitui um mapa já construído! Coloque um nome diferente no menu "Informação do mapa" -editor.import.exists = [scarlet]Não foi possivel importar:[] Um mapa Construído chamado '{0}' Já existe! +editor.save.overwrite = O seu mapa substitui um mapa já construído! Coloque um nome diferente no menu "Informação do mapa" +editor.import.exists = [scarlet]Não foi possivel importar:[] Um mapa construído chamado '{0}' Já existe! editor.import = Importar... editor.importmap = Importar Mapa editor.importmap.description = Importar um mapa existente @@ -287,36 +291,38 @@ editor.saveimage = Salvar\nImagem editor.unsaved = [scarlet]Você tem alterações não salvas![]\nTem certeza que quer sair? editor.resizemap = Redimensionar Mapa editor.mapname = Nome do Mapa: -editor.overwrite = [accent]Aviso!\nIsso Subistitui um mapa existente. +editor.overwrite = [accent]Aviso!\nIsso Substitui um mapa existente. editor.overwrite.confirm = [scarlet]Aviso![] Um mapa com esse nome já existe. Tem certeza que deseja substituir? -editor.exists = A map with this name already exists. +editor.exists = Já existe um mapa com este nome. editor.selectmap = Selecione uma mapa para carregar: + toolmode.replace = Substituir -toolmode.replace.description = Draws only on solid blocks. +toolmode.replace.description = Desenha apenas em blocos sólidos. toolmode.replaceall = Substituir tudo -toolmode.replaceall.description = Substitui todos os blocos no mapa -toolmode.orthogonal = Orthogonal -toolmode.orthogonal.description = Draws only orthogonal lines. +toolmode.replaceall.description = Substituir todos os blocos no mapa +toolmode.orthogonal = Linha reta +toolmode.orthogonal.description = Desenha apenas linhas retas. toolmode.square = Square -toolmode.square.description = Square brush. +toolmode.square.description = Pincel quadrado. toolmode.eraseores = Apagar minérios toolmode.eraseores.description = Apaga apenas minérios. -toolmode.fillteams = Fill Teams -toolmode.fillteams.description = Fill teams instead of blocks. -toolmode.drawteams = Draw Teams -toolmode.drawteams.description = Draw teams instead of blocks. +toolmode.fillteams = Encher times +toolmode.fillteams.description = Muda o time do qual todos os blocos pertencem. +toolmode.drawteams = Desenhar times +toolmode.drawteams.description = Muda o time do qual o bloco pertence. + filters.empty = [LIGHT_GRAY]Sem filtro! Adicione um usando o botão abaixo. filter.distort = Distorcedor -filter.noise = Ruído +filter.noise = Geração aleatória filter.median = Median filter.oremedian = Ore Median filter.blend = Blend -filter.defaultores = Default Ores +filter.defaultores = Minérios padrão filter.ore = Minério -filter.rivernoise = Ruído para rios -filter.mirror = Mirror -filter.clear = Clear -filter.option.ignore = Ignore +filter.rivernoise = Geração aleatória de rios +filter.mirror = Espelhar +filter.clear = Excluir +filter.option.ignore = Ignorar filter.scatter = Dispersão filter.terrain = Terreno filter.option.scale = Escala @@ -329,94 +335,100 @@ filter.option.falloff = Caída filter.option.angle = Angle filter.option.block = Bloco filter.option.floor = Chão -filter.option.flooronto = Target Floor +filter.option.flooronto = Chão alvo filter.option.wall = Parede filter.option.ore = Minério filter.option.floor2 = Chão secundário filter.option.threshold2 = Margem secundária -filter.option.radius = Radius -filter.option.percentile = Percentil +filter.option.radius = Raio +filter.option.percentile = Percentual + width = Largura: height = Altura: menu = Menu play = Jogar -campaign = Campanha +campaign = Campa-/nnha load = Carregar save = Salvar fps = FPS: {0} tps = TPS: {0} ping = Ping: {0}ms -language.restart = Por favor Reinicie seu jogo para a tradução tomar efeito. -settings = Configurações +language.restart = Por favor, reinicie seu jogo para a tradução tomar efeito. +settings = Configu-/nrações tutorial = Tutorial tutorial.retake = Refazer Tutorial editor = Editor mapeditor = Editor de mapa donate = Doar + abandon = Abandonar abandon.text = Esta zona e todos os seus recursos serão perdidos para o inimigo. locked = Trancado complete = [LIGHT_GRAY]Completo: -zone.requirement = Onda {0} Na zona {1} +zone.requirement = Horda {0} Na zona {1} resume = Resumir Zona:\n[LIGHT_GRAY]{0} bestwave = [LIGHT_GRAY]Melhor: {0} launch = Lançar launch.title = Lançamento feito com sucesso -launch.next = [LIGHT_GRAY]próxima oportunidade na onda {0} -launch.unable2 = [scarlet]Unable to LAUNCH.[] +launch.next = [LIGHT_GRAY]Próxima oportunidade na Horda {0} +launch.unable2 = [scarlet]Impossível lançar.[] launch.confirm = Isto vai lançar todos os seus recursos no seu núcleo.\nVoce não será capaz de retornar para esta base. -launch.skip.confirm = Se você pular a onda agora, você não será capaz de lançar até ondas mais avançadas. +launch.skip.confirm = Se você pular a horda agora, você não será capaz de lançar até hordas mais avançadas. uncover = Descobrir configure = Configurar carregamento -configure.locked = [LIGHT_GRAY]Alcançe a onda {0}\npara Configurar o Loadout. -configure.invalid = Amount must be a number between 0 and {0}. +configure.locked = [LIGHT_GRAY]Alcançe a horda {0}\npara configurar o carregamento. +configure.invalid = A quantidade deve ser um número entre 0 e {0}. zone.unlocked = [LIGHT_GRAY]{0} Desbloqueado. -zone.requirement.complete = Onda {0} alcançada:\n{1} Requerimentos da zona alcançada. -zone.config.complete = Onda {0} Alcançada:\nLoadout config desbloqueado. +zone.requirement.complete = Horda {0} alcançada:\n{1} Requerimentos da zona alcançada. +zone.config.complete = Horda {0} Alcançada:\nConfiguração do carregamento desbloqueado. zone.resources = Recursos detectados: zone.objective = [lightgray]Objetivo: [accent]{0} zone.objective.survival = Sobreviver zone.objective.attack = Destruir o núcleo inimigo add = Adicionar... boss.health = Saúde do chefe + connectfail = [crimson]Falha ao entrar no servidor: [accent]{0} -error.unreachable = Servidor inalcançavel. -error.invalidaddress = Endereço invalido. -error.timedout = Desconectado!\nTenha certeza que o Rosteador tenha feito Port forwading, E que o indereço esteja correto! -error.mismatch = Erro de pacote:\nPossivel versão do cliente/Servidor incompatibilidade.\nTenha certeza que você e o host tenham a ultima versão! +error.unreachable = Servidor inalcançável. +error.invalidaddress = Endereço inválido. +error.timedout = Desconectado!\nTenha certeza que o anfitrião tenha feito redirecionamento de portas e que o endereço esteja correto! +error.mismatch = Erro de pacote:\nPossivel incompatibilidade com a versão do cliente/servidor.\nTenha certeza que você e o anfitrião tenham a última versão! error.alreadyconnected = Já conectado. error.mapnotfound = Arquivo de mapa não encontrado! error.io = Erro I/O de internet. error.any = Erro de rede desconhecido. -error.bloom = Failed to initialize bloom.\nYour device may not support it. +error.bloom = Falha ao inicializar bloom.\nSeu dispositivo talvez não o suporte. + zone.groundZero.name = Marco zero -zone.desertWastes.name = Perdas do Deserto +zone.desertWastes.name = Ruínas do Deserto zone.craters.name = As crateras zone.frozenForest.name = Floresta congelada zone.ruinousShores.name = Costas Ruinosas zone.stainedMountains.name = Montanhas manchadas zone.desolateRift.name = Fenda desolada -zone.nuclearComplex.name = Complexo de construção nuclear -zone.overgrowth.name = SobreCrescido -zone.tarFields.name = Campos de Tar +zone.nuclearComplex.name = Complexo de Produção Nuclear +zone.overgrowth.name = Crescimento excessivo +zone.tarFields.name = Campos de Piche zone.saltFlats.name = Planícies de sal zone.impact0078.name = Impacto 0078 zone.crags.name = Penhascos -zone.fungalPass.name = Passagem de fungos +zone.fungalPass.name = Passagem Fúngica + zone.groundZero.description = Uma ótima localização para começar de novo. Baixa ameaça inimiga. Poucos recursos.\nColete o máximo de chumbo e cobre possível.\nContinue! zone.frozenForest.description = Até aqui, perto das montanhas, os esporos se espalharam. As baixas temperaturas não podem contê-los para sempre.\n\nComeçe a busca por energia. Construa geradores à combustão. Aprenda a usar os reparadores (menders). -zone.desertWastes.description = These wastes are vast, unpredictable, and criss-crossed with derelict sector structures.\nCarvão está presente na região. O queime por energia, ou sintetize grafite.\n\n[lightgray]Esse local de pouso não pode ser garantido. -zone.saltFlats.description = On the outskirts of the desert lie the Salt Flats. Few resources can be found in this location.\n\nThe enemy has erected a resource storage complex here. Eradicate their core. Leave nothing standing. -zone.craters.description = Water has accumulated in this crater, relic of the old wars. Reclaim the area. Collect sand. Smelt metaglass. Pump water to cool turrets and drills. -zone.ruinousShores.description = Past the wastes, is the shoreline. Once, this location housed a coastal defense array. Not much of it remains. Only the most basic defense structures have remained unscathed, everything else reduced to scrap.\nContinue the expansion outwards. Rediscover the technology. -zone.stainedMountains.description = Further inland lie the mountains, yet untainted by spores.\nExtract the abundant titanium in this area. Learn how to use it.\n\nThe enemy presence is greater here. Do not give them time to send their strongest units. -zone.overgrowth.description = This area is overgrown, closer to the source of the spores.\nThe enemy has established an outpost here. Build dagger units. Destroy it. Reclaim that which was lost. -zone.tarFields.description = The outskirts of an oil production zone, between the mountains and desert. One of the few areas with usable tar reserves.\nAlthough abandoned, this area has some dangerous enemy forces nearby. Do not underestimate them.\n\n[lightgray]Research oil processing technology if possible. -zone.desolateRift.description = An extremely dangerous zone. Plentiful resources, but little space. High risk of destruction. Leave as soon as possible. Do not be fooled by the long spacing between enemy attacks. -zone.nuclearComplex.description = A former facility for the production and processing of thorium, reduced to ruins.\n[lightgray]Research the thorium and its many uses.\n\nThe enemy is present here in great numbers, constantly scouting for attackers. +zone.desertWastes.description = Estas ruínas são vastas, imprevisíveis, e cruzadas por estruturas abandonadas.\nCarvão está presente na região. O queime por energia, ou sintetize grafite.\n\n[lightgray]Este local de pouso não pode ser garantido. +zone.saltFlats.description = Nos arredores do deserto estão as Planícies de Sal. Poucos recursos podem ser encontrados neste lugar.\n\nO inimigo ergueu um complexo de armazenamento aqui. Erradique seu núcleo. Não deixe nada de pé. +zone.craters.description = Água se acumulou nesta cratera, relíquia de guerras antigas. Recupere a área. Colete areia. Derreta metavidro. Bombeie água para resfriar torretas e brocas. +zone.ruinousShores.description = Depois das ruínas está o litoral. Uma vez, este local abrigou uma matriz de defesa costeira. Não restou muito disso. Apenas as estruturas de defesa mais básicas restaram ilesas, todo o resto se reduziu a sucata.\nContinue a expansão para fora. Redescubra a tecnologia. +zone.stainedMountains.description = Mais para o interior estão as montanhas, ainda intocadas por esporos.\nExtraia o titânio abundante nesta área. Aprenda como usá-lo.\n\nA presença inimiga é maior aqui. Não os dê tempo de enviar suas tropas mais fortes. +zone.overgrowth.description = Esta área tem crescimento excessivo, mais perto da fonte de esporos.\nO inimgo estabeleceu um posto avançado aqui. Construa unidades dagger. Destrua-o. Recupere o que sobrou. +zone.tarFields.description = Nos arredores de uma zona de produção de petróleo, entre as montanhas e o deserto. Uma das poucas áreas com reservas utilizáveis de piche.\nApesar de abandonada, esta área possui perigosas forças inimigas por perto. Não as subestime.\n\n[lightgray]Pesquise tecnologias de processamento de petróleo se possível. +zone.desolateRift.description = Uma zona extremamente perigosa. Recursos abundantes, porém pouco espaço. Alto risco de destruição. Saia o mais rápido possível. Não seja enganado pelo longo espaço de tempo entre os ataques inimigos. +zone.nuclearComplex.description = Uma antiga instalação para produção e processamento de tório, reduzido a ruínas.\n[lightgray]Pesquise o tório e seus muitos usos.\n\nO inimigo está presente aqui em grandes números, constantemente à procura de atacantes. zone.fungalPass.description = A transition area between high mountains and lower, spore-ridden lands. A small enemy reconnaissance base is located here.\nDestroy it.\nUse Dagger and Crawler units. Take out the two cores. zone.impact0078.description = zone.crags.description = + settings.language = Linguagem settings.data = Dados do jogo settings.reset = Restaurar Padrões @@ -459,18 +471,19 @@ blocks.basepowergeneration = Geração de poder base blocks.productiontime = Tempo de produção blocks.repairtime = Tempo de reparo total do bloco blocks.speedincrease = Aumento de velocidade -blocks.range = Distancia -blocks.drilltier = Furaveis +blocks.range = Distância +blocks.drilltier = Furáveis blocks.drillspeed = Velocidade da broca base blocks.boosteffect = Efeito do Boost -blocks.maxunits = Maximo de unidades ativas +blocks.maxunits = Máximo de unidades ativas blocks.health = Saúde blocks.buildtime = Tempo de construção -blocks.buildcost = Build Cost +blocks.buildcost = Custo de construção blocks.inaccuracy = Imprecisão blocks.shots = Tiros -blocks.reload = Recarregar +blocks.reload = Tiros por segundo blocks.ammo = Munição + bar.drilltierreq = Broca melhor necessária. bar.drillspeed = Velocidade da broca: {0}/s bar.efficiency = Eficiência: {0}% @@ -485,17 +498,19 @@ bar.heat = Aquecimento bar.power = Poder bar.progress = Progresso da construção bar.spawned = Unidades: {0}/{1} + bullet.damage = [stat]{0}[lightgray] dano -bullet.splashdamage = [stat]{0}[lightgray] Dano em area ~[stat] {1}[lightgray] Blocos -bullet.incendiary = [stat]incendiario +bullet.splashdamage = [stat]{0}[lightgray] Dano em área ~[stat] {1}[lightgray] Blocos +bullet.incendiary = [stat]Incendiário bullet.homing = [stat]Guiado bullet.shock = [stat]Choque -bullet.frag = [stat]fragmento -bullet.knockback = [stat]{0}[lightgray] Impulso +bullet.frag = [stat]Fragmentação +bullet.knockback = [stat]{0}[lightgray]Impulso bullet.freezing = [stat]Congelamento -bullet.tarred = [stat]tarred -bullet.multiplier = [stat]{0}[lightgray]x Multiplicador de munição -bullet.reload = [stat]{0}[lightgray]x recarregar +bullet.tarred = [stat]Grudento +bullet.multiplier = [stat]{0}[lightgray]x multiplicador de munição +bullet.reload = [stat]{0}[lightgray]x cadência de tiro + unit.blocks = Blocos unit.powersecond = Unidades de energia/segundo unit.liquidsecond = Unidades de líquido/segundo @@ -504,7 +519,7 @@ unit.liquidunits = Unidades de liquido unit.powerunits = Unidades de energia unit.degrees = Graus unit.seconds = segundos -unit.persecond = /sec +unit.persecond = por segundo unit.timesspeed = x Velocidade unit.percent = % unit.items = itens @@ -517,18 +532,18 @@ category.shooting = Atirando category.optional = Melhoras opcionais setting.landscape.name = Travar panorama setting.shadows.name = Sombras -setting.linear.name = Linear Filtering +setting.linear.name = Filtragem linear setting.animatedwater.name = Água animada setting.animatedshields.name = Escudos animados -setting.antialias.name = Antialias[LIGHT_GRAY] (Requer recomeço)[] +setting.antialias.name = Filtro suavizante[LIGHT_GRAY] (reinicialização requerida)[] setting.indicators.name = Indicador de aliados setting.autotarget.name = Alvo automatico -setting.keyboard.name = Mouse+Keyboard Controls -setting.touchscreen.name = Touchscreen Controls +setting.keyboard.name = Controles de mouse e teclado +setting.touchscreen.name = Controles de tela sensível ao toque setting.fpscap.name = FPS Maximo setting.fpscap.none = Nenhum setting.fpscap.text = {0} FPS -setting.uiscale.name = UI Scaling[lightgray] (require restart)[] +setting.uiscale.name = Escala da IU[lightgray] (reinicialização requerida)[] setting.swapdiagonal.name = Sempre colocação diagnoal setting.difficulty.training = Treinamento setting.difficulty.easy = Fácil @@ -542,7 +557,7 @@ setting.sensitivity.name = Sensibilidade do Controle setting.saveinterval.name = Intervalo de autosalvamento setting.seconds = {0} Segundos setting.fullscreen.name = Tela Cheia -setting.borderlesswindow.name = Janela sem borda[LIGHT_GRAY] (Pode precisar reeiniciar) +setting.borderlesswindow.name = Janela sem borda[LIGHT_GRAY] (Pode precisar reiniciar) setting.fps.name = Mostrar FPS setting.vsync.name = VSync setting.lasers.name = Mostrar lasers @@ -554,20 +569,20 @@ setting.mutemusic.name = Desligar Música setting.sfxvol.name = Volume de Efeitos setting.mutesound.name = Desligar Som setting.crashreport.name = Enviar denuncias de crash anonimas -setting.savecreate.name = Auto-Create Saves -setting.publichost.name = Public Game Visibility +setting.savecreate.name = Criar salvamentos automaticamente +setting.publichost.name = Visibilidade do jogo público setting.chatopacity.name = Opacidade do chat setting.playerchat.name = Mostrar chat em jogo -uiscale.reset = A escala da interface do usuário foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] settings... -uiscale.cancel = Cancel & Exit +uiscale.reset = A escala da IU foi mudada.\nPressione "OK" para confirmar esta escala.\n[scarlet]Revertendo e saindo em[accent] {0}[] settings... +uiscale.cancel = Cancelar e sair setting.bloom.name = Bloom keybind.title = Refazer teclas -keybinds.mobile = [scarlet]Most keybinds here are not functional on mobile. Only basic movement is supported. +keybinds.mobile = [scarlet]A maior parte das teclas aqui não são funcionais em dispositivos móveis. Apenas movimento básico é suportado. category.general.name = Geral category.view.name = Ver category.multiplayer.name = Multijogador command.attack = Atacar -command.rally = Rally +command.rally = Reunir command.retreat = Recuar keybind.gridMode.name = Seleção de blocos keybind.gridModeShift.name = Seleção de categoria @@ -576,7 +591,7 @@ keybind.press.axis = Pressione uma Axis ou tecla... keybind.screenshot.name = Captura do mapa keybind.move_x.name = mover_x keybind.move_y.name = mover_y -keybind.fullscreen.name = Toggle Fullscreen +keybind.fullscreen.name = Alterar tela cheia keybind.select.name = selecionar keybind.diagonal_placement.name = Colocação diagonal keybind.pick.name = Pegar bloco @@ -587,7 +602,7 @@ keybind.zoom_hold.name = segurar_zoom keybind.zoom.name = Zoom keybind.menu.name = Menu keybind.pause.name = Pausar -keybind.minimap.name = Minimap +keybind.minimap.name = Minimapa keybind.dash.name = Correr keybind.chat.name = Conversa keybind.player_list.name = Lista_de_jogadores @@ -601,13 +616,13 @@ keybind.drop_unit.name = Soltar unidade keybind.zoom_minimap.name = Zoom minimap mode.help.title = Descrição dos modos mode.survival.name = Sobrevivencia -mode.survival.description = O modo normal. Recursos limitados E Ondas automaticass. -mode.sandbox.name = Caixa de areia -mode.sandbox.description = Recursos infinitos E sem tempo para Ataques. -mode.pvp.name = PvP +mode.survival.description = O modo normal. Recursos limitados e hordas automáticas. +mode.sandbox.name = Sandbox +mode.sandbox.description = Recursos infinitos e sem tempo para ataques. +mode.pvp.name = JXJ mode.pvp.description = Lutar contra outros jogadores locais. mode.attack.name = Ataque -mode.attack.description = Sem hordas, Com o objetivo de destruir a base inimiga. +mode.attack.description = Sem hordas, com o objetivo de destruir a base inimiga. mode.custom = Regras personalizadas rules.infiniteresources = Recursos infinitos rules.wavetimer = Tempo de horda @@ -647,8 +662,8 @@ item.graphite.name = Grafite item.titanium.name = Titânio item.thorium.name = Urânio item.silicon.name = Sílicio -item.plastanium.name = Plastanio -item.phase-fabric.name = Fabrica fase +item.plastanium.name = Plastânio +item.phase-fabric.name = Tecido de fase item.surge-alloy.name = Liga de surto item.spore-pod.name = Pod de esporos item.sand.name = Areia @@ -657,33 +672,33 @@ item.pyratite.name = Piratita item.metaglass.name = Metavidro item.scrap.name = Sucata liquid.water.name = Água -liquid.slag.name = Slag +liquid.slag.name = Escória liquid.oil.name = Petróleo liquid.cryofluid.name = Crio Fluido mech.alpha-mech.name = Alfa mech.alpha-mech.weapon = Repetidor pesado -mech.alpha-mech.ability = Onda de drones +mech.alpha-mech.ability = Regeneração mech.delta-mech.name = Delta mech.delta-mech.weapon = Gerador Arc mech.delta-mech.ability = Descarga mech.tau-mech.name = Tau -mech.tau-mech.weapon = Laser restruturador +mech.tau-mech.weapon = Laser reestruturador mech.tau-mech.ability = Tiro reparador mech.omega-mech.name = Omega -mech.omega-mech.weapon = Onda de missies +mech.omega-mech.weapon = Enxame de mísseis mech.omega-mech.ability = Configuração Armadurada mech.dart-ship.name = Dardo mech.dart-ship.weapon = Repetidor mech.javelin-ship.name = Javelin -mech.javelin-ship.weapon = Ondas de misseis +mech.javelin-ship.weapon = Mísseis explosivos mech.javelin-ship.ability = Acelerador de explosão mech.trident-ship.name = Tridente mech.trident-ship.weapon = Carga de bombas mech.glaive-ship.name = Glaive mech.glaive-ship.weapon = Repetidor de fogo -item.explosiveness = [LIGHT_GRAY]Explosividade: {0} +item.explosiveness = [LIGHT_GRAY]Explosibilidade: {0} item.flammability = [LIGHT_GRAY]Inflamabilidade: {0} -item.radioactivity = [LIGHT_GRAY]RadioAtividade: {0} +item.radioactivity = [LIGHT_GRAY]Radioatividade: {0} unit.health = [LIGHT_GRAY]Vida: {0} unit.speed = [LIGHT_GRAY]Velocidade: {0} mech.weapon = [LIGHT_GRAY]Arma: {0} @@ -719,7 +734,7 @@ block.scrap-wall-large.name = Parede de sucata grande block.scrap-wall-huge.name = Parede de sucata Maior block.scrap-wall-gigantic.name = Muro de sucata gigante block.thruster.name = Propulsor -block.kiln.name = Kiln +block.kiln.name = Forno para metavidro block.graphite-press.name = Prensa de grafite block.multi-press.name = Multi-Prensa block.constructing = {0}\n[LIGHT_GRAY](Construindo) @@ -727,19 +742,19 @@ block.spawn.name = Spawn dos inimigos block.core-shard.name = Fragmento do núcleo block.core-foundation.name = Fundação do núcleo block.core-nucleus.name = Núcleo do núcleo -block.deepwater.name = água funda +block.deepwater.name = Água profunda block.water.name = Água block.tainted-water.name = Água contaminada -block.darksand-tainted-water.name = Água contaminada de areia escura -block.tar.name = Tar +block.darksand-tainted-water.name = Água contaminada sobre areia escura +block.tar.name = Piche block.stone.name = Pedra block.sand.name = Areia block.darksand.name = Areia escura block.ice.name = Gelo block.snow.name = Neve block.craters.name = Crateras -block.sand-water.name = Água de areia -block.darksand-water.name = Água de areia escura +block.sand-water.name = Água sobre areia +block.darksand-water.name = Água sobre areia escura block.char.name = Char block.holostone.name = Pedra holo block.ice-snow.name = Gelo de neve @@ -750,7 +765,7 @@ block.dunerocks.name = Rochas da duna block.pine.name = Pinheiro block.white-tree-dead.name = Árvore branca morta block.white-tree.name = Árvore branca -block.spore-cluster.name = Grupo de esporos +block.spore-cluster.name = Aglomerado de esporos block.metal-floor.name = Chão de metal block.metal-floor-2.name = Chão de metal 2 block.metal-floor-3.name = Chão de metal 3 @@ -763,13 +778,13 @@ block.dark-panel-4.name = Painel escuro 4 block.dark-panel-5.name = Painel escuro 5 block.dark-panel-6.name = Painel escuro 6 block.dark-metal.name = Metal escuro -block.ignarock.name = Rocha igna +block.ignarock.name = Rocha ígnea block.hotrock.name = Rocha quente block.magmarock.name = Rocha de magma block.cliffs.name = Colinas block.copper-wall.name = Parede de Cobre block.copper-wall-large.name = Parede de Cobre Grande -block.titanium-wall.name = Parede de titanio +block.titanium-wall.name = Parede de titânio block.titanium-wall-large.name = Parede de titânio grande block.phase-wall.name = Parede de fase block.phase-wall-large.name = Parde de fase grande @@ -784,13 +799,13 @@ block.hail.name = Granizo block.lancer.name = Lançador block.conveyor.name = Esteira block.titanium-conveyor.name = Esteira de Titânio -block.armored-conveyor.name = Armored Conveyor -block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors. +block.armored-conveyor.name = Esteira blindada +block.armored-conveyor.description = Move itens com a mesma velocidade que esteiras de titânio, mas tem mais armadura. Não aceita itens dos lados a não ser de outras esteiras. block.junction.name = Junção block.router.name = Roteador block.distributor.name = Distribuidor block.sorter.name = Ordenador -block.message.name = Message +block.message.name = Mensagem block.overflow-gate.name = Portão Sobrecarregado block.silicon-smelter.name = Fundidora de silicio block.phase-weaver.name = Palheta de fase @@ -806,7 +821,7 @@ block.power-node-large.name = Célula de energia Grande block.surge-tower.name = Torre de surto block.battery.name = Bateria block.battery-large.name = Bateria Grande -block.combustion-generator.name = Gerador de combustão +block.combustion-generator.name = Gerador a combustão block.turbine-generator.name = Gerador de Turbina block.differential-generator.name = Gerador diferencial block.impact-reactor.name = Reator De Impacto @@ -824,11 +839,11 @@ block.omega-mech-pad.name = Controle da armadura Omega block.tau-mech-pad.name = Controle da armadura Tau block.conduit.name = Cano block.mechanical-pump.name = Bomba Mecânica -block.item-source.name = Fonte do item -block.item-void.name = Item Vazio -block.liquid-source.name = Fonte de água -block.power-void.name = Poder Vazio -block.power-source.name = Poder Infinito +block.item-source.name = Criador de itens +block.item-void.name = Destruidor de itens +block.liquid-source.name = Criador de líquidos +block.power-void.name = Anulador de energia +block.power-source.name = Criador de energia block.unloader.name = Descarregador block.vault.name = Cofre block.wave.name = Onda @@ -842,7 +857,7 @@ block.pyratite-mixer.name = Misturador de Piratita block.blast-mixer.name = Misturador de Explosão block.solar-panel.name = Painel Solar block.solar-panel-large.name = Painel Solar Grande -block.oil-extractor.name = Extrator de Óleo +block.oil-extractor.name = Extrator de petróleo block.command-center.name = Centro de comando block.draug-factory.name = Fábrica de drone de mineração Draug block.spirit-factory.name = Fábrica de drone de reparo Spirit @@ -855,37 +870,37 @@ block.titan-factory.name = Fábrica de mech titan block.fortress-factory.name = Fábrica de mech Fortress block.revenant-factory.name = Fábrica de lutadores Revenant block.repair-point.name = Ponto de Reparo -block.pulse-conduit.name = Conduto de Pulso -block.phase-conduit.name = Conduto de Fase +block.pulse-conduit.name = Cano de Pulso +block.phase-conduit.name = Cano de Fase block.liquid-router.name = Roteador de Líquido block.liquid-tank.name = Tanque de Líquido block.liquid-junction.name = Junção de Líquido -block.bridge-conduit.name = Conduto-Ponte -block.rotary-pump.name = Bomba Rotatoria -block.thorium-reactor.name = Reator de Tório +block.bridge-conduit.name = Cano Ponte +block.rotary-pump.name = Bomba Rotatória +block.thorium-reactor.name = Reator a Tório block.mass-driver.name = Drive de Massa block.blast-drill.name = Broca de Explosão -block.thermal-pump.name = Cano térmico +block.thermal-pump.name = Bomba térmica block.thermal-generator.name = Gerador Térmico block.alloy-smelter.name = Fundidora de Liga block.mender.name = Reparador -block.mend-projector.name = Projetor mend -block.surge-wall.name = Parede de Surge -block.surge-wall-large.name = Parede de Surge grande +block.mend-projector.name = Projetor de reparo +block.surge-wall.name = Parede de liga de surto +block.surge-wall-large.name = Parede de liga de surto grande block.cyclone.name = Ciclone block.fuse.name = Fundir block.shock-mine.name = Mina de Choque -block.overdrive-projector.name = Projetor Overdrive -block.force-projector.name = Projetor Force -block.arc.name = Arc -block.rtg-generator.name = Gerador RTG -block.spectre.name = Espectra +block.overdrive-projector.name = Projetor de sobrecarga +block.force-projector.name = Projetor de campo de força +block.arc.name = Arco Elétrico +block.rtg-generator.name = Gerador GTR +block.spectre.name = Espectro block.meltdown.name = Fusão block.container.name = Contâiner block.launch-pad.name = Plataforma de lançamento block.launch-pad-large.name = Plataforma de lançamento grande team.blue.name = Azul -team.crux.name = red +team.crux.name = Vermelho team.sharded.name = orange team.orange.name = Laranja team.derelict.name = derelict @@ -912,91 +927,92 @@ tutorial.drill = Minerar manualmente é ineficiente.\n[accent]Brocas []podem min tutorial.drill.mobile = Minerar manualmente é ineficiente.\n[accent]Brocas []podem minerar automaticamente.\nToque na aba de brocas no canto inferior direito.\nSelecione a[accent] broca mecânica[].\nToque em um veio de cobre para colocá-la, então pressione a[accent] marca de verificação[] abaixo para confirmar sua seleção.\nPressione o[accent] botão "X"[] para cancelar o posicionamento. tutorial.blockinfo = Cada bloco tem diferentes status. Cada broca pode extrair certos minérios.\nPara checar as informações e os status de um bloco,[accent] toque o botão "?" enquanto o seleciona no menu de construção.[]\n\n[accent]Acesse os status da broca mecânica agora.[] tutorial.conveyor = [accent]Esteiras[] São usadas para transportar itens até o núcleo.\nFaça uma linha de Esteiras da mineradora até o núcleo. -tutorial.conveyor.mobile = [accent]Esteiras[] são usadas para transportar itens até o núcleo.\nFaça uma linha de esteiras da broca até o núcleo.\n[accent] Coloque uma linha segurando por alguns segundos[] e arrastando em uma direção.\n\n[accent]{0}/{1} conveyors placed in line\n[accent]0/1 items delivered -tutorial.turret = Estruturas defensivas devem ser construidas para repelir[LIGHT_GRAY] O inimigo[].\nConstrua uma torre dupla perto de sua base. -tutorial.drillturret = Torres duplas precisam de[accent] Cobre como munição []Para atirar.\nColoque uma broca próxima à torre para carregá-la com o cobre minerado. -tutorial.pause = Durante uma batalha, você pode[accent] pausar o jogo.[]\nVoce pode enfileirar construções enquanto o jogo está pausado.\n\n[accent]Pressione a barra de espaço para pausar. -tutorial.pause.mobile = During battle, you are able to[accent] pause the game.[]\nYou may queue buildings while paused.\n\n[accent]Press this button in the top left to pause. -tutorial.unpause = Now press space again to unpause. -tutorial.unpause.mobile = Now press it again to unpause. -tutorial.breaking = Blocks frequently need to be destroyed.\n[accent]Hold down right-click[] to destroy all blocks in a selection.[]\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection. -tutorial.breaking.mobile = Blocks frequently need to be destroyed.\n[accent]Select deconstruction mode[], then tap a block to begin breaking it.\nDestroy an area by holding down your finger for a few seconds[] and dragging in a direction.\nPress the checkmark button to confirm breaking.\n\n[accent]Destroy all the scrap blocks to the left of your core using area selection. -tutorial.withdraw = In some situations, taking items directly from blocks is necessary.\nTo do this, [accent]tap a block[] with items in it, then [accent]tap the item[] in the inventory.\nMultiple items can be withdrawn by [accent]tapping and holding[].\n\n[accent]Withdraw some copper from the core.[] -tutorial.deposit = Deposit items into blocks by dragging from your ship to the destination block.\n\n[accent]Deposit your copper back into the core.[] -tutorial.waves = O[LIGHT_GRAY] Inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 ondas. Construa mais torres. -tutorial.waves.mobile = The[lightgray] enemy[] approaches.\n\nDefend the core for 2 waves. Your ship will automatically fire at enemies.\nBuild more turrets and drills. Mine more copper. -tutorial.launch = Once you reach a specific wave, you are able to[accent] launch the core[], leaving your defenses behind and[accent] obtaining all the resources in your core.[]\nThese resources can then be used to research new technology.\n\n[accent]Press the launch button. -item.copper.description = Um material de estrutura util. Usado extensivamente em Maioria dos blocos. -item.lead.description = Material de começo basico. usado intensivamente em Blocos de transporte de liquidos e eletronicos. -item.metaglass.description = Composto de vidro super-Resistente. Extensivamente usado Para distribuição de líquido e armazem. -item.graphite.description = Mineralized carbon, used for ammunition and electrical insulation. -item.sand.description = Um material comum Que é usado intensivamente em derretimento, Tanto em ligas como fluxo. -item.coal.description = Combustivel pronto. -item.titanium.description = Um Material raro super leve, metal usado intensivamente na transportação de líquidos, Brocas e Aeronaves. +tutorial.conveyor.mobile = [accent]Esteiras[] são usadas para transportar itens até o núcleo.\nFaça uma linha de esteiras da broca até o núcleo.\n[accent] Coloque uma linha segurando por alguns segundos[] e arrastando em uma direção.\n\n[accent]{0}/{1} esteiras colocadas em linha\n[accent]0/1 itens entregues +tutorial.turret = Estruturas defensivas devem ser construidas para repelir[LIGHT_GRAY] o inimigo[].\nConstrua uma torre dupla perto de sua base. +tutorial.drillturret = Torretas duplas precisam de[accent] cobre[] como munição para atirar.\nColoque uma broca próxima à torre para carregá-la com o cobre minerado. +tutorial.pause = Durante uma batalha, você pode[accent] pausar o jogo.[]\nVocê pode enfileirar construções enquanto o jogo está pausado.\n\n[accent]Pressione a barra de espaço para pausar. +tutorial.pause.mobile = Durante uma batalha, você pode[accent] pausar o jogo.[]\nVocê pode enfileirar construções enquanto o jogo está pausado.\n\n[accent]Pressione este botão no canto superior direito para pausar. +tutorial.unpause = Agora pressione novamente a barra de espaço para despausar. +tutorial.unpause.mobile = Agora pressione novamente para despausar. +tutorial.breaking = Blocos precisam frequentemente ser destruídos.\n[accent]Segure e arraste o botão direito[] para destruir todos os blocos em uma seleção.[]\n\n[accent]Destrua todos esses blocos de sucata à esquerda do seu núcleo usando a seleção em área. +tutorial.breaking.mobile = Blocos precisam frequentemente ser destruídos.\n[accent]Selecione o modo de destruição (ícone de martelo)[], e toque em um bloco para começar a quebrar.\nDestrua uma área segurando seu dedo por alguns segundos[] e arrastando em uma direção.\nPressione o botão de "visto" para confirmar a destruição.\n\n[accent]Destrua todos esses blocos de sucata à esquerda do seu núcleo usando a seleção em área. +tutorial.withdraw = Em algumas situações é necessário pegar itens diretamente do bloco.\nPara fazer isto, [accent]toque em um bloco[] com itens e [accent]toque no item[] no inventário.\nMúltiplos itens podem ser removidos [accent]ao segurar[].\n\n[accent]Tire um pouco de cobre do núcleo.[] +tutorial.deposit = Deposite itens em blocos arrastando da sua nave até o bloco.\n\n[accent]Deposite seu cobre de volta no núcleo.[] +tutorial.waves = O[LIGHT_GRAY] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Construa mais torretas. +tutorial.waves.mobile = O[lightgray] inimigo[] se aproxima.\n\nDefenda seu núcleo por 2 hordas. Seu drone vai atirar nos inimigos automaticamente.\nConstrua mais torretas e brocas. Minere mais cobre. +tutorial.launch = Quando você atinge uma horda específica, Você é capaz de[accent] lançar o núcleo[], deixando suas defesas para trás e[accent] obtendo todos os recursos em seu núcleo.[]\nEstes recursos podem ser usados para pesquisar novas tecnologias.\n\n[accent]Pressione o botão lançar. + +item.copper.description = O material mais básico. Usado em todos os tipos de blocos. +item.lead.description = Material de começo basico. usado extensivamente em blocos de transporte de líquidos e eletrônicos. +item.metaglass.description = Composto de vidro super resistente. Extensivamente usado para distribuição e armazenagem de líquidos. +item.graphite.description = Carbono mineralizado, usado como munição e para isolação elétrica. +item.sand.description = Um material comum que é usado extensivamente em derretimento, tanto em ligas como em fluxo. +item.coal.description = Matéria vegetal fossilizada, formada muito depois de semeada. Usado extensivamente para produção de combustível e recursos. +item.titanium.description = Um material raro super leve usado extensivamente no transporte de líquidos, em brocas e drones aéreos. item.thorium.description = Um metal denso e radioativo, Usado como suporte material e combustivel nuclear. -item.scrap.description = Pedaços remanescentes de estruturas e unidades destruidas.. Contem traços de diferentes metais. -item.silicon.description = Condutor extremamente importante,Com aplicação em paneis solares e dispositivos complexos. -item.plastanium.description = Leve, Material dutil Usado em aeronaves Avançadas E munição de fragmentação. -item.phase-fabric.description = Uma substancia quase sem peso Usado em eletronica avançada E tecnologia de auto-reparo. -item.surge-alloy.description = Uma liga com propriedades unicas eletricas. -item.spore-pod.description = Usado em conversão para oleo, Combustivel e explosivos. -item.blast-compound.description = Um composto volátil usado em bombas em bombas em explosivos. Enquanto pode ser queimado como combustivel, Isso não é recomendado. -item.pyratite.description = Substância extremamente inflamavel usado em armas incendiarias. -liquid.water.description = Comumente usado em resfriamento e no processo de perda. -liquid.slag.description = Vários metais derretidos misturados juntos. POde ser separado em seus minerais constituentes, ou jogado nas unidades inimigas como uma arma. -liquid.oil.description = Pode ser queimado, explodido ou usado como resfriador. -liquid.cryofluid.description = A maneira mais eficiente de resfriar qualquer coisa. +item.scrap.description = Pedaços remanescentes de estruturas e unidades destruidas. Contem traços de diferentes metais. +item.silicon.description = Condutor extremamente importante, com aplicação em paineis solares e dispositivos complexos. +item.plastanium.description = Material leve e maleável usado em drones aéreos avançados e como munição de fragmentação. +item.phase-fabric.description = Uma substância quase sem peso usada em eletrônica avançada e tecnologia de auto-reparo. +item.surge-alloy.description = Uma liga avançada com propriedades elétricas únicas. +item.spore-pod.description = Uma cápsula de esporos sintéticos, sintetizada de concentrações atmosféricas para propósitos industriais. Usada para conversão em petróleo, explosivos e combustíveis. +item.blast-compound.description = Um composto instável usado em bombas e em explosivos. Sintetizado de cápsulas de esporos e outras substâncias voláteis. Uso como combustível não é recomendado. +item.pyratite.description = Substância extremamente inflamável usada em armas incendiárias. +liquid.water.description = O líquido mais útil, comumente usado em resfriamento de máquinas e no processamento de lixo. Dá pra beber, também. +liquid.slag.description = Vários metais derretidos misturados juntos. Pode ser separado em seus minerais constituentes, ou jogado nas unidades inimigas como uma arma. +liquid.oil.description = Um líquido usado na produção de materias avançados. Pode ser convertido em carvão como combustível, ou pulverizado e incendiado como arma. +liquid.cryofluid.description = A maneira mais eficiente de resfriar qualquer coisa, até seu corpo quando está calor, mas não faça isto. mech.alpha-mech.description = A Armadura padrão. Tem uma saida de dano e velocidade decente; Pode criar até 3 drones Para capacidades ofensivas aumentadas. -mech.delta-mech.description = Uma armadura rápida, De baixa durabilidade Feita para ataques rápidos. Da pouco dano as estruturas, Mas pode matar grandes grupos de unidades inimigas muito rapidamente Com sua arma ARC. +mech.delta-mech.description = Uma armadura rápida, de baixa durabilidade, feita para ataques rápidos. Dá pouco dano às estruturas, mas pode matar grandes grupos de unidades inimigas muito rapidamente com sua arma ARC. mech.tau-mech.description = A armadura de suporte. Conserta blocos aliados Atirando neles. Pode extinguir o fogo e consertar aliados em uma distancia Com sua habilidade de consertar. mech.omega-mech.description = Uma armadura volumosa e bem armadurada, Feita para assaltos da primeira linha. Sua habilidade de armadura Pode bloquear 90% de dano. -mech.dart-ship.description = Nave padrão. Consideravelmente leve e rapido, Tem pouca capacidade ofensiva E baixa velocidade de mineração. -mech.javelin-ship.description = Uma nave de espinhos de atacar e correr. Quando inicialmente lento, pode acelerar a altas velocidades e voar até bases inimigas, Dando altas quantidades de dano Com seus raios e habilidades. +mech.dart-ship.description = Nave padrão. Consideravelmente leve e rapido, Tem pouca capacidade ofensiva e baixa velocidade de mineração. +mech.javelin-ship.description = Uma nave de ataque hit-and-run (atacar e correr). Quando inicialmente lento, pode acelerar a altas velocidades e voar até bases inimigas, dando altas quantidades de dano com seus raios e mísseis. mech.trident-ship.description = Um bombardeiro pesado. Consideravelmente bem armadurado. -mech.glaive-ship.description = Uma nave armada, bem armadurada. Com um repetidor incendario equipado. Boa aceleração e maxima velocidade. -unit.draug.description = Um drone de mineração primitivo. Barato para produzir. Descartável. Minera automáticamente cobre e chumbo nas proximidades. Entrega os recursos minerados para o núcleo mais próximo. -unit.spirit.description = A unidade de drone inicial. Ele nasce no núcleo por padrão. Minera minérios automaticamente, Coleta itens e repara blocos. -unit.phantom.description = Uma unidade de drone avançada. Minera minérios automaticamente, Coleta itens e repara blocos automaticamente. Significantemente mais efetiva. -unit.dagger.description = Unidade terrestre basica, Forte em grupos. -unit.crawler.description = A ground unit consisting of a stripped-down frame with high explosives strapped on top. Not particular durable. Explodes on contact with enemies. -unit.titan.description = Uma unidade armadurada terrestre avançada. Usa carbide como munição. Ataca ambas as unidades de Aereas e terrestres. -unit.fortress.description = Uma unidade pesada de artilharia terrestre. -unit.eruptor.description = A heavy mech designed to take down structures. Fires a stream of slag at enemy fortifications, melting them and setting volatiles on fire. -unit.wraith.description = Uma unidade rapida, Interceptadora de bater e correr. -unit.ghoul.description = Um bombardeiro pesado. Usa composto de explosão Ou piratite como munição. -unit.revenant.description = A heavy, hovering missile array. -block.message.description = Stores a message. Used for communication between allies. -block.graphite-press.description = Compresses chunks of coal into pure sheets of graphite. -block.multi-press.description = An upgraded version of the graphite press. Employs water and power to process coal quickly and efficiently. -block.silicon-smelter.description = Reduz areia com carvão puro. Para fazer silicio. -block.kiln.description = Derrete chumbo e areia em Metavidro. Requer pequenas quantidades de energia. -block.plastanium-compressor.description = Produz plastânio usando óleo e titânio. -block.phase-weaver.description = Produz tecido de fase de torio radioativo e grandes quantidades de areia. -block.alloy-smelter.description = Produz liga de surto com titânio, chumbo, silicio e cobre. -block.cryofluidmixer.description = Combina água e titânio em crio-fluido que é mais eficiente em esfriar. -block.blast-mixer.description = Usa óleo para Transformar piratita em composto de explosão menos inflamavel mas mais explosivo -block.pyratite-mixer.description = Mistura carvão, Cobre e areia em piratita altamente inflamável -block.melter.description = Aquece pedra em altas temperaturas para fazer slag. -block.separator.description = Separa slag em seus minerais componentes, oferece o resultado refriado. -block.spore-press.description = Comprimi pods de esporos em óleo. -block.pulverizer.description = Esmaga pedra em areia. Util quando esta em falta de areia natural. -block.coal-centrifuge.description = Solidifes oil into chunks of coal. +mech.glaive-ship.description = Uma nave armada, bem armadurada. Com um repetidor incendario equipado. Boa aceleração e máxima velocidade. +unit.draug.description = Um drone de mineração primitivo. Barato para produzir. Descartável. Minera automaticamente cobre e chumbo nas proximidades. Entrega os recursos minerados para o núcleo mais próximo. +unit.spirit.description = Um drone draug modificado, desenhado para reparo em vez de mineração. Automaticamente conserta qualquer bloco danificado na área. +unit.phantom.description = Um drone avançado. Segue usuários. Ajuda na construção de blocos. +unit.dagger.description = A mais básica armadura terrestre. Barato para produzir. Esmagadora quando usada em enxames. +unit.crawler.description = Uma unidade terrestre que consiste em um despojado quadro com grandes explosivos amarrados no topo. Não particularmente durável. Explode no contato com inimigos. +unit.titan.description = Uma avançada unidade terrestre armadurada. Ataca alvos aéreos e terrestres. Equipada com dois pequenos lança chamas. +unit.fortress.description = Uma armadura de artilharia pesada. Equipada com dois canhões tipo granizo modificados para assalto de longa distância em estruturas e unidades inimigas. +unit.eruptor.description = Uma unidade pesada desenhada para derrubar estruturas. Atira um monte de escória nas fortificações inimigas, derretendo e colocando-as em chamas. +unit.wraith.description = Uma rápida, unidade interceptadora hit-and-run (atacar e correr). Mira em geradores de energia. +unit.ghoul.description = Um bombardeiro pesado. Rompe estruturas inimigas, mirando em infraestrutura crítica. +unit.revenant.description = Uma matriz de mísseis pesada e flutuante. +block.message.description = Armazena uma mensagem. Usado para comunicação entre aliados. +block.graphite-press.description = Comprime pedaços de carvão em lâminas de grafite puro. +block.multi-press.description = Uma versão melhorada da prensa de grafite. Usa água e energia para processar carvão rápida e eficientemente. +block.silicon-smelter.description = Reduz areia com carvão puro. Produz silício silicio. +block.kiln.description = Derrete chumbo e areia no composto conhecido como metavidro. Requer pequenas quantidades de energia. +block.plastanium-compressor.description = Produz plastânio usando petróleo e titânio. +block.phase-weaver.description = Produz tecido de fase usando tório radioativo e areia. Requer massivas quantidades de energia para funcionar. +block.alloy-smelter.description = Combina titânio, chumbo, silicio e cobre para produzir liga de surto. +block.cryofluidmixer.description = Mistura água e pó fino de titânio para produzir criofluido. Essencial para o uso do reator a tório. +block.blast-mixer.description = Quebra e mistura aglomerados de esporos com piratita para produzir composto de explosão. +block.pyratite-mixer.description = Mistura carvão, cobre e areia em piratita altamente inflamável +block.melter.description = Derrete sucata em escória para processamento posterior ou uso em torretas. +block.separator.description = Separa escória em seus minerais componentes, oferece o resultado refriado. +block.spore-press.description = Comprime cápsulas de esporos em petróleo. +block.pulverizer.description = Esmaga sucata em areia. Util quando esta em falta de areia natural. +block.coal-centrifuge.description = Solidifica petróleo em carvão. block.incinerator.description = Se livra de itens em excesso ou liquidos. block.power-void.description = Destroi qualquer energia que entre dentro. Apenas caixa de areia. block.power-source.description = Infinitivamente da energia. Apenas caixa de areia. block.item-source.description = Infinivamente da itens. Apenas caixa de areia. block.item-void.description = Destroi qualquer item que entre sem requerir energia. Apenas caixa de areia. block.liquid-source.description = Infinitivamente da Liquidos. Apenas caixa de areia. -block.copper-wall.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torres no começo. -block.copper-wall-large.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torres no começo.\nOcupa multiplos espaços. +block.copper-wall.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo. +block.copper-wall-large.description = Um bloco defensivo e barato.\nUtil para proteger o núcleo e torretas no começo.\nOcupa multiplos espaços. block.titanium-wall.description = A moderately strong defensive block.\nProvides moderate protection from enemies. block.titanium-wall-large.description = A moderately strong defensive block.\nProvides moderate protection from enemies.\nSpans multiple tiles. -block.thorium-wall.description = A strong defensive block.\nBoa proteção contra inimigos. +block.thorium-wall.description = Um bloco defensivo forte.\nBoa proteção contra inimigos. block.thorium-wall-large.description = Um bloco grande e defensivo.\nBoa proteção contra inimigos.\nOcupa multiplos espaços. block.phase-wall.description = Não tão forte quanto a parede de torio Mas vai defletir balas a menos que seja muito forte. block.phase-wall-large.description = Não tão forte quanto a parde de torio mas vai defletir balas a menos que seja muito forte.\nOcupa multiplos espaços. -block.surge-wall.description = O bloco defensivo mais forte.\nQue tem uma pequena chance de lancar um raio Contra o atacante. -block.surge-wall-large.description = O bloco defensivo mais forte.\nQue tem uma pequena chance de lancar um raio Contra o atacante.\nOcupa multiplos espaços +block.surge-wall.description = O bloco defensivo mais forte.\nQue tem uma pequena chance de lançar um raio Contra o atacante. +block.surge-wall-large.description = O bloco defensivo mais forte.\nQue tem uma pequena chance de lançar um raio Contra o atacante.\nOcupa multiplos espaços block.door.description = Uma pequena porta que pode ser aberta o fechada quando voce clica.\nSe aberta, Os inimigos podem atirar e passar. block.door-large.description = Uma grande porta que pode ser aberta o fechada quando voce clica.\nSe aberta, Os inimigos podem atirar e passar..\nOcupa multiplos espaços. block.mender.description = Periodically repairs blocks in its vicinity. Keeps defenses repaired in-between waves.\nOptionally uses silicon to boost range and efficiency. @@ -1004,7 +1020,7 @@ block.mend-projector.description = Periodicamente conserta as construções. block.overdrive-projector.description = Aumenta a velocidade de unidades proximas de geradores e esteiras. block.force-projector.description = Cria um campo de forca hexagonal em volta de si mesmo, Protegendo construções e unidades dentro de dano por balas. block.shock-mine.description = Danifica inimigos em cima da mina. Quase invisivel ao inimigo. -block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente Em torres ou construtores. Rotacionavel. +block.conveyor.description = Bloco de transporte de item basico. Move os itens a frente e os deposita automaticamente em torretas ou construtores. Rotacionavel. block.titanium-conveyor.description = Bloco de transporte de item avançado. Move itens mais rapidos que esteiras padrões. block.junction.description = Funciona como uma ponte Para duas esteiras que estejam se cruzando. Util em situações que tenha duas esteiras diferentes carregando materiais diferentes para lugares diferentes. block.bridge-conveyor.description = Bloco de transporte de itens avancado. Possibilita o transporte de itens acima de 3 blocos de construção ou paredes. @@ -1014,22 +1030,22 @@ block.router.description = Aceita itens de uma direção e os divide em 3 direç block.distributor.description = Um roteador avancada que espalhas os itens em 7 outras direções igualmente. block.overflow-gate.description = Uma combinação de roteador e divisor Que apenas manda para a esquerda e Direita se a frente estiver bloqueada. block.mass-driver.description = Bloco de transporte de itens supremo. Coleta itens severos e atira eles em outro mass driver de uma longa distancia. -block.mechanical-pump.description = Uma bomba barata mais saida de liquidos lenta, Sem consumo de energia. -block.rotary-pump.description = Uma bomba avancada que duplica a velocidade da saida de liquida usando energia. -block.thermal-pump.description = A melhor bomba. Trez vezes mais rapida que a bomba mecanica e a unica bomba capaz de pegar lava. -block.conduit.description = Bloco de transporte de liquido basico. Funciona como a esteira, Mas com liquidos. Melhor usado com extratores, Bombas ou condutos. -block.pulse-conduit.description = Bloco avancado de transporte de liquido. Transporta liquidos mais rapido E armazena mais que os condutos padrões. -block.liquid-router.description = Aceita liquidos de uma direcão e os joga em 3 direções igualmente. Pode armazenar uma certa quantidade de liquido. Util para espalhar liquidosd a fonte para multiplos alvos. +block.mechanical-pump.description = Uma bomba barata com baixa saída de líquidos, mas sem consumo de energia. +block.rotary-pump.description = Uma bomba avançada. Bombeia mais líquido, mas requer energia. +block.thermal-pump.description = A bomba final. +block.conduit.description = Bloco básico de transporte de líquidos. Move líquidos para a frente. Usado em conjunto com bombas e outros canos. +block.pulse-conduit.description = Bloco avancado de transporte de liquido. Transporta liquidos mais rápido e armazena mais que os canos padrões. +block.liquid-router.description = Aceita liquidos de uma direcão e os joga em 3 direções igualmente. Pode armazenar uma certa quantidade de liquido. Util para espalhar liquidos de uma fonte para multiplos alvos. block.liquid-tank.description = Armazena grandes quantidades de liquido. Use quando a demanda de materiais não for constante ou para guardar itens para resfriar blocos vitais. -block.liquid-junction.description = Age como uma ponte para dois canos que se cruzam. Util em situações que tem dois condutos carregando liquidos diferentes até localizações diferentes. +block.liquid-junction.description = Age como uma ponte para dois canos que se cruzam. Útil em situações em que há dois cano carregando liquidos diferentes até localizações diferentes. block.bridge-conduit.description = Bloco de transporte de liquidos avancados. Possibilita o transporte de liquido sobre 3 blocos acima de construções ou paredes -block.phase-conduit.description = Bloco avancado de transporte de liquido. Usa energia para teleportar liquidos conduto de fase sobre uma distancia severa. -block.power-node.description = Transmite poder em nodos. Maximo de 4 fontes de energia, sinks ou nodos podem ser conectados. Os nodos vão receber energia de ou dar energia para qualquer bloco adjacente. -block.power-node-large.description = Tem um raio maior que o nodo de energia e pode conectar até 6 fontes de energia, sinks ou nodos. -block.surge-tower.description = An extremely long-range power node with fewer available connections. -block.battery.description = Guarda energia sempre que tiver em abundancia e da energia sempre que precisar enquanto tiver capacidade. -block.battery-large.description = Guarda muito mais energia que uma beteria comum -block.combustion-generator.description = Gera poder usando combustivel ou oleo. +block.phase-conduit.description = Bloco avancado de transporte de liquido. Usa energia para teleportar liquidos para outro cano de fase em uma grande distância. +block.power-node.description = Transmite energia para células conectadas. A célula vai receber energia ou alimentar qualquer bloco adjacente. +block.power-node-large.description = Uma célula de energia avançada com maior alcance e mais conexões. +block.surge-tower.description = Uma célula de energia com um extremo alcance mas com menos conexões disponíveis. +block.battery.description = Armazena energia em tempos de energia excedente. Libera energia em tempos de déficit. +block.battery-large.description = Guarda muito mais energia que uma beteria comum. +block.combustion-generator.description = Gera energia usando combustível ou petróleo. block.thermal-generator.description = Gera uma quantidade grande de energia usando lava. block.turbine-generator.description = Mais eficiente que o gerador de Combustão, Mas requer agua adicional. block.differential-generator.description = Generates large amounts of energy. Utilizes the temperature difference between cryofluid and burning pyratite. diff --git a/core/assets/bundles/bundle_uk_UA.properties b/core/assets/bundles/bundle_uk_UA.properties index 6746216066..4e709d929f 100644 --- a/core/assets/bundles/bundle_uk_UA.properties +++ b/core/assets/bundles/bundle_uk_UA.properties @@ -48,7 +48,7 @@ minimap = Мінімапа close = Закрити website = Веб-сайт quit = Вихід -save.quit = Save & Quit +save.quit = Зберегти & Вийти maps = Мапи maps.browse = Перегляд мап continue = Продовжити @@ -98,7 +98,7 @@ host = Сервер hosting = [accent]Відкриття сервера… hosts.refresh = Оновити hosts.discovering = Пошук локальних ігор -hosts.discovering.any = Discovering games +hosts.discovering.any = Пошук ігор server.refreshing = Оновлення сервера hosts.none = [lightgray]Локальних ігр не знайдено host.invalid = [scarlet]Не вдалося підключитися до сервера. @@ -122,16 +122,16 @@ server.version = [lightgray]Версія: {0} server.custombuild = [yellow]Користувацька збірка confirmban = Ви дійсно хочете заблокувати цього гравця? confirmkick = Ви дійсно хочете викинути цього гравця? -confirmvotekick = Are you sure you want to vote-kick this player? +confirmvotekick = Ви дійсно хочете вигнати цього гравця за допомогою голосуванняr? confirmunban = Ви дійсно хочете розблокувати цього гравця? confirmadmin = Ви дійсно хочете зробити цього гравця адміністратором? confirmunadmin = Ви дійсно хочете видалити статус адміністратора з цього гравця? joingame.title = Приєднатися до гри joingame.ip = IP: disconnect = Відключено. -disconnect.error = Connection error. -disconnect.closed = Connection closed. -disconnect.timeout = Timed out. +disconnect.error = Помилка з’єднання. +disconnect.closed = З'єднання закрито. +disconnect.timeout = Час вийшов. disconnect.data = Не вдалося завантажити дані світу! cantconnect = Не вдалося під’єднатися до гри ([accent]{0}[]). connecting = [accent]Підключення… @@ -159,7 +159,7 @@ save.rename = Перейменувати save.rename.text = Нова назва: selectslot = Виберіть збереження. slot = [accent]Слот {0} -editmessage = Edit Message +editmessage = Редагувати повідомлення save.corrupted = [accent]Збережений файл пошкоджено або недійсний! \nЯкщо ви щойно оновили свою гру, це, мабуть, є зміною формату збереження та [scarlet] не є[] помилкою. empty = <Порожньо> on = Увімкнено @@ -167,13 +167,14 @@ off = Вимкнено save.autosave = Автозбереження: {0} save.map = Мапа: {0} save.wave = Хвиля {0} -save.mode = Gamemode: {0} +save.mode = Режим гри: {0} save.date = Останнє збереження save.playtime = Час гри: {0} warning = Попередження confirm = Підтвердження delete = Видалити view.workshop = Переглянути в Майстерні +workshop.listing = Редагувати список Майстерні ok = ОК open = Відкрити customize = Налаштувати правила @@ -211,10 +212,15 @@ map.nospawn.pvp = У цієї мапи немає ворожих ядер, в я map.nospawn.attack = У цієї мапи немає ворожих ядер, в яких гравець може з’явитися! Додайте [SCARLET]червоне[] ядро до цієї мапи в редакторі. map.invalid = Помилка завантаження мапи: пошкоджений або невірний файл мапи. map.publish.error = Помилка при опублікуванні мапи: {0} +map.update = Оновити мапу +map.load.error = Помилка отримання даних з Майстерню: {0} +map.missing = Цю карту було видалено або переміщено.\n[lightgray]Перелік у Майстерні автоматично від’єднано від мапи. +map.menu = Виберіть, що ви хочете зробити з цією мапою. +map.changelog = Список змік (необов’язково): map.publish.confirm = Ви дійсно хочете опублікувати цю мапу?\n\n[lightgray]Переконайтеся, що спершу ви згодні з Ліцензійною угодою Steam, або ваші мапи не з’являться! eula = Ліцензійна угода -map.publish = Map published. -map.publishing = [accent]Publishing map... +map.publish = Мапа опублікована. +map.publishing = [accent]Публікації мапи... editor.brush = Пензлик editor.openin = Відкрити в редакторі editor.oregen = Генерація руд @@ -222,7 +228,7 @@ editor.oregen.info = Генерація руд: editor.mapinfo = Інформація про мапу editor.author = Автор: editor.description = Опис: -editor.nodescription = A map must have a description of at least 4 characters before being published. +editor.nodescription = Мапа повинна мати щонаймеше 4 символи для публікації. editor.waves = Хвилі: editor.rules = Правила: editor.generation = Генерація: @@ -246,7 +252,7 @@ waves.invalid = Недійсні хвилі у буфері обміну. waves.copied = Хвилі скопійовані. waves.none = Вороги не були встановлені.\nЗазначимо, що пусті хвилі будуть автоматично замінені звичайною хвилею. editor.default = [lightgray]<За замовчуванням> -details = Details... +details = Деталі... edit = Редагувати… editor.name = Назва: editor.spawn = Створити бойову одиницю @@ -256,7 +262,7 @@ editor.errorload = Помилка завантаження зображення: editor.errorsave = Помилка збереження зображення:\n[accent]{0} editor.errorimage = Це зображення, а не мапа. Не змінюйте розширення, очікуючи, що це запрацює.\n\nЯкщо Ви хочете імпортувати застарілку мапу, то використовуйте кнопку «Імпортувати застаріле зображення» у редакторі. editor.errorlegacy = Ця мапа занадто стара і використовує попередній формат мапи, який більше не підтримується. -editor.errornot = This is not a map file. +editor.errornot = Це не мапа. editor.errorheader = Цей файл мапи недійсний або пошкоджений. editor.errorname = Мапа не має імені. Може Ви намагаєтеся завантажити збереження? editor.update = Оновити @@ -289,7 +295,7 @@ editor.resizemap = Змінити розмір мапи editor.mapname = Назва мапи: editor.overwrite = [accent]Попередження!\nЦе перезаписує існуючу мапу. editor.overwrite.confirm = [scarlet]Попередження![] Мапа з такою назвою вже існує. Ви впевнені, що хочете переписати її? -editor.exists = A map with this name already exists. +editor.exists = Мапа за такою назвою вже існує. editor.selectmap = Виберіть мапу для завантаження: toolmode.replace = Замінити toolmode.replace.description = Малює тільки\nна суцільних блоках. @@ -369,7 +375,7 @@ launch.skip.confirm = Якщо Ви пропустите зараз, Ви не uncover = Розкрити configure = Вивантажити конфігурацію configure.locked = [lightgray]Можливість розблокувати вивантаження ресурсів буде доступна на {0}-тій хвилі. -configure.invalid = Amount must be a number between 0 and {0}. +configure.invalid = Кількість повинна бути числом між 0 та {0}. zone.unlocked = Зона «[lightgray]{0}» тепер розблокована. zone.requirement.complete = Ви досягли {0}-тої хвилі,\nВимоги до зони «{1}» виконані. zone.config.complete = Ви досягли {0}-тої хвилі.\nМожливість вивантаження ресурсів тепер розблокована. @@ -466,7 +472,7 @@ blocks.boosteffect = Прискорювальний ефект blocks.maxunits = Максимальна кількість активних одиниць blocks.health = Здоров’я blocks.buildtime = Час будівництва -blocks.buildcost = Build Cost +blocks.buildcost = Вартість будування blocks.inaccuracy = Розкид blocks.shots = Постріли blocks.reload = Постріли/секунду @@ -475,7 +481,7 @@ bar.drilltierreq = Потребується кращий бур bar.drillspeed = Швидкість буріння: {0}/с bar.efficiency = Ефективність: {0}% bar.powerbalance = Енергія: {0}/с -bar.powerstored = Stored: {0}/{1} +bar.powerstored = Зберігає: {0}/{1} bar.poweramount = Енергія: {0} bar.poweroutput = Вихідна енергія: {0} bar.items = Предмети: {0} @@ -524,7 +530,7 @@ setting.antialias.name = Згладжування[lightgray] (потребує setting.indicators.name = Показувати у сторону ворогів та союзників setting.autotarget.name = Авто-стрільба setting.keyboard.name = Миш+Керування з клавіатури -setting.touchscreen.name = Touchscreen Controls +setting.touchscreen.name = Керування сенсорним екраном setting.fpscap.name = Максимальний FPS setting.fpscap.none = Необмежений setting.fpscap.text = {0} FPS @@ -534,7 +540,7 @@ setting.difficulty.training = Навчання setting.difficulty.easy = Легка setting.difficulty.normal = Нормальна setting.difficulty.hard = Важка -setting.difficulty.insane = Зачистка +setting.difficulty.insane = Неможлива setting.difficulty.name = Складність: setting.screenshake.name = Тряска екрану setting.effects.name = Ефекти @@ -555,9 +561,10 @@ setting.sfxvol.name = Гучність звукових ефектів setting.mutesound.name = Заглушити звук setting.crashreport.name = Відсилати анонімні звіти про аварійне завершення гри setting.savecreate.name = Автоматичне створення збережень -setting.publichost.name = Public Game Visibility +setting.publichost.name = Загальнодоступність гри setting.chatopacity.name = Непрозорість чату setting.playerchat.name = Відображати хмару чата над гравцями +public.confirm = Ви хочете зробити цю гру загальнодоступною?\n[lightgray]Це можна змінити у Налаштування->Гра->Public Game Visibility. uiscale.reset = Масштаб користувальницького інтерфейсу було змінено.\nНатисніть «ОК» для підтверждення цього масшатабу.\n[scarlet]Повернення налаштувань і вихід через[accent] {0}[] … uiscale.cancel = Скасувати & Вийти setting.bloom.name = Світіння @@ -567,7 +574,7 @@ category.general.name = Основне category.view.name = Перегляд category.multiplayer.name = Мережева гра command.attack = Атакувати -command.rally = Rally +command.rally = Точка збору command.retreat = Відступити keybind.gridMode.name = Вибрати блок keybind.gridModeShift.name = Вибрати категорію @@ -604,6 +611,7 @@ mode.survival.name = Хвилі mode.survival.description = Звичайний режим. В цьому режимі треба самим добувати ресурси та хвилі йдуть автоматично.\n[gray]Потребуються точки появи ворогів для гри. mode.sandbox.name = Пісочниця mode.sandbox.description = В режимі «Пісочниця» незкінченні ресурси(але їх все одно можно добувати) та хвилі йдуть за вашим бажанням. +mode.editor.name = Редактор mode.pvp.name = PVP mode.pvp.description = боріться проти інших гравців.\n[gray]Для гри потрібно принаймні 2 ядра різного кольору на мапі. mode.attack.name = Атака @@ -784,13 +792,13 @@ block.hail.name = Град block.lancer.name = Списоносець block.conveyor.name = Конвеєр block.titanium-conveyor.name = Титановий конвеєр -block.armored-conveyor.name = Armored Conveyor -block.armored-conveyor.description = Moves items at the same speed as titanium conveyors, but possesses more armor. Does not accept inputs from the sides from anything but other conveyors. +block.armored-conveyor.name = Броньований конвеєр +block.armored-conveyor.description = Переміщує предмети з тією ж швидкістю, як і титанові конвеєри, але має більше міцності. Не приймає введення з боків ні з чого, крім інших конвеєрів. block.junction.name = Перехрестя block.router.name = Маршрутизатор block.distributor.name = Розподілювач block.sorter.name = Сортувальник -block.message.name = Message +block.message.name = Повідомлення block.overflow-gate.name = Надмірний затвор block.silicon-smelter.name = Кремнієвий плавильний завод block.phase-weaver.name = Фазовий ткач @@ -879,8 +887,8 @@ block.overdrive-projector.name = Сверхприводний проектор block.force-projector.name = Силовий проектор block.arc.name = Дуга block.rtg-generator.name = Радіоізотопний термоелектричний генератор -block.spectre.name = Мара -block.meltdown.name = Катастрофа +block.spectre.name = Спектр +block.meltdown.name = Випалювач block.container.name = Склад block.launch-pad.name = Стартовий майданчик block.launch-pad-large.name = Великий стартовий майданчик @@ -892,7 +900,7 @@ team.derelict.name = Залишена team.green.name = Зелена team.purple.name = Фіолетова unit.spirit.name = Ремонтувальний дрон «Привид» -unit.draug.name = Draug Miner Drone +unit.draug.name = Добувний дрон «Драугр» unit.phantom.name = Будівельний дрон «Фантом» unit.dagger.name = Кинджал unit.crawler.name = Камікадзе @@ -907,7 +915,7 @@ unit.eradicator.name = Викорінювач unit.lich.name = Лич unit.reaper.name = Жнець tutorial.next = [lightgray]<Натисніть для продовження> -tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочність з[accent] видобування міді[]. Натисніть на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді +tutorial.intro = Ви розпочали[scarlet] навчання по Mindustry.[]\nРозпочність з[accent] видобування міді[]. Використовуйте [[WASD] для руху, а потім натисність на мідну жилу біля вашого ядра, щоб зробити це.\n\n[accent]{0}/{1} міді tutorial.drill = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисніть на вкладку свердла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням.\n[accent]Натисніть ПКМ[], щоб зупинити будування. tutorial.drill.mobile = Добування вручну неефективне.\n[accent]Бури []можуть добувати автоматично.\nНатисність на вкладку сведла знизу зправа.\nВиберіть[accent] механічний бур[]. Розмістіть його на мідній жилі натисканням, потім натисність на [accent] галочку[] нижче, щоб підтвердити розміщення to confirm your selection.\nPress the[accent] X button[] to cancel placement. tutorial.blockinfo = Кожен блок має різні характеристики. Кожний бур може видобувати тільки певні руди.\nЩоб переглянути інформацію та характеристики блока,[accent] натисність на кнопку «?», коли Ви вибрали блок у меню будування.[]\n\n[accent]Перегляньте характеристику Механічного бура прямо зараз.[] @@ -965,7 +973,7 @@ unit.eruptor.description = Важкий мех, призначеней для з unit.wraith.description = Швидкий перехоплювач, який використовується для тактики «атакуй і біжи». Пріоритет — енергетичні генератори. unit.ghoul.description = Важкий килимовий бомбардувальник. Пробиває ворожі структури, орієнтуючись на віжливу інфраструктуру. unit.revenant.description = Важкий ракетний масив. -block.message.description = Stores a message. Used for communication between allies. +block.message.description = Зберігає повідомлення. Використовується для комунікаціх між союзниками. block.graphite-press.description = Стискає шматки вугілля в чисті аркуші графіту. block.multi-press.description = Модернізована версія графітового преса. Використовує воду та енергію для швидкої та ефективної переробки вугілля. block.silicon-smelter.description = Змішує пісок з чистим вугіллям. Виробляє кремній. @@ -1050,7 +1058,7 @@ block.core-foundation.description = Друга версія ядра. Краще block.core-nucleus.description = Третя і остання ітерація капсули ядра. Надзвичайно добре броньований. Зберігає величезні обсяги ресурсів. block.vault.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів із сховища. block.container.description = Зберігає велику кількість предметів кожного типу. Блок розвантажувача може використовуватися для отримання предметів із сховища. -block.unloader.description = Вивантажує предмети з контейнера, склепіння або серцевини на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок. +block.unloader.description = Вивантажує предмети з блока, який не переміщує предмети, на конвеєр або безпосередньо в сусідній блок. Тип предмета для завантаження можна змінити, натиснувши на блок. block.launch-pad.description = Запускає партії предметів без необхідності запуску ядра. block.launch-pad-large.description = Покращена версія стартового майданчика. Зберігає більше предметів. Запускається частіше. block.duo.description = Невелика дешева башта. Корисна проти наземних одиниць. diff --git a/core/assets/sounds/thruster.ogg b/core/assets/sounds/thruster.ogg index d8e7efb086..cba59f95ab 100644 Binary files a/core/assets/sounds/thruster.ogg and b/core/assets/sounds/thruster.ogg differ diff --git a/core/assets/sprites/sprites.atlas b/core/assets/sprites/sprites.atlas index 06acf2f5d6..99e4d04fa2 100644 --- a/core/assets/sprites/sprites.atlas +++ b/core/assets/sprites/sprites.atlas @@ -4,688 +4,506 @@ size: 2048,2048 format: RGBA8888 filter: Nearest,Nearest repeat: none -force-projector - rotate: false - xy: 521, 478 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -force-projector-icon-full - rotate: false - xy: 521, 478 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 force-projector-top rotate: false - xy: 489, 380 + xy: 651, 752 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -mend-projector - rotate: false - xy: 1676, 1595 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -mend-projector-icon-full - rotate: false - xy: 1676, 1595 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 mend-projector-top rotate: false - xy: 1742, 1591 + xy: 1177, 1097 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -mender - rotate: false - xy: 1443, 905 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mender-icon-full - rotate: false - xy: 1443, 905 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 mender-top rotate: false - xy: 1443, 871 + xy: 1959, 1169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -overdrive-projector - rotate: false - xy: 1874, 1591 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -overdrive-projector-icon-full - rotate: false - xy: 1874, 1591 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 overdrive-projector-top rotate: false - xy: 1940, 1591 + xy: 1309, 1229 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 shock-mine rotate: false - xy: 1425, 429 + xy: 1021, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-arrow rotate: false - xy: 1103, 886 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor - rotate: false - xy: 1103, 716 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conveyor-icon-full - rotate: false - xy: 1103, 716 + xy: 817, 450 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-bridge rotate: false - xy: 1137, 991 + xy: 817, 314 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-end rotate: false - xy: 1137, 957 + xy: 853, 512 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 center rotate: false - xy: 1137, 923 + xy: 887, 512 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-0 rotate: false - xy: 1037, 376 + xy: 797, 1736 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -armored-conveyor-icon-full +block-armored-conveyor-full rotate: false - xy: 1037, 376 + xy: 797, 1736 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-1 rotate: false - xy: 1071, 376 + xy: 1599, 1121 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-2 rotate: false - xy: 1033, 342 + xy: 1721, 1243 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-0-3 rotate: false - xy: 1033, 308 + xy: 1599, 1087 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-0 rotate: false - xy: 1067, 342 + xy: 1599, 1053 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-1 rotate: false - xy: 1067, 308 + xy: 1599, 1019 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-2 rotate: false - xy: 1033, 274 + xy: 1599, 985 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-1-3 rotate: false - xy: 1067, 274 + xy: 1599, 951 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-0 rotate: false - xy: 1029, 240 + xy: 1599, 917 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-1 rotate: false - xy: 1029, 206 + xy: 1599, 883 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-2 rotate: false - xy: 1063, 240 + xy: 1599, 849 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-2-3 rotate: false - xy: 1063, 206 + xy: 1599, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-0 rotate: false - xy: 1037, 172 + xy: 1599, 781 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-1 rotate: false - xy: 1037, 138 + xy: 1775, 1369 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-2 rotate: false - xy: 1037, 104 + xy: 1775, 1335 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-3-3 rotate: false - xy: 1037, 70 + xy: 1775, 1301 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-0 rotate: false - xy: 1037, 36 + xy: 1809, 1373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-1 rotate: false - xy: 1071, 172 + xy: 1809, 1339 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-2 rotate: false - xy: 1071, 138 + xy: 1843, 1373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 armored-conveyor-4-3 rotate: false - xy: 1071, 104 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-0-0 - rotate: false - xy: 1239, 939 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-icon-full - rotate: false - xy: 1239, 939 + xy: 1809, 1305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-1 rotate: false - xy: 1205, 905 + xy: 919, 429 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-2 rotate: false - xy: 1171, 871 + xy: 919, 395 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-0-3 rotate: false - xy: 1341, 1007 + xy: 919, 361 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-0 rotate: false - xy: 1307, 973 + xy: 919, 327 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-1 rotate: false - xy: 1273, 939 + xy: 919, 293 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-2 rotate: false - xy: 1239, 905 + xy: 955, 489 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-1-3 rotate: false - xy: 1205, 871 + xy: 989, 489 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-0 rotate: false - xy: 1171, 837 + xy: 955, 455 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-1 rotate: false - xy: 1375, 1007 + xy: 989, 455 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-2 rotate: false - xy: 1341, 973 + xy: 953, 421 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-2-3 rotate: false - xy: 1307, 939 + xy: 953, 387 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-0 rotate: false - xy: 1273, 905 + xy: 987, 421 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-1 rotate: false - xy: 1239, 871 + xy: 953, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-2 rotate: false - xy: 1205, 837 + xy: 987, 387 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-3-3 rotate: false - xy: 1171, 803 + xy: 953, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-0 rotate: false - xy: 1409, 1007 + xy: 987, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-1 rotate: false - xy: 1375, 973 + xy: 987, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-2 rotate: false - xy: 1341, 939 + xy: 953, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conveyor-4-3 rotate: false - xy: 1307, 905 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-0-0 - rotate: false - xy: 1101, 274 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-icon-full - rotate: false - xy: 1101, 274 + xy: 987, 285 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-1 rotate: false - xy: 1097, 240 + xy: 863, 274 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-2 rotate: false - xy: 1097, 206 + xy: 1667, 1125 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-0-3 rotate: false - xy: 1105, 172 + xy: 1667, 1091 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-0 rotate: false - xy: 1105, 138 + xy: 1667, 1057 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-1 rotate: false - xy: 1105, 104 + xy: 1667, 1023 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-2 rotate: false - xy: 1105, 70 + xy: 1667, 989 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-1-3 rotate: false - xy: 1105, 36 + xy: 1667, 955 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-0 rotate: false - xy: 1123, 2 + xy: 1667, 921 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-1 rotate: false - xy: 1135, 360 + xy: 1667, 887 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-2 rotate: false - xy: 1135, 326 + xy: 1667, 853 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-2-3 rotate: false - xy: 1135, 292 + xy: 1667, 819 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-0 rotate: false - xy: 1169, 360 + xy: 1667, 785 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-1 rotate: false - xy: 1169, 326 + xy: 1701, 1107 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-2 rotate: false - xy: 1169, 292 + xy: 1701, 1073 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-3-3 rotate: false - xy: 1203, 361 + xy: 1701, 1039 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-0 rotate: false - xy: 1203, 327 + xy: 1701, 1005 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-1 rotate: false - xy: 1237, 361 + xy: 1701, 971 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-2 rotate: false - xy: 1203, 293 + xy: 1701, 937 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 titanium-conveyor-4-3 rotate: false - xy: 1237, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -distributor - rotate: false - xy: 525, 118 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -distributor-icon-full - rotate: false - xy: 525, 118 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -junction - rotate: false - xy: 1349, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction-icon-full - rotate: false - xy: 1349, 667 + xy: 1701, 903 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 mass-driver-base rotate: false - xy: 651, 750 + xy: 852, 1657 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -overflow-gate - rotate: false - xy: 1187, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -overflow-gate-icon-full - rotate: false - xy: 1187, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor - rotate: false - xy: 1255, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-icon-full - rotate: false - xy: 1255, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 phase-conveyor-arrow rotate: false - xy: 1289, 565 + xy: 1747, 1165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-bridge rotate: false - xy: 1323, 599 + xy: 1781, 1165 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conveyor-end rotate: false - xy: 1187, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -router - rotate: false - xy: 1289, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -router-icon-full - rotate: false - xy: 1289, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sorter - rotate: false - xy: 1459, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sorter-icon-full - rotate: false - xy: 1459, 429 + xy: 1713, 1141 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -699,707 +517,511 @@ blast-drill index: -1 blast-drill-rim rotate: false - xy: 526, 1595 + xy: 323, 1392 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-rotator rotate: false - xy: 453, 1392 + xy: 526, 1595 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 blast-drill-top rotate: false - xy: 163, 1031 + xy: 453, 1392 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 drill-top rotate: false - xy: 591, 52 + xy: 1111, 1229 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 turbine-generator-liquid rotate: false - xy: 591, 52 + xy: 1111, 1229 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 laser-drill rotate: false - xy: 685, 184 + xy: 749, 946 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rim rotate: false - xy: 583, 1436 + xy: 749, 848 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-rotator rotate: false - xy: 681, 1436 + xy: 749, 750 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 laser-drill-top rotate: false - xy: 609, 1338 + xy: 749, 652 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 mechanical-drill rotate: false - xy: 1412, 1557 + xy: 1309, 1295 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-rotator rotate: false - xy: 1544, 1595 + xy: 1045, 965 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 mechanical-drill-top rotate: false - xy: 1610, 1595 + xy: 1111, 1031 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 oil-extractor rotate: false - xy: 749, 1142 + xy: 852, 1559 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-liquid rotate: false - xy: 749, 946 + xy: 950, 1657 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-rotator rotate: false - xy: 749, 848 + xy: 950, 1559 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 oil-extractor-top rotate: false - xy: 749, 750 + xy: 1048, 1657 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 pneumatic-drill rotate: false - xy: 1214, 1491 + xy: 1309, 1163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-rotator rotate: false - xy: 1346, 1491 + xy: 1375, 1229 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pneumatic-drill-top rotate: false - xy: 1412, 1491 + xy: 1045, 833 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor rotate: false - xy: 913, 823 + xy: 1441, 1097 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-liquid rotate: false - xy: 913, 757 + xy: 1441, 1031 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-rotator rotate: false - xy: 979, 757 + xy: 1441, 965 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 water-extractor-top rotate: false - xy: 913, 691 + xy: 1441, 899 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 block-border rotate: false - xy: 1103, 988 + xy: 1877, 1339 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-middle rotate: false - xy: 1103, 954 + xy: 695, 114 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-select rotate: false - xy: 1103, 920 + xy: 1210, 675 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-liquid rotate: false - xy: 1205, 973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message - rotate: false - xy: 1443, 837 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message-icon-full - rotate: false - xy: 1443, 837 + xy: 851, 376 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 place-arrow rotate: false - xy: 717, 554 + xy: 1048, 1559 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-1-0 rotate: false - xy: 1808, 1459 + xy: 1177, 965 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-1-1 rotate: false - xy: 1874, 1459 + xy: 1243, 1031 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-0 rotate: false - xy: 1940, 1459 + xy: 1309, 1097 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-2-1 rotate: false - xy: 723, 96 + xy: 1375, 1163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rubble-3-0 rotate: false - xy: 783, 260 + xy: 1244, 1657 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-3-1 rotate: false - xy: 783, 260 + xy: 1244, 1657 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 rubble-4-0 rotate: false - xy: 293, 742 + xy: 423, 742 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 rubble-4-1 rotate: false - xy: 293, 742 + xy: 423, 742 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -bridge-conduit - rotate: false - xy: 1103, 852 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -bridge-conduit-icon-full - rotate: false - xy: 1103, 852 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 bridge-conduit-arrow rotate: false - xy: 1103, 818 + xy: 817, 416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conveyor-arrow rotate: false - xy: 1103, 818 + xy: 817, 416 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-bridge rotate: false - xy: 1103, 784 + xy: 817, 382 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 bridge-conduit-end rotate: false - xy: 1103, 750 + xy: 817, 348 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom rotate: false - xy: 1137, 753 + xy: 887, 478 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-0 rotate: false - xy: 1137, 719 + xy: 921, 497 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-1 rotate: false - xy: 1171, 1007 + xy: 851, 444 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-2 rotate: false - xy: 1205, 1007 + xy: 851, 410 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-3 rotate: false - xy: 1205, 1007 + xy: 851, 410 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-4 rotate: false - xy: 1205, 1007 + xy: 851, 410 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-6 rotate: false - xy: 1205, 1007 + xy: 851, 410 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-bottom-5 rotate: false - xy: 1171, 973 + xy: 885, 444 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-0 rotate: false - xy: 1171, 939 + xy: 885, 410 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-1 rotate: false - xy: 1273, 1007 + xy: 851, 342 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-2 rotate: false - xy: 1239, 973 + xy: 885, 376 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-3 rotate: false - xy: 1205, 939 + xy: 885, 342 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-3 rotate: false - xy: 1205, 939 + xy: 885, 342 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-4 rotate: false - xy: 1171, 905 + xy: 851, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-5 rotate: false - xy: 1307, 1007 + xy: 885, 308 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 conduit-top-6 rotate: false - xy: 1273, 973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-junction - rotate: false - xy: 1417, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-junction-icon-full - rotate: false - xy: 1417, 667 + xy: 921, 463 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-bottom rotate: false - xy: 1213, 633 + xy: 1652, 713 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-liquid rotate: false - xy: 1281, 633 + xy: 1670, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-router-top rotate: false - xy: 1315, 633 + xy: 1670, 645 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 liquid-tank-bottom rotate: false - xy: 651, 1240 + xy: 754, 1632 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-liquid rotate: false - xy: 651, 1044 + xy: 754, 1534 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 liquid-tank-top rotate: false - xy: 651, 946 + xy: 779, 1436 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -mechanical-pump - rotate: false - xy: 1443, 973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mechanical-pump-icon-full - rotate: false - xy: 1443, 973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit - rotate: false - xy: 1255, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-icon-full - rotate: false - xy: 1255, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 phase-conduit-arrow rotate: false - xy: 1289, 599 + xy: 1993, 1169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-bridge rotate: false - xy: 1187, 463 + xy: 1679, 1167 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 phase-conduit-end rotate: false - xy: 1221, 497 + xy: 1713, 1175 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-0 rotate: false - xy: 1221, 429 + xy: 1781, 1131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-1 rotate: false - xy: 1255, 463 + xy: 1815, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-2 rotate: false - xy: 1289, 497 + xy: 1849, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-4 rotate: false - xy: 1323, 531 + xy: 1883, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-5 rotate: false - xy: 1357, 565 + xy: 1917, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulse-conduit-top-6 rotate: false - xy: 1391, 599 + xy: 1951, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -rotary-pump - rotate: false - xy: 1676, 1463 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rotary-pump-icon-full - rotate: false - xy: 1676, 1463 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-pump - rotate: false - xy: 881, 162 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thermal-pump-icon-full - rotate: false - xy: 881, 162 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dart-mech-pad - rotate: false - xy: 393, 58 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dart-mech-pad-icon-full - rotate: false - xy: 393, 58 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -delta-mech-pad - rotate: false - xy: 459, 118 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -delta-mech-pad-icon-full - rotate: false - xy: 459, 118 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -glaive-ship-pad - rotate: false - xy: 685, 282 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -glaive-ship-pad-icon-full - rotate: false - xy: 685, 282 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -javelin-ship-pad - rotate: false - xy: 1280, 1623 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -javelin-ship-pad-icon-full - rotate: false - xy: 1280, 1623 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -omega-mech-pad - rotate: false - xy: 749, 652 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -omega-mech-pad-icon-full - rotate: false - xy: 749, 652 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -tau-mech-pad - rotate: false - xy: 913, 1219 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -tau-mech-pad-icon-full - rotate: false - xy: 913, 1219 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -trident-ship-pad - rotate: false - xy: 913, 1021 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -trident-ship-pad-icon-full - rotate: false - xy: 913, 1021 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 battery rotate: false - xy: 1071, 70 + xy: 1843, 1339 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -battery-icon-full +block-battery-full rotate: false - xy: 1071, 70 + xy: 1843, 1339 size: 32, 32 orig: 32, 32 offset: 0, 0 @@ -1411,282 +1033,114 @@ battery-large orig: 96, 96 offset: 0, 0 index: -1 -battery-large-icon-full +block-battery-large-full rotate: false xy: 293, 384 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -combustion-generator - rotate: false - xy: 1137, 821 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator-icon-full - rotate: false - xy: 1137, 821 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 combustion-generator-top rotate: false - xy: 1137, 787 + xy: 853, 478 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -differential-generator - rotate: false - xy: 656, 1534 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -differential-generator-icon-full - rotate: false - xy: 656, 1534 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 differential-generator-liquid rotate: false - xy: 293, 188 + xy: 651, 1142 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 differential-generator-top rotate: false - xy: 391, 384 + xy: 651, 1044 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 impact-reactor rotate: false - xy: 1888, 1787 + xy: 219, 1262 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-bottom rotate: false - xy: 1498, 1661 + xy: 349, 1262 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-light rotate: false - xy: 1758, 1657 + xy: 479, 1262 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-0 rotate: false - xy: 1888, 1657 + xy: 293, 1132 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-1 rotate: false - xy: 163, 251 + xy: 293, 1002 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-2 rotate: false - xy: 155, 121 + xy: 423, 1132 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 impact-reactor-plasma-3 rotate: false - xy: 219, 1262 + xy: 293, 872 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -power-node - rotate: false - xy: 1255, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-icon-full - rotate: false - xy: 1255, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-large - rotate: false - xy: 1478, 1463 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-node-large-icon-full - rotate: false - xy: 1478, 1463 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 power-source rotate: false - xy: 1289, 531 + xy: 1747, 1131 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -power-void - rotate: false - xy: 1357, 599 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-void-icon-full - rotate: false - xy: 1357, 599 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rtg-generator - rotate: false - xy: 1742, 1459 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -rtg-generator-icon-full - rotate: false - xy: 1742, 1459 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 rtg-generator-top rotate: false - xy: 1323, 463 + xy: 1951, 1101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -solar-panel - rotate: false - xy: 1459, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-icon-full - rotate: false - xy: 1459, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-large - rotate: false - xy: 881, 260 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -solar-panel-large-icon-full - rotate: false - xy: 881, 260 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -surge-tower - rotate: false - xy: 969, 1351 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-tower-icon-full - rotate: false - xy: 969, 1351 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-generator - rotate: false - xy: 979, 1219 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thermal-generator-icon-full - rotate: false - xy: 979, 1219 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-reactor - rotate: false - xy: 754, 1632 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -thorium-reactor-icon-full - rotate: false - xy: 754, 1632 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 thorium-reactor-center rotate: false - xy: 754, 1534 + xy: 1342, 1559 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 thorium-reactor-lights rotate: false - xy: 779, 1436 + xy: 877, 1461 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -turbine-generator - rotate: false - xy: 979, 1021 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -turbine-generator-icon-full - rotate: false - xy: 979, 1021 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 turbine-generator-top rotate: false - xy: 913, 955 + xy: 1375, 767 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -1698,7 +1152,7 @@ alloy-smelter orig: 96, 96 offset: 0, 0 index: -1 -alloy-smelter-icon-full +block-alloy-smelter-full rotate: false xy: 1, 1 size: 96, 96 @@ -1713,27 +1167,13 @@ alloy-smelter-top offset: 0, 0 index: -1 blast-mixer - rotate: false - xy: 651, 586 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -blast-mixer-icon-full - rotate: false - xy: 651, 586 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -coal-centrifuge rotate: false xy: 295, 24 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -coal-centrifuge-icon-full +block-blast-mixer-full rotate: false xy: 295, 24 size: 64, 64 @@ -1742,455 +1182,175 @@ coal-centrifuge-icon-full index: -1 cryofluidmixer-bottom rotate: false - xy: 847, 942 + xy: 913, 801 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-liquid rotate: false - xy: 847, 810 + xy: 979, 867 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cryofluidmixer-top rotate: false - xy: 847, 744 + xy: 913, 735 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator rotate: false - xy: 847, 678 + xy: 979, 801 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-middle rotate: false - xy: 1016, 1549 + xy: 979, 735 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 cultivator-top rotate: false - xy: 877, 1493 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -graphite-press - rotate: false - xy: 1148, 1557 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -graphite-press-icon-full - rotate: false - xy: 1148, 1557 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -incinerator - rotate: false - xy: 1375, 769 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -incinerator-icon-full - rotate: false - xy: 1375, 769 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source - rotate: false - xy: 1417, 701 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source-icon-full - rotate: false - xy: 1417, 701 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void - rotate: false - xy: 1315, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void-icon-full - rotate: false - xy: 1315, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln - rotate: false - xy: 1214, 1557 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -kiln-icon-full - rotate: false - xy: 1214, 1557 + xy: 1045, 1295 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 kiln-top rotate: false - xy: 1346, 1623 + xy: 1111, 1097 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 silicon-smelter-top rotate: false - xy: 1346, 1623 + xy: 1111, 1097 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -liquid-source - rotate: false - xy: 1383, 633 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-source-icon-full - rotate: false - xy: 1383, 633 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -melter - rotate: false - xy: 1443, 939 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -melter-icon-full - rotate: false - xy: 1443, 939 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -multi-press - rotate: false - xy: 749, 1240 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -multi-press-icon-full - rotate: false - xy: 749, 1240 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 phase-weaver rotate: false - xy: 1676, 1529 + xy: 1045, 899 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-bottom rotate: false - xy: 1742, 1525 + xy: 1111, 965 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phase-weaver-weave rotate: false - xy: 1874, 1525 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor - rotate: false - xy: 1940, 1525 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -plastanium-compressor-icon-full - rotate: false - xy: 1940, 1525 + xy: 1177, 1031 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 plastanium-compressor-top rotate: false - xy: 1148, 1491 + xy: 1243, 1097 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 pulverizer rotate: false - xy: 1221, 395 + xy: 1985, 1135 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pulverizer-rotator rotate: false - xy: 1289, 463 + xy: 1815, 1101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 pump-liquid rotate: false - xy: 1323, 497 + xy: 1849, 1101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -pyratite-mixer - rotate: false - xy: 1544, 1463 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pyratite-mixer-icon-full - rotate: false - xy: 1544, 1463 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator - rotate: false - xy: 1471, 1397 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -separator-icon-full - rotate: false - xy: 1471, 1397 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 separator-liquid rotate: false - xy: 1537, 1397 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-smelter - rotate: false - xy: 1603, 1397 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -silicon-smelter-icon-full - rotate: false - xy: 1603, 1397 + xy: 1309, 965 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press rotate: false - xy: 1801, 1393 + xy: 1177, 767 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame0 rotate: false - xy: 1867, 1393 + xy: 1243, 833 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame1 rotate: false - xy: 1933, 1393 + xy: 1309, 899 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-frame2 rotate: false - xy: 979, 1417 + xy: 1375, 965 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-liquid rotate: false - xy: 913, 1417 + xy: 1243, 767 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spore-press-top rotate: false - xy: 903, 1351 + xy: 1309, 833 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -container - rotate: false - xy: 1098, 1689 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -container-icon-full - rotate: false - xy: 1098, 1689 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -core-foundation - rotate: false - xy: 163, 381 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-foundation-icon-full - rotate: false - xy: 163, 381 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -core-nucleus - rotate: false - xy: 1, 999 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-nucleus-icon-full - rotate: false - xy: 1, 999 - size: 160, 160 - orig: 160, 160 - offset: 0, 0 - index: -1 -core-shard - rotate: false - xy: 293, 286 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -core-shard-icon-full - rotate: false - xy: 293, 286 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad - rotate: false - xy: 707, 1338 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-icon-full - rotate: false - xy: 707, 1338 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -launch-pad-large - rotate: false - xy: 349, 1262 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -launch-pad-large-icon-full - rotate: false - xy: 349, 1262 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unloader - rotate: false - xy: 1271, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unloader-icon-full - rotate: false - xy: 1271, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -vault - rotate: false - xy: 852, 1559 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -vault-icon-full - rotate: false - xy: 852, 1559 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 arc-heat rotate: false - xy: 877, 1459 + xy: 609, 1262 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-1 rotate: false - xy: 1071, 36 + xy: 1877, 1373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 block-2 rotate: false - xy: 717, 488 + xy: 1073, 1493 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -2204,567 +1364,329 @@ block-3 index: -1 block-4 rotate: false - xy: 163, 901 + xy: 163, 1031 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 hail-heat rotate: false - xy: 609, 1296 + xy: 1557, 1001 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 lancer-heat rotate: false - xy: 1412, 1623 + xy: 1243, 1229 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 meltdown-heat rotate: false - xy: 293, 1132 + xy: 293, 742 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 ripple-heat rotate: false - xy: 783, 456 + xy: 1146, 1559 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 salvo-heat rotate: false - xy: 855, 96 + xy: 1111, 833 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-left rotate: false - xy: 723, 30 + xy: 1177, 899 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 salvo-panel-right rotate: false - xy: 789, 30 + xy: 1243, 965 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scorch-heat rotate: false - xy: 1425, 531 + xy: 1021, 421 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 wave-liquid rotate: false - xy: 1045, 1219 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -command-center - rotate: false - xy: 950, 1615 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -command-center-icon-full - rotate: false - xy: 950, 1615 + xy: 1441, 767 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 crawler-factory rotate: false - xy: 847, 1140 + xy: 913, 867 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory rotate: false - xy: 847, 1140 + xy: 913, 867 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 draug-factory rotate: false - xy: 847, 1140 + xy: 913, 867 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 phantom-factory rotate: false - xy: 847, 1140 + xy: 913, 867 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 spirit-factory rotate: false - xy: 847, 1140 + xy: 913, 867 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith-factory rotate: false - xy: 847, 1140 + xy: 913, 867 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 crawler-factory-top rotate: false - xy: 847, 1008 + xy: 979, 933 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 dagger-factory-top rotate: false - xy: 1009, 1483 + xy: 1045, 1229 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 draug-factory-top rotate: false - xy: 525, 52 + xy: 1045, 1163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-factory rotate: false - xy: 489, 282 + xy: 651, 654 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 fortress-factory-top rotate: false - xy: 619, 478 + xy: 749, 1240 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory-top rotate: false - xy: 619, 478 + xy: 749, 1240 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 titan-factory-top rotate: false - xy: 619, 478 + xy: 749, 1240 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 ghoul-factory rotate: false - xy: 587, 184 + xy: 749, 1044 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 phantom-factory-top rotate: false - xy: 1544, 1529 + xy: 1375, 1295 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 rally-point rotate: false - xy: 1610, 1463 + xy: 1111, 899 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 repair-point-base rotate: false - xy: 1391, 565 + xy: 1917, 1101 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 revenant-factory rotate: false - xy: 423, 1132 + xy: 423, 872 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 revenant-factory-top rotate: false - xy: 423, 1002 + xy: 293, 612 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 spirit-factory-top rotate: false - xy: 1735, 1393 + xy: 1375, 1031 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-factory rotate: false - xy: 805, 1338 + xy: 975, 1461 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 wraith-factory-top rotate: false - xy: 1045, 1087 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -copper-wall - rotate: false - xy: 1273, 871 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-icon-full - rotate: false - xy: 1273, 871 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-large - rotate: false - xy: 1016, 1615 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -copper-wall-large-icon-full - rotate: false - xy: 1016, 1615 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door - rotate: false - xy: 1341, 837 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-icon-full - rotate: false - xy: 1341, 837 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-large - rotate: false - xy: 591, 118 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -door-large-icon-full - rotate: false - xy: 591, 118 + xy: 1045, 701 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-large-open rotate: false - xy: 657, 118 + xy: 1111, 1295 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 door-open rotate: false - xy: 1307, 803 + xy: 1534, 689 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -phase-wall - rotate: false - xy: 1221, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-icon-full - rotate: false - xy: 1221, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-large - rotate: false - xy: 1610, 1529 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-wall-large-icon-full - rotate: false - xy: 1610, 1529 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scrap-wall-gigantic - rotate: false - xy: 423, 872 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-gigantic-icon-full - rotate: false - xy: 423, 872 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -scrap-wall-huge1 - rotate: false - xy: 783, 162 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -scrap-wall-huge-icon-full - rotate: false - xy: 783, 162 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 scrap-wall-huge2 rotate: false - xy: 881, 456 + xy: 1244, 1559 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-huge3 rotate: false - xy: 881, 358 + xy: 1342, 1657 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 scrap-wall-large1 rotate: false - xy: 1141, 1425 + xy: 1375, 1097 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large2 rotate: false - xy: 1207, 1425 + xy: 1111, 767 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large3 rotate: false - xy: 1273, 1425 + xy: 1177, 833 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 scrap-wall-large4 rotate: false - xy: 1339, 1425 + xy: 1243, 899 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -scrap-wall1 - rotate: false - xy: 1357, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-icon-full - rotate: false - xy: 1357, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 scrap-wall2 rotate: false - xy: 1391, 463 + xy: 1021, 387 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall3 rotate: false - xy: 1425, 497 + xy: 1021, 353 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall4 rotate: false - xy: 1357, 395 + xy: 1021, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 scrap-wall5 rotate: false - xy: 1357, 395 + xy: 1021, 319 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -surge-wall - rotate: false - xy: 1021, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-icon-full - rotate: false - xy: 1021, 1 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-large - rotate: false - xy: 1035, 1351 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -surge-wall-large-icon-full - rotate: false - xy: 1035, 1351 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-wall - rotate: false - xy: 1101, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-icon-full - rotate: false - xy: 1101, 308 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-large - rotate: false - xy: 913, 1153 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thorium-wall-large-icon-full - rotate: false - xy: 913, 1153 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -thruster - rotate: false - xy: 293, 482 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -thruster-icon-full - rotate: false - xy: 293, 482 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -titanium-wall - rotate: false - xy: 1271, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-icon-full - rotate: false - xy: 1271, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-large - rotate: false - xy: 979, 1087 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -titanium-wall-large-icon-full - rotate: false - xy: 979, 1087 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 bullet rotate: false - xy: 979, 347 + xy: 913, 681 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 bullet-back rotate: false - xy: 979, 293 + xy: 967, 681 size: 52, 52 orig: 52, 52 offset: 0, 0 index: -1 casing rotate: false - xy: 903, 1423 + xy: 847, 660 size: 8, 16 orig: 8, 16 offset: 0, 0 @@ -2778,35 +1700,35 @@ circle-shadow index: -1 error rotate: false - xy: 1087, 460 + xy: 1497, 1453 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 laser rotate: false - xy: 387, 40 + xy: 1039, 685 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 laser-end rotate: false - xy: 759, 1770 + xy: 489, 208 size: 72, 72 orig: 72, 72 offset: 0, 0 index: -1 minelaser rotate: false - xy: 1131, 206 + xy: 155, 301 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 minelaser-end rotate: false - xy: 950, 1681 + xy: 651, 580 size: 72, 72 orig: 72, 72 offset: 0, 0 @@ -2820,91 +1742,91 @@ missile index: -1 missile-back rotate: false - xy: 2006, 1535 + xy: 1599, 1155 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 scale_marker rotate: false - xy: 459, 184 + xy: 1469, 1553 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 scorch1 rotate: false - xy: 1461, 1257 + xy: 2019, 1067 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch2 rotate: false - xy: 1461, 1155 + xy: 1735, 1029 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch3 rotate: false - xy: 1491, 1257 + xy: 1765, 1029 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch4 rotate: false - xy: 1491, 1155 + xy: 1735, 927 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 scorch5 rotate: false - xy: 1521, 1257 + xy: 1765, 927 size: 28, 100 orig: 28, 100 offset: 0, 0 index: -1 shell rotate: false - xy: 2006, 1497 + xy: 1641, 1197 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shell-back rotate: false - xy: 2006, 1459 + xy: 1683, 1239 size: 36, 36 orig: 36, 36 offset: 0, 0 index: -1 shot rotate: false - xy: 1459, 599 + xy: 1111, 668 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer rotate: false - xy: 1137, 206 + xy: 155, 251 size: 4, 48 orig: 4, 48 offset: 0, 0 index: -1 transfer-arrow rotate: false - xy: 1237, 293 + xy: 1701, 869 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 transfer-end rotate: false - xy: 1024, 1681 + xy: 759, 1770 size: 72, 72 orig: 72, 72 offset: 0, 0 @@ -2918,266 +1840,2289 @@ white index: -1 arc rotate: false - xy: 609, 1262 + xy: 1045, 1361 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -arc-icon-full +block-arc-full rotate: false - xy: 797, 1736 + xy: 1843, 1305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -blast-drill-icon-full +block-blast-drill-full rotate: false - xy: 323, 1392 + xy: 163, 901 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -char-icon-full +block-bridge-conduit-full rotate: false - xy: 1137, 889 + xy: 1911, 1373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -cliffs-icon-full +bridge-conduit rotate: false - xy: 1137, 855 + xy: 1911, 1373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -conduit-icon-full +block-bridge-conveyor-full rotate: false - xy: 1239, 1007 + xy: 1877, 1305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -cracks-1-0 +bridge-conveyor rotate: false - xy: 1239, 837 + xy: 1877, 1305 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -cracks-1-1 +block-char-full rotate: false - xy: 1205, 803 + xy: 1911, 1339 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -cracks-1-2 +block-cliffs-full rotate: false - xy: 1171, 769 + xy: 1945, 1373 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -cracks-1-3 +block-coal-centrifuge-full rotate: false - xy: 1409, 973 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-4 - rotate: false - xy: 1375, 939 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-5 - rotate: false - xy: 1341, 905 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-6 - rotate: false - xy: 1307, 871 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-1-7 - rotate: false - xy: 1273, 837 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cracks-2-0 - rotate: false - xy: 1164, 1689 + xy: 563, 216 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cracks-2-1 +coal-centrifuge rotate: false - xy: 1230, 1689 + xy: 563, 216 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cracks-2-2 +block-combustion-generator-full rotate: false - xy: 1296, 1689 + xy: 1911, 1305 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +combustion-generator + rotate: false + xy: 1911, 1305 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-command-center-full + rotate: false + xy: 361, 24 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cracks-2-3 +command-center rotate: false - xy: 1362, 1689 + xy: 361, 24 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cracks-2-4 +block-conduit-full rotate: false - xy: 1428, 1689 + xy: 1945, 1339 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-container-full + rotate: false + xy: 1139, 1493 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cracks-2-5 +container rotate: false - xy: 393, 124 + xy: 1139, 1493 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cracks-2-6 +block-conveyor-full rotate: false - xy: 847, 1272 + xy: 1979, 1373 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +conveyor-0-0 + rotate: false + xy: 1979, 1373 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-copper-wall-full + rotate: false + xy: 1945, 1305 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +copper-wall + rotate: false + xy: 1945, 1305 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-copper-wall-large-full + rotate: false + xy: 629, 216 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cracks-2-7 +copper-wall-large rotate: false - xy: 847, 1206 + xy: 629, 216 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -cracks-3-0 +block-core-foundation-full + rotate: false + xy: 163, 771 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +core-foundation + rotate: false + xy: 163, 771 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-core-nucleus-full + rotate: false + xy: 1, 999 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +core-nucleus + rotate: false + xy: 1, 999 + size: 160, 160 + orig: 160, 160 + offset: 0, 0 + index: -1 +block-core-shard-full + rotate: false + xy: 293, 286 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +core-shard + rotate: false + xy: 293, 286 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-craters-full + rotate: false + xy: 1979, 1339 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-crawler-factory-full + rotate: false + xy: 1205, 1493 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cryofluidmixer-full + rotate: false + xy: 695, 216 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cultivator-full + rotate: false + xy: 1271, 1493 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-cyclone-full rotate: false xy: 656, 1632 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -cracks-3-1 +block-dagger-factory-full + rotate: false + xy: 1337, 1493 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-dark-metal-full + rotate: false + xy: 2013, 1373 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-1-full + rotate: false + xy: 1979, 1305 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-2-full + rotate: false + xy: 2013, 1339 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-3-full + rotate: false + xy: 2013, 1305 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-4-full + rotate: false + xy: 1775, 1267 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-5-full + rotate: false + xy: 1809, 1271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-6-full + rotate: false + xy: 1843, 1271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-full + rotate: false + xy: 1877, 1271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-full + rotate: false + xy: 1911, 1271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-water-full + rotate: false + xy: 1945, 1271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dart-mech-pad-full + rotate: false + xy: 427, 24 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +dart-mech-pad + rotate: false + xy: 427, 24 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-deepwater-full + rotate: false + xy: 1979, 1271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-delta-mech-pad-full + rotate: false + xy: 847, 1272 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +delta-mech-pad + rotate: false + xy: 847, 1272 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-differential-generator-full rotate: false xy: 553, 1164 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -cracks-3-2 +differential-generator + rotate: false + xy: 553, 1164 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-distributor-full + rotate: false + xy: 847, 1206 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +distributor + rotate: false + xy: 847, 1206 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-door-full + rotate: false + xy: 2013, 1271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +door + rotate: false + xy: 2013, 1271 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-door-large-full + rotate: false + xy: 847, 1140 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +door-large + rotate: false + xy: 847, 1140 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-draug-factory-full + rotate: false + xy: 847, 1074 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-dunerocks-full + rotate: false + xy: 563, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-duo-full + rotate: false + xy: 597, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-force-projector-full rotate: false xy: 553, 1066 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -cracks-3-3 +force-projector + rotate: false + xy: 553, 1066 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-fortress-factory-full rotate: false xy: 553, 968 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -cracks-3-4 +block-fuse-full rotate: false xy: 553, 870 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -cracks-3-5 +block-ghoul-factory-full rotate: false xy: 553, 772 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -cracks-3-6 +block-glaive-ship-pad-full rotate: false xy: 553, 674 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -cracks-3-7 +glaive-ship-pad + rotate: false + xy: 553, 674 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-graphite-press-full + rotate: false + xy: 847, 1008 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +graphite-press + rotate: false + xy: 847, 1008 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-grass-full + rotate: false + xy: 631, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hail-full + rotate: false + xy: 665, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-holostone-full + rotate: false + xy: 699, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hotrock-full + rotate: false + xy: 733, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-full + rotate: false + xy: 767, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-full + rotate: false + xy: 557, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-icerocks-full + rotate: false + xy: 591, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ignarock-full + rotate: false + xy: 625, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-impact-reactor-full + rotate: false + xy: 163, 641 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-incinerator-full + rotate: false + xy: 659, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +incinerator + rotate: false + xy: 659, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-source-full + rotate: false + xy: 693, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-source + rotate: false + xy: 693, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-void-full + rotate: false + xy: 727, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-void + rotate: false + xy: 727, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-full + rotate: false + xy: 847, 942 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +javelin-ship-pad + rotate: false + xy: 847, 942 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-junction-full + rotate: false + xy: 761, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +junction + rotate: false + xy: 761, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-kiln-full + rotate: false + xy: 847, 876 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +kiln + rotate: false + xy: 847, 876 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-lancer-full + rotate: false + xy: 847, 810 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-laser-drill-full rotate: false xy: 553, 576 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -cracks-4-0 +block-launch-pad-full + rotate: false + xy: 99, 1 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +launch-pad + rotate: false + xy: 99, 1 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-launch-pad-large-full + rotate: false + xy: 163, 511 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +launch-pad-large + rotate: false + xy: 163, 511 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-liquid-junction-full + rotate: false + xy: 559, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-junction + rotate: false + xy: 559, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-router-full + rotate: false + xy: 559, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-source-full + rotate: false + xy: 593, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-source + rotate: false + xy: 593, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-tank-full + rotate: false + xy: 197, 23 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-magmarock-full + rotate: false + xy: 559, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mass-driver-full + rotate: false + xy: 656, 1534 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-mechanical-drill-full + rotate: false + xy: 847, 744 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-mechanical-pump-full + rotate: false + xy: 593, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mechanical-pump + rotate: false + xy: 593, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-meltdown-full + rotate: false + xy: 163, 381 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-melter-full + rotate: false + xy: 627, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +melter + rotate: false + xy: 627, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mend-projector-full + rotate: false + xy: 847, 678 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +mend-projector + rotate: false + xy: 847, 678 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-mender-full + rotate: false + xy: 559, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +mender + rotate: false + xy: 559, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-message-full + rotate: false + xy: 593, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +message + rotate: false + xy: 593, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-2-full + rotate: false + xy: 627, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-3-full + rotate: false + xy: 661, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-5-full + rotate: false + xy: 593, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-full + rotate: false + xy: 627, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-full + rotate: false + xy: 661, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-moss-full + rotate: false + xy: 627, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-multi-press-full + rotate: false + xy: 293, 188 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +multi-press + rotate: false + xy: 293, 188 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-oil-extractor-full + rotate: false + xy: 391, 384 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-omega-mech-pad-full + rotate: false + xy: 391, 286 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +omega-mech-pad + rotate: false + xy: 391, 286 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-ore-coal-full + rotate: false + xy: 661, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-coal-medium + rotate: false + xy: 661, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-coal-large + rotate: false + xy: 609, 1296 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-coal-small + rotate: false + xy: 583, 1410 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-coal-tiny + rotate: false + xy: 1448, 691 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-coal-xlarge + rotate: false + xy: 1548, 1553 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ore-copper-full + rotate: false + xy: 695, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-copper-medium + rotate: false + xy: 695, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-copper-large + rotate: false + xy: 1557, 1253 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-copper-small + rotate: false + xy: 1934, 1923 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-copper-tiny + rotate: false + xy: 583, 1392 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-copper-xlarge + rotate: false + xy: 1598, 1553 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ore-lead-full + rotate: false + xy: 729, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-lead-medium + rotate: false + xy: 729, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-lead-large + rotate: false + xy: 1557, 1211 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-lead-small + rotate: false + xy: 521, 586 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-lead-tiny + rotate: false + xy: 1448, 673 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-lead-xlarge + rotate: false + xy: 1648, 1553 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ore-scrap-full + rotate: false + xy: 661, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-scrap-medium + rotate: false + xy: 661, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-scrap-large + rotate: false + xy: 1557, 1169 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-scrap-small + rotate: false + xy: 423, 488 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-scrap-tiny + rotate: false + xy: 155, 103 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-scrap-xlarge + rotate: false + xy: 923, 531 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ore-thorium-full + rotate: false + xy: 695, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-thorium-medium + rotate: false + xy: 695, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-thorium-large + rotate: false + xy: 1557, 1127 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-thorium-small + rotate: false + xy: 219, 1162 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-thorium-tiny + rotate: false + xy: 852, 1541 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-thorium-xlarge + rotate: false + xy: 973, 523 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ore-titanium-full + rotate: false + xy: 729, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-titanium-medium + rotate: false + xy: 729, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ore-titanium-large + rotate: false + xy: 1557, 1085 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ore-titanium-small + rotate: false + xy: 1073, 1467 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ore-titanium-tiny + rotate: false + xy: 877, 1443 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ore-titanium-xlarge + rotate: false + xy: 1466, 717 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-overdrive-projector-full + rotate: false + xy: 491, 142 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +overdrive-projector + rotate: false + xy: 491, 142 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-overflow-gate-full + rotate: false + xy: 695, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +overflow-gate + rotate: false + xy: 695, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pebbles-full + rotate: false + xy: 729, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phantom-factory-full + rotate: false + xy: 725, 586 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-phase-conduit-full + rotate: false + xy: 729, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conduit + rotate: false + xy: 729, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conveyor-full + rotate: false + xy: 763, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-conveyor + rotate: false + xy: 763, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-full + rotate: false + xy: 763, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +phase-wall + rotate: false + xy: 763, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-large-full + rotate: false + xy: 791, 586 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +phase-wall-large + rotate: false + xy: 791, 586 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-phase-weaver-full + rotate: false + xy: 903, 1395 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-pine-full + rotate: false + xy: 1698, 1553 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-compressor-full + rotate: false + xy: 969, 1395 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +plastanium-compressor + rotate: false + xy: 969, 1395 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-pneumatic-drill-full + rotate: false + xy: 1035, 1395 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-power-node-full + rotate: false + xy: 763, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +power-node + rotate: false + xy: 763, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-large-full + rotate: false + xy: 1403, 1493 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +power-node-large + rotate: false + xy: 1403, 1493 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-power-source-full + rotate: false + xy: 763, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-void-full + rotate: false + xy: 801, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +power-void + rotate: false + xy: 801, 182 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulse-conduit-full + rotate: false + xy: 795, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-full + rotate: false + xy: 797, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pyratite-mixer-full + rotate: false + xy: 1101, 1427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +pyratite-mixer + rotate: false + xy: 1101, 1427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-repair-point-full + rotate: false + xy: 797, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-revenant-factory-full rotate: false xy: 848, 1755 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -cracks-4-1 +block-ripple-full + rotate: false + xy: 391, 188 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-rock-full + rotate: false + xy: 1730, 1607 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rocks-full + rotate: false + xy: 797, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rotary-pump-full + rotate: false + xy: 1167, 1427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +rotary-pump + rotate: false + xy: 1167, 1427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-router-full + rotate: false + xy: 797, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +router + rotate: false + xy: 797, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rtg-generator-full + rotate: false + xy: 1233, 1427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +rtg-generator + rotate: false + xy: 1233, 1427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-salt-full + rotate: false + xy: 1466, 683 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-saltrocks-full + rotate: false + xy: 1500, 683 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-full + rotate: false + xy: 1299, 1427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-sand-boulder-full + rotate: false + xy: 829, 148 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-full + rotate: false + xy: 831, 114 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-water-full + rotate: false + xy: 831, 80 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sandrocks-full + rotate: false + xy: 831, 46 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scatter-full + rotate: false + xy: 1365, 1427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-scorch-full + rotate: false + xy: 831, 12 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-full + rotate: false + xy: 1176, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +scrap-wall1 + rotate: false + xy: 1176, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-full rotate: false xy: 978, 1755 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -cracks-4-2 +scrap-wall-gigantic + rotate: false + xy: 978, 1755 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-full + rotate: false + xy: 295, 90 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +scrap-wall-huge1 + rotate: false + xy: 295, 90 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-scrap-wall-large-full + rotate: false + xy: 1431, 1427 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-separator-full + rotate: false + xy: 1101, 1361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +separator + rotate: false + xy: 1101, 1361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-shale-boulder-full + rotate: false + xy: 1244, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-full + rotate: false + xy: 1278, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shalerocks-full + rotate: false + xy: 1312, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shock-mine-full + rotate: false + xy: 1346, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-full + rotate: false + xy: 1380, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-silicon-smelter-full + rotate: false + xy: 1167, 1361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +silicon-smelter + rotate: false + xy: 1167, 1361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-snow-full + rotate: false + xy: 1414, 675 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-full + rotate: false + xy: 1780, 1607 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snowrock-full + rotate: false + xy: 1830, 1607 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snowrocks-full + rotate: false + xy: 725, 552 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-full + rotate: false + xy: 759, 552 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +solar-panel + rotate: false + xy: 759, 552 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-large-full + rotate: false + xy: 393, 90 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +solar-panel-large + rotate: false + xy: 393, 90 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-sorter-full + rotate: false + xy: 793, 552 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +sorter + rotate: false + xy: 793, 552 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spawn-full + rotate: false + xy: 717, 518 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spectre-full rotate: false xy: 1108, 1755 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 -cracks-4-3 +block-spirit-factory-full + rotate: false + xy: 1233, 1361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-spore-cluster-full + rotate: false + xy: 1557, 1043 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-full + rotate: false + xy: 717, 484 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-pine-full + rotate: false + xy: 1880, 1607 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-press-full + rotate: false + xy: 1299, 1361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-sporerocks-full + rotate: false + xy: 751, 518 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-full + rotate: false + xy: 785, 518 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-tower-full + rotate: false + xy: 1365, 1361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +surge-tower + rotate: false + xy: 1365, 1361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-surge-wall-full + rotate: false + xy: 751, 484 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +surge-wall + rotate: false + xy: 751, 484 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-large-full + rotate: false + xy: 1431, 1361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +surge-wall-large + rotate: false + xy: 1431, 1361 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-swarmer-full + rotate: false + xy: 857, 612 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-tainted-water-full + rotate: false + xy: 785, 484 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tar-full + rotate: false + xy: 783, 450 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tau-mech-pad-full + rotate: false + xy: 857, 546 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +tau-mech-pad + rotate: false + xy: 857, 546 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-tendrils-full + rotate: false + xy: 783, 416 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-generator-full + rotate: false + xy: 761, 216 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thermal-generator + rotate: false + xy: 761, 216 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-thermal-pump-full + rotate: false + xy: 521, 478 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thermal-pump + rotate: false + xy: 521, 478 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-thorium-reactor-full + rotate: false + xy: 489, 380 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +thorium-reactor + rotate: false + xy: 489, 380 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-thorium-wall-full + rotate: false + xy: 783, 382 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +thorium-wall + rotate: false + xy: 783, 382 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-large-full + rotate: false + xy: 493, 76 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +thorium-wall-large + rotate: false + xy: 493, 76 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-thruster-full rotate: false xy: 1238, 1755 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 +thruster + rotate: false + xy: 1238, 1755 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +block-titan-factory-full + rotate: false + xy: 489, 282 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-titanium-conveyor-full + rotate: false + xy: 783, 348 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-conveyor-0-0 + rotate: false + xy: 783, 348 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-full + rotate: false + xy: 783, 314 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +titanium-wall + rotate: false + xy: 783, 314 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-large-full + rotate: false + xy: 493, 10 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +titanium-wall-large + rotate: false + xy: 493, 10 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-trident-ship-pad-full + rotate: false + xy: 913, 1329 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +trident-ship-pad + rotate: false + xy: 913, 1329 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-turbine-generator-full + rotate: false + xy: 913, 1263 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +turbine-generator + rotate: false + xy: 913, 1263 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-unloader-full + rotate: false + xy: 819, 518 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +unloader + rotate: false + xy: 819, 518 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-vault-full + rotate: false + xy: 619, 478 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +vault + rotate: false + xy: 619, 478 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +block-water-extractor-full + rotate: false + xy: 979, 1329 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-water-full + rotate: false + xy: 819, 484 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wave-full + rotate: false + xy: 913, 1197 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +block-white-tree-dead-full + rotate: false + xy: 1, 1725 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +block-white-tree-full + rotate: false + xy: 1, 1403 + size: 320, 320 + orig: 320, 320 + offset: 0, 0 + index: -1 +block-wraith-factory-full + rotate: false + xy: 979, 1263 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-1-0 + rotate: false + xy: 1516, 761 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-1 + rotate: false + xy: 1516, 727 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-2 + rotate: false + xy: 1550, 757 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-3 + rotate: false + xy: 1550, 723 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-4 + rotate: false + xy: 1584, 747 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-5 + rotate: false + xy: 1584, 713 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-6 + rotate: false + xy: 1618, 747 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-1-7 + rotate: false + xy: 1618, 713 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +cracks-2-0 + rotate: false + xy: 913, 1131 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-1 + rotate: false + xy: 979, 1197 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-2 + rotate: false + xy: 913, 1065 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-3 + rotate: false + xy: 979, 1131 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-4 + rotate: false + xy: 913, 999 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-5 + rotate: false + xy: 979, 1065 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-6 + rotate: false + xy: 913, 933 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-2-7 + rotate: false + xy: 979, 999 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +cracks-3-0 + rotate: false + xy: 587, 380 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-1 + rotate: false + xy: 587, 282 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-2 + rotate: false + xy: 685, 380 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-3 + rotate: false + xy: 685, 282 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-4 + rotate: false + xy: 583, 1436 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-5 + rotate: false + xy: 681, 1436 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-6 + rotate: false + xy: 609, 1338 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-3-7 + rotate: false + xy: 707, 1338 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +cracks-4-0 + rotate: false + xy: 1758, 1787 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-1 + rotate: false + xy: 1888, 1787 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-2 + rotate: false + xy: 1498, 1661 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +cracks-4-3 + rotate: false + xy: 1628, 1661 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 cracks-4-4 rotate: false - xy: 1368, 1755 + xy: 1758, 1657 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-5 rotate: false - xy: 1498, 1791 + xy: 1888, 1657 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-6 rotate: false - xy: 1628, 1791 + xy: 163, 251 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 cracks-4-7 rotate: false - xy: 1758, 1787 + xy: 155, 121 size: 128, 128 orig: 128, 128 offset: 0, 0 @@ -3238,1794 +4183,1185 @@ cracks-5-7 orig: 160, 160 offset: 0, 0 index: -1 -craters-icon-full - rotate: false - xy: 1239, 803 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -crawler-factory-icon-full - rotate: false - xy: 847, 1074 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cryofluidmixer-icon-full - rotate: false - xy: 847, 876 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -cultivator-icon-full - rotate: false - xy: 950, 1549 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 cyclone rotate: false - xy: 99, 1 + xy: 651, 1240 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -cyclone-icon-full - rotate: false - xy: 197, 23 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -dagger-factory-icon-full - rotate: false - xy: 943, 1483 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dark-metal-icon-full - rotate: false - xy: 1205, 769 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1-icon-full - rotate: false - xy: 1171, 735 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-2-icon-full - rotate: false - xy: 1409, 939 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-3-icon-full - rotate: false - xy: 1375, 905 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-4-icon-full - rotate: false - xy: 1341, 871 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-5-icon-full - rotate: false - xy: 1307, 837 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-6-icon-full - rotate: false - xy: 1273, 803 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-icon-full - rotate: false - xy: 1239, 769 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water-icon-full - rotate: false - xy: 1205, 735 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water-icon-full - rotate: false - xy: 1409, 905 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater-icon-full - rotate: false - xy: 1375, 871 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -draug-factory-icon-full - rotate: false - xy: 459, 52 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -dunerocks-icon-full - rotate: false - xy: 1273, 769 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 duo rotate: false - xy: 1239, 735 + xy: 1568, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -duo-icon-full - rotate: false - xy: 1409, 871 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -fortress-factory-icon-full - rotate: false - xy: 489, 184 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 fuse rotate: false - xy: 587, 380 + xy: 749, 1142 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -fuse-icon-full - rotate: false - xy: 587, 282 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ghoul-factory-icon-full - rotate: false - xy: 685, 380 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -grass-icon-full - rotate: false - xy: 1375, 837 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 hail rotate: false - xy: 1341, 803 + xy: 1602, 679 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -hail-icon-full +item-blast-compound-large rotate: false - xy: 1307, 769 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-icon-full - rotate: false - xy: 1273, 735 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock-icon-full - rotate: false - xy: 1409, 837 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-icon-full - rotate: false - xy: 1375, 803 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow-icon-full - rotate: false - xy: 1341, 769 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icerocks-icon-full - rotate: false - xy: 1307, 735 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock-icon-full - rotate: false - xy: 1409, 803 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -impact-reactor-icon-full - rotate: false - xy: 1628, 1661 - size: 128, 128 - orig: 128, 128 + xy: 1557, 959 + size: 40, 40 + orig: 40, 40 offset: 0, 0 index: -1 item-blast-compound-medium rotate: false - xy: 583, 1410 - size: 24, 24 - orig: 24, 24 + xy: 1568, 645 + size: 32, 32 + orig: 32, 32 offset: 0, 0 index: -1 item-blast-compound-small rotate: false - xy: 583, 1392 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-blast-compound-xlarge - rotate: false - xy: 1161, 1083 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-blast-compound-xxlarge - rotate: false - xy: 1137, 394 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-coal-medium - rotate: false - xy: 847, 652 + xy: 2019, 1531 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -item-coal-small - rotate: false - xy: 155, 103 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-coal-xlarge - rotate: false - xy: 1203, 1083 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-coal-xxlarge - rotate: false - xy: 1101, 1367 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-copper-medium - rotate: false - xy: 873, 652 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-copper-small - rotate: false - xy: 852, 1541 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-copper-xlarge - rotate: false - xy: 1245, 1083 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-copper-xxlarge - rotate: false - xy: 1151, 1375 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-graphite-medium - rotate: false - xy: 1934, 1923 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-graphite-small - rotate: false - xy: 723, 166 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-graphite-xlarge - rotate: false - xy: 1287, 1083 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-graphite-xxlarge - rotate: false - xy: 1201, 1375 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-lead-medium - rotate: false - xy: 521, 586 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-lead-small - rotate: false - xy: 913, 557 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-lead-xlarge - rotate: false - xy: 1329, 1083 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-lead-xxlarge - rotate: false - xy: 1251, 1375 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-metaglass-medium - rotate: false - xy: 423, 488 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-metaglass-small - rotate: false - xy: 1451, 1407 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-metaglass-xlarge - rotate: false - xy: 1371, 1083 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-metaglass-xxlarge - rotate: false - xy: 1301, 1375 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-phase-fabric-medium - rotate: false - xy: 219, 1162 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-phase-fabric-small - rotate: false - xy: 877, 1441 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-phase-fabric-xlarge - rotate: false - xy: 1413, 1083 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-phase-fabric-xxlarge - rotate: false - xy: 1351, 1375 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-plastanium-medium - rotate: false - xy: 361, 64 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-plastanium-small - rotate: false - xy: 895, 1441 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-plastanium-xlarge - rotate: false - xy: 1110, 1025 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-plastanium-xxlarge - rotate: false - xy: 1401, 1375 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-pyratite-medium - rotate: false - xy: 1111, 1457 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-pyratite-small - rotate: false - xy: 1145, 667 - size: 16, 16 - orig: 16, 16 - offset: 0, 0 - index: -1 -item-pyratite-xlarge - rotate: false - xy: 1161, 1041 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-pyratite-xxlarge - rotate: false - xy: 1111, 1317 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-sand-medium - rotate: false - xy: 1105, 384 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-sand-small +item-blast-compound-tiny rotate: false xy: 197, 5 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -item-sand-xlarge +item-blast-compound-xlarge rotate: false - xy: 1203, 1041 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-sand-xxlarge - rotate: false - xy: 1111, 1267 + xy: 1597, 1403 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -item-scrap-medium +item-coal-large rotate: false - xy: 1271, 301 + xy: 1557, 917 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-coal-medium + rotate: false + xy: 1636, 679 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-coal-small + rotate: false + xy: 827, 560 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -item-scrap-small +item-coal-tiny rotate: false - xy: 1135, 274 + xy: 1021, 717 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -item-scrap-xlarge +item-coal-xlarge rotate: false - xy: 1245, 1041 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-scrap-xxlarge - rotate: false - xy: 1111, 1217 + xy: 1647, 1453 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -item-silicon-medium +item-copper-large rotate: false - xy: 1305, 335 + xy: 1557, 875 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-copper-medium + rotate: false + xy: 1679, 1201 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-copper-small + rotate: false + xy: 783, 288 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -item-silicon-small +item-copper-tiny rotate: false - xy: 1131, 256 + xy: 1079, 1377 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -item-silicon-xlarge +item-copper-xlarge rotate: false - xy: 1287, 1041 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-silicon-xxlarge - rotate: false - xy: 1111, 1167 + xy: 1647, 1403 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -item-spore-pod-medium +item-graphite-large rotate: false - xy: 1339, 369 + xy: 1557, 833 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-graphite-medium + rotate: false + xy: 1755, 1233 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-graphite-small + rotate: false + xy: 1145, 676 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -item-spore-pod-small +item-graphite-tiny rotate: false - xy: 1521, 1213 + xy: 897, 290 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -item-spore-pod-xlarge +item-graphite-xlarge rotate: false - xy: 1329, 1041 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-spore-pod-xxlarge - rotate: false - xy: 1111, 1117 + xy: 1719, 1503 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -item-surge-alloy-medium +item-lead-large rotate: false - xy: 1461, 1129 + xy: 1557, 791 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-lead-medium + rotate: false + xy: 1789, 1233 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-lead-small + rotate: false + xy: 1701, 843 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -item-surge-alloy-small +item-lead-tiny rotate: false - xy: 1986, 1931 + xy: 2027, 1253 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -item-surge-alloy-xlarge +item-lead-xlarge rotate: false - xy: 1371, 1041 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-surge-alloy-xxlarge - rotate: false - xy: 1161, 1325 + xy: 1697, 1453 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -item-thorium-medium +item-metaglass-large rotate: false - xy: 1521, 1231 + xy: 1607, 1361 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-metaglass-medium + rotate: false + xy: 1823, 1237 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-metaglass-small + rotate: false + xy: 1735, 901 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -item-thorium-small +item-metaglass-tiny rotate: false - xy: 475, 496 + xy: 1795, 1113 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -item-thorium-xlarge +item-metaglass-xlarge rotate: false - xy: 1413, 1041 - size: 40, 40 - orig: 40, 40 - offset: 0, 0 - index: -1 -item-thorium-xxlarge - rotate: false - xy: 1211, 1325 + xy: 1697, 1403 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -item-titanium-medium +item-phase-fabric-large + rotate: false + xy: 1607, 1319 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-phase-fabric-medium + rotate: false + xy: 1857, 1237 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-phase-fabric-small rotate: false xy: 1960, 1923 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -item-titanium-small +item-phase-fabric-tiny rotate: false - xy: 271, 1170 + xy: 2019, 1513 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -item-titanium-xlarge +item-phase-fabric-xlarge rotate: false - xy: 2006, 1615 + xy: 1769, 1507 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-plastanium-large + rotate: false + xy: 1649, 1361 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -item-titanium-xxlarge +item-plastanium-medium rotate: false - xy: 1161, 1275 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -lancer - rotate: false - xy: 1280, 1557 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -lancer-icon-full - rotate: false - xy: 1346, 1557 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -laser-drill-icon-full - rotate: false - xy: 295, 90 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -liquid-router-icon-full - rotate: false - xy: 1247, 633 + xy: 1891, 1237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -liquid-tank-icon-full - rotate: false - xy: 651, 1142 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -magmarock-icon-full - rotate: false - xy: 1443, 1007 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mass-driver - rotate: false - xy: 651, 848 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mass-driver-icon-full - rotate: false - xy: 651, 652 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -mech-icon-alpha-mech - rotate: false - xy: 1311, 1325 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mech-icon-dart-ship - rotate: false - xy: 1261, 1275 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mech-icon-delta-mech - rotate: false - xy: 1211, 1225 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mech-icon-glaive-ship - rotate: false - xy: 1045, 826 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -mech-icon-javelin-ship - rotate: false - xy: 1161, 1175 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mech-icon-omega-mech - rotate: false - xy: 584, 1537 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -mech-icon-tau-mech - rotate: false - xy: 1045, 768 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -mech-icon-trident-ship - rotate: false - xy: 1045, 710 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -mechanical-drill-icon-full - rotate: false - xy: 1478, 1595 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -meltdown - rotate: false - xy: 479, 1262 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -meltdown-icon-full - rotate: false - xy: 293, 1002 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -metal-floor-2-icon-full - rotate: false - xy: 1443, 803 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-3-icon-full - rotate: false - xy: 1443, 769 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-5-icon-full - rotate: false - xy: 1443, 735 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged-icon-full - rotate: false - xy: 1451, 701 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-icon-full - rotate: false - xy: 1451, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss-icon-full - rotate: false - xy: 1451, 633 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -oil-extractor-icon-full - rotate: false - xy: 749, 1044 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ore-coal-icon-full - rotate: false - xy: 1187, 599 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-icon-medium - rotate: false - xy: 1187, 599 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-coal-icon-large - rotate: false - xy: 1361, 1325 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-coal-icon-small +item-plastanium-small rotate: false xy: 449, 488 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -ore-copper-icon-full +item-plastanium-tiny rotate: false - xy: 1187, 565 - size: 32, 32 - orig: 32, 32 + xy: 271, 1170 + size: 16, 16 + orig: 16, 16 offset: 0, 0 index: -1 -ore-copper-icon-medium +item-plastanium-xlarge rotate: false - xy: 1187, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-copper-icon-large - rotate: false - xy: 1311, 1275 + xy: 1819, 1507 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -ore-copper-icon-small +item-pyratite-large + rotate: false + xy: 1649, 1319 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-pyratite-medium + rotate: false + xy: 1925, 1237 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-pyratite-small rotate: false xy: 245, 1162 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -ore-lead-icon-full +item-pyratite-tiny rotate: false - xy: 1221, 599 - size: 32, 32 - orig: 32, 32 + xy: 501, 496 + size: 16, 16 + orig: 16, 16 offset: 0, 0 index: -1 -ore-lead-icon-medium +item-pyratite-xlarge rotate: false - xy: 1221, 599 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-lead-icon-large - rotate: false - xy: 1261, 1225 + xy: 1869, 1507 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -ore-lead-icon-small +item-sand-large rotate: false - xy: 361, 38 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-scrap-icon-full - rotate: false - xy: 1187, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-icon-medium - rotate: false - xy: 1187, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-scrap-icon-large - rotate: false - xy: 1211, 1175 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-scrap-icon-small - rotate: false - xy: 1111, 1431 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-thorium-icon-full - rotate: false - xy: 1221, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-icon-medium - rotate: false - xy: 1221, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-thorium-icon-large - rotate: false - xy: 1161, 1125 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-thorium-icon-small - rotate: false - xy: 1365, 369 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ore-titanium-icon-full - rotate: false - xy: 1255, 599 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-icon-medium - rotate: false - xy: 1255, 599 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ore-titanium-icon-large - rotate: false - xy: 1361, 1275 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ore-titanium-icon-small - rotate: false - xy: 1487, 1129 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -pebbles-icon-full - rotate: false - xy: 1221, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phantom-factory-icon-full - rotate: false - xy: 1478, 1529 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -phase-weaver-icon-full - rotate: false - xy: 1808, 1525 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -pine-icon-full - rotate: false - xy: 1311, 1225 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pneumatic-drill-icon-full - rotate: false - xy: 1280, 1491 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -power-source-icon-full - rotate: false - xy: 1323, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-icon-full - rotate: false - xy: 1187, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulverizer-icon-full - rotate: false - xy: 1255, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -repair-point - rotate: false - xy: 1357, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -repair-point-icon-full - rotate: false - xy: 1425, 599 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -revenant-factory-icon-full - rotate: false - xy: 293, 872 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -ripple - rotate: false - xy: 815, 554 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -ripple-icon-full - rotate: false - xy: 783, 358 - size: 96, 96 - orig: 96, 96 - offset: 0, 0 - index: -1 -rock-icon-full - rotate: false - xy: 1361, 1225 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rocks-icon-full - rotate: false - xy: 1255, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-icon-full - rotate: false - xy: 1357, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -saltrocks-icon-full - rotate: false - xy: 1391, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salvo - rotate: false - xy: 789, 96 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -salvo-icon-full - rotate: false - xy: 921, 96 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -sand-boulder-icon-full - rotate: false - xy: 1425, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-icon-full - rotate: false - xy: 1289, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water-icon-full - rotate: false - xy: 1323, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-icon-full - rotate: false - xy: 1357, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scatter - rotate: false - xy: 855, 30 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scatter-icon-full - rotate: false - xy: 921, 30 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -scorch - rotate: false - xy: 1391, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scorch-icon-full - rotate: false - xy: 1323, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-large-icon-full - rotate: false - xy: 1405, 1425 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -shale-boulder-icon-full - rotate: false - xy: 1391, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-icon-full - rotate: false - xy: 1425, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shalerocks-icon-full - rotate: false - xy: 1391, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shock-mine-icon-full - rotate: false - xy: 1425, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shrubs-icon-full - rotate: false - xy: 1459, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-icon-full - rotate: false - xy: 1459, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-pine-icon-full - rotate: false - xy: 1261, 1125 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrock-icon-full - rotate: false - xy: 1361, 1175 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrocks-icon-full - rotate: false - xy: 1459, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spawn-icon-full - rotate: false - xy: 1459, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spectre - rotate: false - xy: 293, 612 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spectre-icon-full - rotate: false - xy: 423, 742 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -spirit-factory-icon-full - rotate: false - xy: 1669, 1397 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -spore-cluster-icon-full - rotate: false - xy: 2006, 1573 + xy: 1691, 1361 size: 40, 40 orig: 40, 40 offset: 0, 0 index: -1 -spore-moss-icon-full +item-sand-medium rotate: false - xy: 1455, 1091 + xy: 1959, 1237 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -spore-pine-icon-full +item-sand-small rotate: false - xy: 1361, 1125 + xy: 809, 288 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-sand-tiny + rotate: false + xy: 501, 478 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-sand-xlarge + rotate: false + xy: 1919, 1507 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -spore-press-icon-full +item-scrap-large rotate: false - xy: 1045, 1417 + xy: 1691, 1319 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-scrap-medium + rotate: false + xy: 1993, 1237 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-scrap-small + rotate: false + xy: 1701, 817 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-scrap-tiny + rotate: false + xy: 2018, 1853 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-scrap-xlarge + rotate: false + xy: 1969, 1507 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-silicon-large + rotate: false + xy: 1733, 1361 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-silicon-medium + rotate: false + xy: 1637, 1159 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-silicon-small + rotate: false + xy: 1735, 875 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-silicon-tiny + rotate: false + xy: 173, 103 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-silicon-xlarge + rotate: false + xy: 1747, 1453 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-spore-pod-large + rotate: false + xy: 1733, 1319 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-spore-pod-medium + rotate: false + xy: 1633, 1087 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod-small + rotate: false + xy: 1761, 901 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-spore-pod-tiny + rotate: false + xy: 215, 5 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-spore-pod-xlarge + rotate: false + xy: 1747, 1403 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-surge-alloy-large + rotate: false + xy: 1607, 1277 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-surge-alloy-medium + rotate: false + xy: 1633, 1019 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-surge-alloy-small + rotate: false + xy: 1986, 1923 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-surge-alloy-tiny + rotate: false + xy: 1021, 699 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-surge-alloy-xlarge + rotate: false + xy: 1797, 1457 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-thorium-large + rotate: false + xy: 1649, 1277 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-thorium-medium + rotate: false + xy: 1633, 951 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-thorium-small + rotate: false + xy: 475, 488 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-thorium-tiny + rotate: false + xy: 1021, 681 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-thorium-xlarge + rotate: false + xy: 1797, 1407 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +item-titanium-large + rotate: false + xy: 1691, 1277 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +item-titanium-medium + rotate: false + xy: 1633, 883 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-titanium-small + rotate: false + xy: 1701, 791 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +item-titanium-tiny + rotate: false + xy: 2027, 1235 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +item-titanium-xlarge + rotate: false + xy: 1847, 1457 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +lancer + rotate: false + xy: 1177, 1163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 -sporerocks-icon-full +liquid-cryofluid-large rotate: false - xy: 1455, 1057 + xy: 1733, 1277 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-cryofluid-medium + rotate: false + xy: 1633, 815 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -stone-icon-full +liquid-cryofluid-small rotate: false - xy: 987, 1 + xy: 1761, 875 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-cryofluid-tiny + rotate: false + xy: 1795, 1095 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-cryofluid-xlarge + rotate: false + xy: 1947, 1457 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-oil-large + rotate: false + xy: 1599, 1235 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-oil-medium + rotate: false + xy: 1652, 747 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -swarmer +liquid-oil-small rotate: false - xy: 913, 1285 - size: 64, 64 - orig: 64, 64 + xy: 2012, 1923 + size: 24, 24 + orig: 24, 24 offset: 0, 0 index: -1 -swarmer-icon-full +liquid-oil-tiny rotate: false - xy: 979, 1285 - size: 64, 64 - orig: 64, 64 + xy: 2018, 1835 + size: 16, 16 + orig: 16, 16 offset: 0, 0 index: -1 -tainted-water-icon-full +liquid-oil-xlarge rotate: false - xy: 1055, 2 + xy: 1947, 1407 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-slag-large + rotate: false + xy: 1599, 1193 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-slag-medium + rotate: false + xy: 1857, 1169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -tar-icon-full +liquid-slag-small rotate: false - xy: 1089, 2 + xy: 2018, 1897 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +liquid-slag-tiny + rotate: false + xy: 233, 5 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-slag-xlarge + rotate: false + xy: 1997, 1457 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +liquid-water-large + rotate: false + xy: 1641, 1235 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +liquid-water-medium + rotate: false + xy: 1925, 1169 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -tendrils-icon-full +liquid-water-small rotate: false - xy: 1101, 342 - size: 32, 32 - orig: 32, 32 + xy: 2018, 1871 + size: 24, 24 + orig: 24, 24 offset: 0, 0 index: -1 -titan-factory-icon-full +liquid-water-tiny rotate: false - xy: 852, 1657 + xy: 2027, 1217 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +liquid-water-xlarge + rotate: false + xy: 1997, 1407 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mass-driver + rotate: false + xy: 805, 1338 size: 96, 96 orig: 96, 96 offset: 0, 0 index: -1 -unit-icon-chaos-array +mech-alpha-mech-full rotate: false - xy: 423, 612 - size: 128, 128 - orig: 128, 128 - offset: 0, 0 - index: -1 -unit-icon-crawler - rotate: false - xy: 1411, 1175 + xy: 1507, 1345 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -unit-icon-dagger +mech-dart-ship-full rotate: false - xy: 1411, 1125 + xy: 1507, 1295 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -unit-icon-eradicator +mech-delta-mech-full rotate: false - xy: 1, 99 - size: 152, 124 - orig: 152, 124 - offset: 0, 0 - index: -1 -unit-icon-eruptor - rotate: false - xy: 979, 955 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-icon-fortress - rotate: false - xy: 913, 889 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -unit-icon-titan - rotate: false - xy: 979, 889 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-extractor-icon-full - rotate: false - xy: 979, 823 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -water-icon-full - rotate: false - xy: 1305, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -wave - rotate: false - xy: 979, 691 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -wave-icon-full - rotate: false - xy: 1045, 1285 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -white-tree-dead-icon-full - rotate: false - xy: 1, 1403 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -white-tree-icon-full - rotate: false - xy: 323, 1725 - size: 320, 320 - orig: 320, 320 - offset: 0, 0 - index: -1 -wraith-factory-icon-full - rotate: false - xy: 1045, 1153 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -item-blast-compound - rotate: false - xy: 1341, 735 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-coal - rotate: false - xy: 1409, 769 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-copper - rotate: false - xy: 1375, 735 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-graphite - rotate: false - xy: 1409, 735 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-lead - rotate: false - xy: 1145, 685 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-metaglass - rotate: false - xy: 1179, 701 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-phase-fabric - rotate: false - xy: 1213, 701 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-plastanium - rotate: false - xy: 1247, 701 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-pyratite - rotate: false - xy: 1281, 701 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-sand - rotate: false - xy: 1315, 701 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-scrap - rotate: false - xy: 1349, 701 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-silicon - rotate: false - xy: 1383, 701 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-spore-pod - rotate: false - xy: 1179, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-surge-alloy - rotate: false - xy: 1213, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-thorium - rotate: false - xy: 1247, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-titanium - rotate: false - xy: 1281, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-cryofluid - rotate: false - xy: 1383, 667 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-oil - rotate: false - xy: 1179, 633 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-slag - rotate: false - xy: 1349, 633 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-water - rotate: false - xy: 1417, 633 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -alpha-mech - rotate: false - xy: 1999, 1409 + xy: 1507, 1245 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -alpha-mech-base - rotate: false - xy: 1999, 1359 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alpha-mech-leg - rotate: false - xy: 979, 243 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -delta-mech - rotate: false - xy: 1087, 560 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -delta-mech-base - rotate: false - xy: 1037, 460 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -delta-mech-leg - rotate: false - xy: 1087, 510 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -omega-mech - rotate: false - xy: 913, 633 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -omega-mech-armor - rotate: false - xy: 1808, 1591 - size: 64, 64 - orig: 64, 64 - offset: 0, 0 - index: -1 -omega-mech-base - rotate: false - xy: 913, 575 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -omega-mech-leg - rotate: false - xy: 971, 633 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -tau-mech - rotate: false - xy: 979, 459 - size: 56, 56 - orig: 56, 56 - offset: 0, 0 - index: -1 -tau-mech-base - rotate: false - xy: 1411, 1275 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -tau-mech-leg - rotate: false - xy: 1411, 1225 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dart-ship - rotate: false - xy: 1037, 510 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -glaive-ship +mech-glaive-ship-full rotate: false xy: 526, 1537 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 +mech-javelin-ship-full + rotate: false + xy: 1507, 1195 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +mech-omega-mech-full + rotate: false + xy: 1176, 709 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +mech-tau-mech-full + rotate: false + xy: 1498, 1603 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +mech-trident-ship-full + rotate: false + xy: 584, 1537 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +meltdown + rotate: false + xy: 423, 1002 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +repair-point + rotate: false + xy: 1883, 1101 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +ripple + rotate: false + xy: 1146, 1657 + size: 96, 96 + orig: 96, 96 + offset: 0, 0 + index: -1 +salvo + rotate: false + xy: 1045, 767 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scatter + rotate: false + xy: 1309, 1031 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +scorch + rotate: false + xy: 1985, 1101 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +spectre + rotate: false + xy: 293, 482 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +swarmer + rotate: false + xy: 1375, 899 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-chaos-array-full + rotate: false + xy: 423, 612 + size: 128, 128 + orig: 128, 128 + offset: 0, 0 + index: -1 +unit-crawler-full + rotate: false + xy: 1507, 795 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-dagger-full + rotate: false + xy: 1557, 1345 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +unit-eradicator-full + rotate: false + xy: 1, 99 + size: 152, 124 + orig: 152, 124 + offset: 0, 0 + index: -1 +unit-eruptor-full + rotate: false + xy: 1441, 1295 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-fortress-full + rotate: false + xy: 1441, 1229 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +unit-titan-full + rotate: false + xy: 1441, 1163 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +wave + rotate: false + xy: 1441, 833 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +item-blast-compound + rotate: false + xy: 1534, 655 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-coal + rotate: false + xy: 1602, 645 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-copper + rotate: false + xy: 1636, 645 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-graphite + rotate: false + xy: 1721, 1209 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-lead + rotate: false + xy: 1755, 1199 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-metaglass + rotate: false + xy: 1789, 1199 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-phase-fabric + rotate: false + xy: 1823, 1203 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-plastanium + rotate: false + xy: 1857, 1203 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-pyratite + rotate: false + xy: 1891, 1203 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-sand + rotate: false + xy: 1925, 1203 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-scrap + rotate: false + xy: 1959, 1203 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-silicon + rotate: false + xy: 1993, 1203 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-spore-pod + rotate: false + xy: 1633, 1121 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-surge-alloy + rotate: false + xy: 1633, 1053 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-thorium + rotate: false + xy: 1633, 985 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +item-titanium + rotate: false + xy: 1633, 917 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-cryofluid + rotate: false + xy: 1633, 849 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-oil + rotate: false + xy: 1633, 781 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-slag + rotate: false + xy: 1823, 1169 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +liquid-water + rotate: false + xy: 1891, 1169 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +alpha-mech + rotate: false + xy: 923, 631 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-mech-base + rotate: false + xy: 923, 581 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +alpha-mech-leg + rotate: false + xy: 973, 631 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +delta-mech + rotate: false + xy: 1519, 1503 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +delta-mech-base + rotate: false + xy: 1569, 1503 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +delta-mech-leg + rotate: false + xy: 1619, 1503 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +omega-mech + rotate: false + xy: 1234, 709 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +omega-mech-armor + rotate: false + xy: 1243, 1163 + size: 64, 64 + orig: 64, 64 + offset: 0, 0 + index: -1 +omega-mech-base + rotate: false + xy: 1556, 1603 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +omega-mech-leg + rotate: false + xy: 1292, 709 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +tau-mech + rotate: false + xy: 1672, 1603 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 +tau-mech-base + rotate: false + xy: 1507, 895 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +tau-mech-leg + rotate: false + xy: 1507, 845 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +dart-ship + rotate: false + xy: 1469, 1503 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +glaive-ship + rotate: false + xy: 1440, 1559 + size: 56, 56 + orig: 56, 56 + offset: 0, 0 + index: -1 javelin-ship rotate: false - xy: 1261, 1325 + xy: 1847, 1407 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 javelin-ship-shield rotate: false - xy: 1211, 1275 + xy: 1897, 1457 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 trident-ship rotate: false - xy: 979, 401 + xy: 1408, 709 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 blank rotate: false - xy: 1110, 1022 + xy: 913, 678 size: 1, 1 orig: 1, 1 offset: 0, 0 @@ -5039,77 +5375,77 @@ circle index: -1 shape-3 rotate: false - xy: 1045, 1022 + xy: 1111, 702 size: 63, 63 orig: 63, 63 offset: 0, 0 index: -1 chaos-array rotate: false - xy: 163, 771 + xy: 1368, 1755 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 chaos-array-base rotate: false - xy: 163, 641 + xy: 1498, 1791 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 chaos-array-leg rotate: false - xy: 163, 511 + xy: 1628, 1791 size: 128, 128 orig: 128, 128 offset: 0, 0 index: -1 crawler rotate: false - xy: 987, 85 + xy: 1798, 1557 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-base rotate: false - xy: 987, 35 + xy: 1848, 1557 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 crawler-leg rotate: false - xy: 1079, 610 + xy: 1898, 1557 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger rotate: false - xy: 1095, 660 + xy: 1980, 1607 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-base rotate: false - xy: 1129, 610 + xy: 1948, 1557 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 dagger-leg rotate: false - xy: 1037, 560 + xy: 1998, 1557 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 draug rotate: false - xy: 1037, 410 + xy: 1669, 1503 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -5137,49 +5473,49 @@ eradicator-leg index: -1 eruptor rotate: false - xy: 657, 52 + xy: 1177, 1295 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 eruptor-base rotate: false - xy: 1082, 1615 + xy: 1045, 1097 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 eruptor-leg rotate: false - xy: 1082, 1549 + xy: 1111, 1163 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress rotate: false - xy: 1075, 1483 + xy: 1177, 1229 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-base rotate: false - xy: 1148, 1623 + xy: 1243, 1295 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-base rotate: false - xy: 1148, 1623 + xy: 1243, 1295 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 fortress-leg rotate: false - xy: 1214, 1623 + xy: 1045, 1031 size: 64, 64 orig: 64, 64 offset: 0, 0 @@ -5200,21 +5536,21 @@ lich index: -1 phantom rotate: false - xy: 971, 575 + xy: 1614, 1603 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 power-cell rotate: false - xy: 979, 517 + xy: 1350, 709 size: 56, 56 orig: 56, 56 offset: 0, 0 index: -1 reaper rotate: false - xy: 1, 1725 + xy: 323, 1725 size: 320, 320 orig: 320, 320 offset: 0, 0 @@ -5228,140 +5564,140 @@ revenant index: -1 spirit rotate: false - xy: 1311, 1125 + xy: 1507, 995 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 titan rotate: false - xy: 979, 1153 + xy: 1309, 767 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 titan-leg rotate: false - xy: 913, 1087 + xy: 1375, 833 size: 64, 64 orig: 64, 64 offset: 0, 0 index: -1 wraith rotate: false - xy: 1111, 1067 + xy: 1557, 1295 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 artillery-equip rotate: false - xy: 979, 185 + xy: 973, 573 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 blaster-equip rotate: false - xy: 1045, 660 + xy: 1498, 1553 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 bomber-equip rotate: false - xy: 1029, 610 + xy: 1930, 1607 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 missiles-equip rotate: false - xy: 1029, 610 + xy: 1930, 1607 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 chain-blaster-equip rotate: false - xy: 987, 135 + xy: 1748, 1557 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 chaos-equip rotate: false - xy: 1045, 884 + xy: 1440, 1617 size: 56, 136 orig: 56, 136 offset: 0, 0 index: -1 eradication-equip rotate: false - xy: 391, 190 + xy: 651, 850 size: 96, 192 orig: 96, 192 offset: 0, 0 index: -1 eruption-equip rotate: false - xy: 1137, 552 + xy: 1497, 1395 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 flakgun-equip rotate: false - xy: 1087, 410 + xy: 1547, 1453 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 flamethrower-equip rotate: false - xy: 1137, 494 + xy: 1547, 1395 size: 48, 56 orig: 48, 56 offset: 0, 0 index: -1 heal-blaster-equip rotate: false - xy: 1137, 444 + xy: 1597, 1453 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 lich-missiles-equip rotate: false - xy: 1161, 1225 + xy: 1897, 1407 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 reaper-gun-equip rotate: false - xy: 1261, 1175 + xy: 1507, 1145 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 revenant-missiles-equip rotate: false - xy: 1211, 1125 + xy: 1507, 1095 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 shockgun-equip rotate: false - xy: 1311, 1175 + xy: 1507, 1045 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 swarmer-equip rotate: false - xy: 1411, 1325 + xy: 1507, 945 size: 48, 48 orig: 48, 48 offset: 0, 0 @@ -8827,72 +9163,9 @@ size: 2048,1024 format: RGBA8888 filter: Nearest,Nearest repeat: none -alloy-smelter-icon-large - rotate: false - xy: 1, 670 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -alloy-smelter-icon-medium - rotate: false - xy: 301, 517 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -alloy-smelter-icon-small - rotate: false - xy: 1979, 749 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -arc-icon-large - rotate: false - xy: 259, 928 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -arc-icon-medium - rotate: false - xy: 301, 483 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -arc-icon-small - rotate: false - xy: 1975, 723 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -armored-conveyor-icon-large - rotate: false - xy: 1, 620 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -armored-conveyor-icon-medium - rotate: false - xy: 301, 449 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -armored-conveyor-icon-small - rotate: false - xy: 567, 305 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 bar rotate: false - xy: 789, 485 + xy: 2019, 703 size: 27, 36 split: 9, 9, 9, 9 orig: 27, 36 @@ -8900,141 +9173,6525 @@ bar index: -1 bar-top rotate: false - xy: 535, 221 + xy: 1009, 342 size: 27, 36 split: 9, 10, 9, 10 orig: 27, 36 offset: 0, 0 index: -1 -battery-icon-large +block-alloy-smelter-large + rotate: false + xy: 1937, 733 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-alloy-smelter-medium + rotate: false + xy: 2009, 941 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-alloy-smelter-small + rotate: false + xy: 1009, 316 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-alloy-smelter-tiny + rotate: false + xy: 338, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-alloy-smelter-xlarge + rotate: false + xy: 1, 670 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-arc-large + rotate: false + xy: 301, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-arc-medium + rotate: false + xy: 2009, 907 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-arc-small + rotate: false + xy: 2021, 549 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-arc-tiny + rotate: false + xy: 356, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-arc-xlarge + rotate: false + xy: 259, 928 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-armored-conveyor-large + rotate: false + xy: 301, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-armored-conveyor-medium + rotate: false + xy: 2009, 873 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-armored-conveyor-small + rotate: false + xy: 1011, 290 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-armored-conveyor-tiny + rotate: false + xy: 374, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-armored-conveyor-xlarge + rotate: false + xy: 1, 620 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-battery-large + rotate: false + xy: 343, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-large + rotate: false + xy: 301, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-battery-large-medium + rotate: false + xy: 2009, 839 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-battery-large-small + rotate: false + xy: 1011, 264 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-battery-large-tiny + rotate: false + xy: 392, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-battery-large-xlarge rotate: false xy: 259, 878 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -battery-icon-medium +block-battery-medium rotate: false - xy: 301, 415 + xy: 2009, 805 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -battery-icon-small +block-battery-small rotate: false - xy: 599, 337 + xy: 1011, 238 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -battery-large-icon-large +block-battery-tiny + rotate: false + xy: 410, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-battery-xlarge rotate: false xy: 1, 570 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -battery-large-icon-medium +block-blast-drill-large rotate: false - xy: 301, 381 + xy: 343, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-blast-drill-medium + rotate: false + xy: 1979, 741 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -battery-large-icon-small +block-blast-drill-small rotate: false - xy: 631, 369 + xy: 1989, 579 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -blast-drill-icon-large +block-blast-drill-tiny + rotate: false + xy: 428, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-blast-drill-xlarge rotate: false xy: 259, 828 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -blast-drill-icon-medium +block-blast-mixer-large rotate: false - xy: 301, 347 + xy: 385, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-blast-mixer-medium + rotate: false + xy: 1441, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -blast-drill-icon-small +block-blast-mixer-small rotate: false - xy: 663, 401 + xy: 817, 4 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -blast-mixer-icon-large +block-blast-mixer-tiny + rotate: false + xy: 446, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-blast-mixer-xlarge rotate: false xy: 1, 520 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -blast-mixer-icon-medium +block-bridge-conduit-large rotate: false - xy: 301, 313 + xy: 301, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-bridge-conduit-medium + rotate: false + xy: 1475, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -blast-mixer-icon-small +block-bridge-conduit-small rotate: false - xy: 695, 433 + xy: 843, 4 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -bridge-conduit-icon-large +block-bridge-conduit-tiny + rotate: false + xy: 464, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-bridge-conduit-xlarge rotate: false xy: 259, 778 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -bridge-conduit-icon-medium +block-bridge-conveyor-large rotate: false - xy: 301, 279 + xy: 343, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-bridge-conveyor-medium + rotate: false + xy: 1509, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -bridge-conduit-icon-small +block-bridge-conveyor-small rotate: false - xy: 818, 497 + xy: 869, 4 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 -bridge-conveyor-icon-large +block-bridge-conveyor-tiny + rotate: false + xy: 482, 1 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-bridge-conveyor-xlarge rotate: false xy: 1, 470 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 -bridge-conveyor-icon-medium +block-char-large rotate: false - xy: 301, 245 + xy: 385, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-char-medium + rotate: false + xy: 1543, 691 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 -bridge-conveyor-icon-small +block-char-small rotate: false - xy: 535, 132 + xy: 945, 2 size: 24, 24 orig: 24, 24 offset: 0, 0 index: -1 +block-char-tiny + rotate: false + xy: 731, 166 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-char-xlarge + rotate: false + xy: 1, 420 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cliffs-large + rotate: false + xy: 427, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cliffs-medium + rotate: false + xy: 1577, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cliffs-small + rotate: false + xy: 971, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cliffs-tiny + rotate: false + xy: 857, 292 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cliffs-xlarge + rotate: false + xy: 1, 370 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-coal-centrifuge-large + rotate: false + xy: 301, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-coal-centrifuge-medium + rotate: false + xy: 1611, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-coal-centrifuge-small + rotate: false + xy: 997, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-coal-centrifuge-tiny + rotate: false + xy: 895, 12 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-coal-centrifuge-xlarge + rotate: false + xy: 1, 320 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-combustion-generator-large + rotate: false + xy: 343, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-combustion-generator-medium + rotate: false + xy: 1645, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-combustion-generator-small + rotate: false + xy: 1023, 2 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-combustion-generator-tiny + rotate: false + xy: 1, 2 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-combustion-generator-xlarge + rotate: false + xy: 1, 270 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-command-center-large + rotate: false + xy: 385, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-command-center-medium + rotate: false + xy: 1679, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-command-center-small + rotate: false + xy: 2021, 523 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-command-center-tiny + rotate: false + xy: 757, 70 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-command-center-xlarge + rotate: false + xy: 1, 220 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-conduit-large + rotate: false + xy: 427, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-conduit-medium + rotate: false + xy: 1713, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conduit-small + rotate: false + xy: 2013, 497 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-conduit-tiny + rotate: false + xy: 885, 68 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-conduit-xlarge + rotate: false + xy: 1, 170 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-container-large + rotate: false + xy: 469, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-container-medium + rotate: false + xy: 1747, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-container-small + rotate: false + xy: 2013, 471 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-container-tiny + rotate: false + xy: 1013, 64 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-container-xlarge + rotate: false + xy: 1, 120 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-conveyor-large + rotate: false + xy: 301, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-conveyor-medium + rotate: false + xy: 1781, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-conveyor-small + rotate: false + xy: 1013, 212 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-conveyor-tiny + rotate: false + xy: 1045, 450 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-conveyor-xlarge + rotate: false + xy: 1, 70 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-copper-wall-large + rotate: false + xy: 343, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-large + rotate: false + xy: 385, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-copper-wall-large-medium + rotate: false + xy: 1815, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-copper-wall-large-small + rotate: false + xy: 1013, 186 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-copper-wall-large-tiny + rotate: false + xy: 1063, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-copper-wall-large-xlarge + rotate: false + xy: 1, 20 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-copper-wall-medium + rotate: false + xy: 1849, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-copper-wall-small + rotate: false + xy: 1013, 160 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-copper-wall-tiny + rotate: false + xy: 1349, 302 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-copper-wall-xlarge + rotate: false + xy: 87, 717 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-foundation-large + rotate: false + xy: 427, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-foundation-medium + rotate: false + xy: 1883, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-foundation-small + rotate: false + xy: 1013, 134 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-foundation-tiny + rotate: false + xy: 1323, 265 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-foundation-xlarge + rotate: false + xy: 137, 717 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-nucleus-large + rotate: false + xy: 469, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-nucleus-medium + rotate: false + xy: 343, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-nucleus-small + rotate: false + xy: 1013, 108 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-nucleus-tiny + rotate: false + xy: 19, 2 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-nucleus-xlarge + rotate: false + xy: 187, 717 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-core-shard-large + rotate: false + xy: 511, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-core-shard-medium + rotate: false + xy: 377, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-core-shard-small + rotate: false + xy: 1013, 82 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-core-shard-tiny + rotate: false + xy: 1045, 432 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-core-shard-xlarge + rotate: false + xy: 345, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-craters-large + rotate: false + xy: 301, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-craters-medium + rotate: false + xy: 411, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-craters-small + rotate: false + xy: 1035, 316 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-craters-tiny + rotate: false + xy: 1081, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-craters-xlarge + rotate: false + xy: 395, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-crawler-factory-large + rotate: false + xy: 343, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-crawler-factory-medium + rotate: false + xy: 445, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-crawler-factory-small + rotate: false + xy: 1037, 290 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-crawler-factory-tiny + rotate: false + xy: 1367, 302 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-crawler-factory-xlarge + rotate: false + xy: 445, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cryofluidmixer-large + rotate: false + xy: 385, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cryofluidmixer-medium + rotate: false + xy: 479, 19 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cryofluidmixer-small + rotate: false + xy: 1037, 264 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cryofluidmixer-tiny + rotate: false + xy: 1349, 284 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cryofluidmixer-xlarge + rotate: false + xy: 495, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cultivator-large + rotate: false + xy: 427, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cultivator-medium + rotate: false + xy: 1917, 691 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cultivator-small + rotate: false + xy: 1037, 238 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cultivator-tiny + rotate: false + xy: 1367, 284 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cultivator-xlarge + rotate: false + xy: 545, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-cyclone-large + rotate: false + xy: 469, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-cyclone-medium + rotate: false + xy: 1951, 699 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-cyclone-small + rotate: false + xy: 1039, 212 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-cyclone-tiny + rotate: false + xy: 1099, 242 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-cyclone-xlarge + rotate: false + xy: 595, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dagger-factory-large + rotate: false + xy: 511, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dagger-factory-medium + rotate: false + xy: 1985, 707 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dagger-factory-small + rotate: false + xy: 1039, 186 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dagger-factory-tiny + rotate: false + xy: 1065, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dagger-factory-xlarge + rotate: false + xy: 645, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-metal-large + rotate: false + xy: 553, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-metal-medium + rotate: false + xy: 553, 116 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-metal-small + rotate: false + xy: 1039, 160 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-metal-tiny + rotate: false + xy: 1065, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-metal-xlarge + rotate: false + xy: 695, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-1-large + rotate: false + xy: 301, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-1-medium + rotate: false + xy: 549, 82 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-1-small + rotate: false + xy: 1039, 134 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-1-tiny + rotate: false + xy: 1083, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-1-xlarge + rotate: false + xy: 745, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-2-large + rotate: false + xy: 343, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-2-medium + rotate: false + xy: 595, 158 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-2-small + rotate: false + xy: 1039, 108 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-2-tiny + rotate: false + xy: 1065, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-2-xlarge + rotate: false + xy: 795, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-3-large + rotate: false + xy: 385, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-3-medium + rotate: false + xy: 637, 200 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-3-small + rotate: false + xy: 1039, 82 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-3-tiny + rotate: false + xy: 1083, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-3-xlarge + rotate: false + xy: 845, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-4-large + rotate: false + xy: 427, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-4-medium + rotate: false + xy: 679, 242 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-4-small + rotate: false + xy: 753, 6 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-4-tiny + rotate: false + xy: 1065, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-4-xlarge + rotate: false + xy: 895, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-5-large + rotate: false + xy: 469, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-5-medium + rotate: false + xy: 721, 284 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-5-small + rotate: false + xy: 1038, 354 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-5-tiny + rotate: false + xy: 1083, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-5-xlarge + rotate: false + xy: 945, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dark-panel-6-large + rotate: false + xy: 511, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dark-panel-6-medium + rotate: false + xy: 763, 326 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dark-panel-6-small + rotate: false + xy: 1041, 56 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dark-panel-6-tiny + rotate: false + xy: 1065, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dark-panel-6-xlarge + rotate: false + xy: 995, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-large + rotate: false + xy: 553, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-medium + rotate: false + xy: 805, 368 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-small + rotate: false + xy: 1041, 30 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-large + rotate: false + xy: 595, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-medium + rotate: false + xy: 847, 410 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-small + rotate: false + xy: 1049, 4 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-tiny + rotate: false + xy: 1083, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-tainted-water-xlarge + rotate: false + xy: 1045, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-tiny + rotate: false + xy: 1065, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-large + rotate: false + xy: 301, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-darksand-water-medium + rotate: false + xy: 889, 452 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-darksand-water-small + rotate: false + xy: 1040, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-darksand-water-tiny + rotate: false + xy: 1083, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-darksand-water-xlarge + rotate: false + xy: 1095, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-darksand-xlarge + rotate: false + xy: 1145, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dart-mech-pad-large + rotate: false + xy: 343, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dart-mech-pad-medium + rotate: false + xy: 931, 494 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dart-mech-pad-small + rotate: false + xy: 1066, 416 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dart-mech-pad-tiny + rotate: false + xy: 1065, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dart-mech-pad-xlarge + rotate: false + xy: 1195, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-deepwater-large + rotate: false + xy: 385, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-deepwater-medium + rotate: false + xy: 973, 536 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-deepwater-small + rotate: false + xy: 1092, 416 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-deepwater-tiny + rotate: false + xy: 1083, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-deepwater-xlarge + rotate: false + xy: 1245, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-delta-mech-pad-large + rotate: false + xy: 427, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-delta-mech-pad-medium + rotate: false + xy: 1015, 578 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-delta-mech-pad-small + rotate: false + xy: 1066, 390 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-delta-mech-pad-tiny + rotate: false + xy: 1065, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-delta-mech-pad-xlarge + rotate: false + xy: 1295, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-differential-generator-large + rotate: false + xy: 469, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-differential-generator-medium + rotate: false + xy: 1057, 620 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-differential-generator-small + rotate: false + xy: 1092, 390 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-differential-generator-tiny + rotate: false + xy: 1083, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-differential-generator-xlarge + rotate: false + xy: 1345, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-distributor-large + rotate: false + xy: 511, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-distributor-medium + rotate: false + xy: 1099, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-distributor-small + rotate: false + xy: 1064, 364 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-distributor-tiny + rotate: false + xy: 1083, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-distributor-xlarge + rotate: false + xy: 1395, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-door-large + rotate: false + xy: 553, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-door-large-large + rotate: false + xy: 595, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-door-large-medium + rotate: false + xy: 1133, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-door-large-small + rotate: false + xy: 1090, 364 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-door-large-tiny + rotate: false + xy: 1101, 224 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-door-large-xlarge + rotate: false + xy: 1445, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-door-medium + rotate: false + xy: 1167, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-door-small + rotate: false + xy: 1064, 338 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-door-tiny + rotate: false + xy: 1101, 206 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-door-xlarge + rotate: false + xy: 1495, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-draug-factory-large + rotate: false + xy: 637, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-draug-factory-medium + rotate: false + xy: 1201, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-draug-factory-small + rotate: false + xy: 1090, 338 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-draug-factory-tiny + rotate: false + xy: 1101, 188 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-draug-factory-xlarge + rotate: false + xy: 1545, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-dunerocks-large + rotate: false + xy: 301, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-dunerocks-medium + rotate: false + xy: 1235, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-dunerocks-small + rotate: false + xy: 1118, 398 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-dunerocks-tiny + rotate: false + xy: 1101, 170 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-dunerocks-xlarge + rotate: false + xy: 1595, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-duo-large + rotate: false + xy: 343, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-duo-medium + rotate: false + xy: 1269, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-duo-small + rotate: false + xy: 1144, 398 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-duo-tiny + rotate: false + xy: 1101, 152 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-duo-xlarge + rotate: false + xy: 1645, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-force-projector-large + rotate: false + xy: 385, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-force-projector-medium + rotate: false + xy: 1303, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-force-projector-small + rotate: false + xy: 1170, 398 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-force-projector-tiny + rotate: false + xy: 1101, 134 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-force-projector-xlarge + rotate: false + xy: 1695, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-fortress-factory-large + rotate: false + xy: 427, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-fortress-factory-medium + rotate: false + xy: 1337, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-fortress-factory-small + rotate: false + xy: 1196, 398 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-fortress-factory-tiny + rotate: false + xy: 1101, 116 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-fortress-factory-xlarge + rotate: false + xy: 1745, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-fuse-large + rotate: false + xy: 469, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-fuse-medium + rotate: false + xy: 1371, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-fuse-small + rotate: false + xy: 1222, 398 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-fuse-tiny + rotate: false + xy: 1101, 98 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-fuse-xlarge + rotate: false + xy: 1795, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ghoul-factory-large + rotate: false + xy: 511, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ghoul-factory-medium + rotate: false + xy: 1405, 662 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ghoul-factory-small + rotate: false + xy: 1248, 398 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ghoul-factory-tiny + rotate: false + xy: 1323, 247 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ghoul-factory-xlarge + rotate: false + xy: 1845, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-large + rotate: false + xy: 553, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-medium + rotate: false + xy: 1439, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-small + rotate: false + xy: 1274, 398 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-tiny + rotate: false + xy: 779, 6 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-glaive-ship-pad-xlarge + rotate: false + xy: 1895, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-graphite-press-large + rotate: false + xy: 595, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-graphite-press-medium + rotate: false + xy: 1473, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-graphite-press-small + rotate: false + xy: 1300, 398 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-graphite-press-tiny + rotate: false + xy: 797, 6 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-graphite-press-xlarge + rotate: false + xy: 1945, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-grass-large + rotate: false + xy: 637, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-grass-medium + rotate: false + xy: 1507, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-grass-small + rotate: false + xy: 1326, 398 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-grass-tiny + rotate: false + xy: 913, 4 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-grass-xlarge + rotate: false + xy: 1995, 975 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-hail-large + rotate: false + xy: 679, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-hail-medium + rotate: false + xy: 1541, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hail-small + rotate: false + xy: 1352, 398 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-hail-tiny + rotate: false + xy: 1117, 250 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-hail-xlarge + rotate: false + xy: 237, 717 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-holostone-large + rotate: false + xy: 301, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-holostone-medium + rotate: false + xy: 1575, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-holostone-small + rotate: false + xy: 1378, 398 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-holostone-tiny + rotate: false + xy: 1135, 250 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-holostone-xlarge + rotate: false + xy: 51, 667 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-hotrock-large + rotate: false + xy: 343, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-hotrock-medium + rotate: false + xy: 1609, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-hotrock-small + rotate: false + xy: 1404, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-hotrock-tiny + rotate: false + xy: 1153, 250 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-hotrock-xlarge + rotate: false + xy: 51, 617 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ice-large + rotate: false + xy: 385, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-medium + rotate: false + xy: 1643, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-small + rotate: false + xy: 1430, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-snow-large + rotate: false + xy: 427, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ice-snow-medium + rotate: false + xy: 1677, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ice-snow-small + rotate: false + xy: 1456, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ice-snow-tiny + rotate: false + xy: 1171, 250 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-snow-xlarge + rotate: false + xy: 101, 667 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ice-tiny + rotate: false + xy: 1189, 250 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ice-xlarge + rotate: false + xy: 51, 567 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-icerocks-large + rotate: false + xy: 469, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-icerocks-medium + rotate: false + xy: 1711, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-icerocks-small + rotate: false + xy: 1482, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-icerocks-tiny + rotate: false + xy: 1207, 250 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-icerocks-xlarge + rotate: false + xy: 101, 617 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ignarock-large + rotate: false + xy: 511, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ignarock-medium + rotate: false + xy: 1745, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ignarock-small + rotate: false + xy: 1508, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ignarock-tiny + rotate: false + xy: 1225, 250 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ignarock-xlarge + rotate: false + xy: 151, 667 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-impact-reactor-large + rotate: false + xy: 553, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-impact-reactor-medium + rotate: false + xy: 1779, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-impact-reactor-small + rotate: false + xy: 1534, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-impact-reactor-tiny + rotate: false + xy: 1243, 250 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-impact-reactor-xlarge + rotate: false + xy: 51, 517 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-incinerator-large + rotate: false + xy: 595, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-incinerator-medium + rotate: false + xy: 1813, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-incinerator-small + rotate: false + xy: 1560, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-incinerator-tiny + rotate: false + xy: 1119, 232 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-incinerator-xlarge + rotate: false + xy: 101, 567 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-item-source-large + rotate: false + xy: 637, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-item-source-medium + rotate: false + xy: 1847, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-source-small + rotate: false + xy: 1586, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-item-source-tiny + rotate: false + xy: 1119, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-item-source-xlarge + rotate: false + xy: 151, 617 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-item-void-large + rotate: false + xy: 679, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-item-void-medium + rotate: false + xy: 1881, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-item-void-small + rotate: false + xy: 1612, 393 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-item-void-tiny + rotate: false + xy: 1137, 232 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-item-void-xlarge + rotate: false + xy: 201, 667 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-large + rotate: false + xy: 721, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-medium + rotate: false + xy: 1915, 657 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-small + rotate: false + xy: 1118, 372 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-tiny + rotate: false + xy: 1119, 196 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-javelin-ship-pad-xlarge + rotate: false + xy: 51, 467 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-junction-large + rotate: false + xy: 301, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-junction-medium + rotate: false + xy: 513, 45 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-junction-small + rotate: false + xy: 1144, 372 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-junction-tiny + rotate: false + xy: 1137, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-junction-xlarge + rotate: false + xy: 101, 517 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-kiln-large + rotate: false + xy: 343, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-kiln-medium + rotate: false + xy: 513, 11 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-kiln-small + rotate: false + xy: 1170, 372 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-kiln-tiny + rotate: false + xy: 1155, 232 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-kiln-xlarge + rotate: false + xy: 151, 567 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-lancer-large + rotate: false + xy: 385, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-lancer-medium + rotate: false + xy: 1951, 665 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-lancer-small + rotate: false + xy: 1196, 372 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-lancer-tiny + rotate: false + xy: 1119, 178 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-lancer-xlarge + rotate: false + xy: 201, 617 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-laser-drill-large + rotate: false + xy: 427, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-laser-drill-medium + rotate: false + xy: 1985, 673 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-laser-drill-small + rotate: false + xy: 1222, 372 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-laser-drill-tiny + rotate: false + xy: 1137, 196 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-laser-drill-xlarge + rotate: false + xy: 51, 417 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-launch-pad-large + rotate: false + xy: 469, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-large + rotate: false + xy: 511, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-launch-pad-large-medium + rotate: false + xy: 1985, 639 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-launch-pad-large-small + rotate: false + xy: 1248, 372 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-launch-pad-large-tiny + rotate: false + xy: 1155, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-launch-pad-large-xlarge + rotate: false + xy: 101, 467 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-launch-pad-medium + rotate: false + xy: 1949, 631 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-launch-pad-small + rotate: false + xy: 1274, 372 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-launch-pad-tiny + rotate: false + xy: 1173, 232 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-launch-pad-xlarge + rotate: false + xy: 151, 517 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-junction-large + rotate: false + xy: 553, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-junction-medium + rotate: false + xy: 1983, 605 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-junction-small + rotate: false + xy: 1300, 372 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-junction-tiny + rotate: false + xy: 1119, 160 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-junction-xlarge + rotate: false + xy: 201, 567 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-router-large + rotate: false + xy: 595, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-router-medium + rotate: false + xy: 587, 116 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-router-small + rotate: false + xy: 1326, 372 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-router-tiny + rotate: false + xy: 1137, 178 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-router-xlarge + rotate: false + xy: 51, 367 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-source-large + rotate: false + xy: 637, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-source-medium + rotate: false + xy: 583, 82 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-source-small + rotate: false + xy: 1352, 372 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-source-tiny + rotate: false + xy: 1155, 196 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-source-xlarge + rotate: false + xy: 101, 417 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-liquid-tank-large + rotate: false + xy: 679, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-liquid-tank-medium + rotate: false + xy: 629, 158 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-liquid-tank-small + rotate: false + xy: 1378, 372 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-liquid-tank-tiny + rotate: false + xy: 1173, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-liquid-tank-xlarge + rotate: false + xy: 151, 467 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-magmarock-large + rotate: false + xy: 721, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-magmarock-medium + rotate: false + xy: 621, 124 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-magmarock-small + rotate: false + xy: 1116, 346 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-magmarock-tiny + rotate: false + xy: 1191, 232 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-magmarock-xlarge + rotate: false + xy: 201, 517 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mass-driver-large + rotate: false + xy: 763, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mass-driver-medium + rotate: false + xy: 621, 90 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mass-driver-small + rotate: false + xy: 1142, 346 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mass-driver-tiny + rotate: false + xy: 1119, 142 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mass-driver-xlarge + rotate: false + xy: 51, 317 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mechanical-drill-large + rotate: false + xy: 301, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mechanical-drill-medium + rotate: false + xy: 655, 124 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mechanical-drill-small + rotate: false + xy: 1168, 346 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mechanical-drill-tiny + rotate: false + xy: 1137, 160 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mechanical-drill-xlarge + rotate: false + xy: 101, 367 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mechanical-pump-large + rotate: false + xy: 343, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mechanical-pump-medium + rotate: false + xy: 655, 90 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mechanical-pump-small + rotate: false + xy: 1194, 346 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mechanical-pump-tiny + rotate: false + xy: 1155, 178 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mechanical-pump-xlarge + rotate: false + xy: 151, 417 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-meltdown-large + rotate: false + xy: 385, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-meltdown-medium + rotate: false + xy: 713, 242 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-meltdown-small + rotate: false + xy: 1220, 346 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-meltdown-tiny + rotate: false + xy: 1173, 196 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-meltdown-xlarge + rotate: false + xy: 201, 467 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-melter-large + rotate: false + xy: 427, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-melter-medium + rotate: false + xy: 755, 284 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-melter-small + rotate: false + xy: 1246, 346 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-melter-tiny + rotate: false + xy: 1191, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-melter-xlarge + rotate: false + xy: 51, 267 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mend-projector-large + rotate: false + xy: 469, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mend-projector-medium + rotate: false + xy: 747, 250 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mend-projector-small + rotate: false + xy: 1272, 346 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mend-projector-tiny + rotate: false + xy: 1209, 232 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mend-projector-xlarge + rotate: false + xy: 101, 317 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-mender-large + rotate: false + xy: 511, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-mender-medium + rotate: false + xy: 747, 216 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-mender-small + rotate: false + xy: 1298, 346 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-mender-tiny + rotate: false + xy: 1119, 124 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-mender-xlarge + rotate: false + xy: 151, 367 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-message-large + rotate: false + xy: 553, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-message-medium + rotate: false + xy: 781, 250 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-message-small + rotate: false + xy: 1324, 346 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-message-tiny + rotate: false + xy: 1137, 142 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-message-xlarge + rotate: false + xy: 201, 417 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-2-large + rotate: false + xy: 595, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-2-medium + rotate: false + xy: 781, 216 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-2-small + rotate: false + xy: 1350, 346 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-2-tiny + rotate: false + xy: 1155, 160 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-2-xlarge + rotate: false + xy: 51, 217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-3-large + rotate: false + xy: 637, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-3-medium + rotate: false + xy: 839, 368 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-3-small + rotate: false + xy: 1376, 346 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-3-tiny + rotate: false + xy: 1173, 178 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-3-xlarge + rotate: false + xy: 101, 267 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-5-large + rotate: false + xy: 679, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-5-medium + rotate: false + xy: 881, 410 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-5-small + rotate: false + xy: 1404, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-5-tiny + rotate: false + xy: 1191, 196 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-5-xlarge + rotate: false + xy: 151, 317 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-large + rotate: false + xy: 721, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-medium + rotate: false + xy: 873, 376 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-small + rotate: false + xy: 1430, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-tiny + rotate: false + xy: 1209, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-damaged-xlarge + rotate: false + xy: 201, 367 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-metal-floor-large + rotate: false + xy: 763, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-metal-floor-medium + rotate: false + xy: 873, 342 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-metal-floor-small + rotate: false + xy: 1456, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-metal-floor-tiny + rotate: false + xy: 1227, 232 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-metal-floor-xlarge + rotate: false + xy: 51, 167 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-moss-large + rotate: false + xy: 805, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-moss-medium + rotate: false + xy: 907, 376 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-moss-small + rotate: false + xy: 1482, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-moss-tiny + rotate: false + xy: 1119, 106 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-moss-xlarge + rotate: false + xy: 101, 217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-multi-press-large + rotate: false + xy: 301, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-multi-press-medium + rotate: false + xy: 907, 342 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-multi-press-small + rotate: false + xy: 1508, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-multi-press-tiny + rotate: false + xy: 1137, 124 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-multi-press-xlarge + rotate: false + xy: 151, 267 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-oil-extractor-large + rotate: false + xy: 343, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-oil-extractor-medium + rotate: false + xy: 965, 494 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-oil-extractor-small + rotate: false + xy: 1534, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-oil-extractor-tiny + rotate: false + xy: 1155, 142 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-oil-extractor-xlarge + rotate: false + xy: 201, 317 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-omega-mech-pad-large + rotate: false + xy: 385, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-omega-mech-pad-medium + rotate: false + xy: 1007, 536 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-omega-mech-pad-small + rotate: false + xy: 1560, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-omega-mech-pad-tiny + rotate: false + xy: 1173, 160 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-omega-mech-pad-xlarge + rotate: false + xy: 51, 117 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-overdrive-projector-large + rotate: false + xy: 427, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-overdrive-projector-medium + rotate: false + xy: 999, 502 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-overdrive-projector-small + rotate: false + xy: 1586, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-overdrive-projector-tiny + rotate: false + xy: 1191, 178 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-overdrive-projector-xlarge + rotate: false + xy: 101, 167 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-overflow-gate-large + rotate: false + xy: 469, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-overflow-gate-medium + rotate: false + xy: 999, 468 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-overflow-gate-small + rotate: false + xy: 1612, 367 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-overflow-gate-tiny + rotate: false + xy: 1209, 196 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-overflow-gate-xlarge + rotate: false + xy: 151, 217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pebbles-large + rotate: false + xy: 511, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pebbles-medium + rotate: false + xy: 1033, 502 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pebbles-small + rotate: false + xy: 1402, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pebbles-tiny + rotate: false + xy: 1227, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pebbles-xlarge + rotate: false + xy: 201, 267 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phantom-factory-large + rotate: false + xy: 553, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phantom-factory-medium + rotate: false + xy: 1033, 468 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phantom-factory-small + rotate: false + xy: 1428, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phantom-factory-tiny + rotate: false + xy: 1137, 106 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phantom-factory-xlarge + rotate: false + xy: 51, 67 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-conduit-large + rotate: false + xy: 595, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-conduit-medium + rotate: false + xy: 1095, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conduit-small + rotate: false + xy: 1454, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-conduit-tiny + rotate: false + xy: 1155, 124 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-conduit-xlarge + rotate: false + xy: 101, 117 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-conveyor-large + rotate: false + xy: 637, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-conveyor-medium + rotate: false + xy: 1129, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-conveyor-small + rotate: false + xy: 1480, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-conveyor-tiny + rotate: false + xy: 1173, 142 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-conveyor-xlarge + rotate: false + xy: 151, 167 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-wall-large + rotate: false + xy: 679, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-large + rotate: false + xy: 721, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-wall-large-medium + rotate: false + xy: 1163, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-large-small + rotate: false + xy: 1506, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-wall-large-tiny + rotate: false + xy: 1191, 160 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-wall-large-xlarge + rotate: false + xy: 201, 217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-wall-medium + rotate: false + xy: 1197, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-wall-small + rotate: false + xy: 1532, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-wall-tiny + rotate: false + xy: 1209, 178 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-wall-xlarge + rotate: false + xy: 101, 67 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-phase-weaver-large + rotate: false + xy: 763, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-phase-weaver-medium + rotate: false + xy: 1231, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-phase-weaver-small + rotate: false + xy: 1558, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-phase-weaver-tiny + rotate: false + xy: 1227, 196 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-phase-weaver-xlarge + rotate: false + xy: 151, 117 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pine-large + rotate: false + xy: 805, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pine-medium + rotate: false + xy: 1265, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pine-small + rotate: false + xy: 1584, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pine-tiny + rotate: false + xy: 1155, 106 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pine-xlarge + rotate: false + xy: 201, 167 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-plastanium-compressor-large + rotate: false + xy: 847, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-plastanium-compressor-medium + rotate: false + xy: 1299, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-plastanium-compressor-small + rotate: false + xy: 1610, 341 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-plastanium-compressor-tiny + rotate: false + xy: 1173, 124 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-plastanium-compressor-xlarge + rotate: false + xy: 151, 67 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pneumatic-drill-large + rotate: false + xy: 301, 95 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pneumatic-drill-medium + rotate: false + xy: 1333, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pneumatic-drill-small + rotate: false + xy: 1638, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pneumatic-drill-tiny + rotate: false + xy: 1191, 142 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pneumatic-drill-xlarge + rotate: false + xy: 201, 117 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-large + rotate: false + xy: 343, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-large + rotate: false + xy: 385, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-node-large-medium + rotate: false + xy: 1367, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-large-small + rotate: false + xy: 1664, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-large-tiny + rotate: false + xy: 1209, 160 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-large-xlarge + rotate: false + xy: 201, 67 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-node-medium + rotate: false + xy: 1401, 628 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-node-small + rotate: false + xy: 1690, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-node-tiny + rotate: false + xy: 1227, 178 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-node-xlarge + rotate: false + xy: 51, 17 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-source-large + rotate: false + xy: 427, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-source-medium + rotate: false + xy: 1435, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-source-small + rotate: false + xy: 1716, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-source-tiny + rotate: false + xy: 1173, 106 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-source-xlarge + rotate: false + xy: 101, 17 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-power-void-large + rotate: false + xy: 469, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-power-void-medium + rotate: false + xy: 1469, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-power-void-small + rotate: false + xy: 1742, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-power-void-tiny + rotate: false + xy: 1191, 124 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-power-void-xlarge + rotate: false + xy: 151, 17 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pulse-conduit-large + rotate: false + xy: 511, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pulse-conduit-medium + rotate: false + xy: 1503, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulse-conduit-small + rotate: false + xy: 1768, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pulse-conduit-tiny + rotate: false + xy: 1209, 142 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pulse-conduit-xlarge + rotate: false + xy: 201, 17 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pulverizer-large + rotate: false + xy: 553, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pulverizer-medium + rotate: false + xy: 1537, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pulverizer-small + rotate: false + xy: 1794, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pulverizer-tiny + rotate: false + xy: 1227, 160 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pulverizer-xlarge + rotate: false + xy: 251, 667 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-pyratite-mixer-large + rotate: false + xy: 595, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-pyratite-mixer-medium + rotate: false + xy: 1571, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-pyratite-mixer-small + rotate: false + xy: 1820, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-pyratite-mixer-tiny + rotate: false + xy: 1191, 106 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-pyratite-mixer-xlarge + rotate: false + xy: 251, 617 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-repair-point-large + rotate: false + xy: 637, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-repair-point-medium + rotate: false + xy: 1605, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-repair-point-small + rotate: false + xy: 1846, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-repair-point-tiny + rotate: false + xy: 1209, 124 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-repair-point-xlarge + rotate: false + xy: 251, 567 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-revenant-factory-large + rotate: false + xy: 679, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-revenant-factory-medium + rotate: false + xy: 1639, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-revenant-factory-small + rotate: false + xy: 1872, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-revenant-factory-tiny + rotate: false + xy: 1227, 142 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-revenant-factory-xlarge + rotate: false + xy: 251, 517 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-ripple-large + rotate: false + xy: 721, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-ripple-medium + rotate: false + xy: 1673, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-ripple-small + rotate: false + xy: 1898, 363 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-ripple-tiny + rotate: false + xy: 1209, 106 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-ripple-xlarge + rotate: false + xy: 251, 467 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rock-large + rotate: false + xy: 763, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rock-medium + rotate: false + xy: 1707, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rock-small + rotate: false + xy: 1636, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rock-tiny + rotate: false + xy: 1227, 124 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rock-xlarge + rotate: false + xy: 251, 417 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rocks-large + rotate: false + xy: 805, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rocks-medium + rotate: false + xy: 1741, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rocks-small + rotate: false + xy: 1662, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rocks-tiny + rotate: false + xy: 1227, 106 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rocks-xlarge + rotate: false + xy: 251, 367 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rotary-pump-large + rotate: false + xy: 847, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rotary-pump-medium + rotate: false + xy: 1775, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rotary-pump-small + rotate: false + xy: 1688, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rotary-pump-tiny + rotate: false + xy: 1245, 232 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rotary-pump-xlarge + rotate: false + xy: 251, 317 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-router-large + rotate: false + xy: 889, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-router-medium + rotate: false + xy: 1809, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-router-small + rotate: false + xy: 1714, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-router-tiny + rotate: false + xy: 1245, 214 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-router-xlarge + rotate: false + xy: 251, 267 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-rtg-generator-large + rotate: false + xy: 301, 53 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-rtg-generator-medium + rotate: false + xy: 1843, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-rtg-generator-small + rotate: false + xy: 1740, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-rtg-generator-tiny + rotate: false + xy: 1245, 196 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-rtg-generator-xlarge + rotate: false + xy: 251, 217 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salt-large + rotate: false + xy: 343, 95 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salt-medium + rotate: false + xy: 1877, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salt-small + rotate: false + xy: 1766, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salt-tiny + rotate: false + xy: 1245, 178 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salt-xlarge + rotate: false + xy: 251, 167 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-saltrocks-large + rotate: false + xy: 385, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-saltrocks-medium + rotate: false + xy: 1911, 623 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-saltrocks-small + rotate: false + xy: 1792, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-saltrocks-tiny + rotate: false + xy: 1245, 160 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-saltrocks-xlarge + rotate: false + xy: 251, 117 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-salvo-large + rotate: false + xy: 427, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-salvo-medium + rotate: false + xy: 617, 56 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-salvo-small + rotate: false + xy: 1818, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-salvo-tiny + rotate: false + xy: 1245, 142 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-salvo-xlarge + rotate: false + xy: 251, 67 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-boulder-large + rotate: false + xy: 469, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-boulder-medium + rotate: false + xy: 651, 56 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-boulder-small + rotate: false + xy: 1844, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-boulder-tiny + rotate: false + xy: 1245, 124 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-boulder-xlarge + rotate: false + xy: 251, 17 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-large + rotate: false + xy: 511, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-medium + rotate: false + xy: 671, 200 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-small + rotate: false + xy: 1870, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-tiny + rotate: false + xy: 1245, 106 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-water-large + rotate: false + xy: 553, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sand-water-medium + rotate: false + xy: 663, 166 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sand-water-small + rotate: false + xy: 1896, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sand-water-tiny + rotate: false + xy: 2029, 453 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sand-water-xlarge + rotate: false + xy: 309, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sand-xlarge + rotate: false + xy: 309, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sandrocks-large + rotate: false + xy: 595, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sandrocks-medium + rotate: false + xy: 705, 208 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sandrocks-small + rotate: false + xy: 1922, 337 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sandrocks-tiny + rotate: false + xy: 2029, 435 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sandrocks-xlarge + rotate: false + xy: 359, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scatter-large + rotate: false + xy: 637, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scatter-medium + rotate: false + xy: 697, 166 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scatter-small + rotate: false + xy: 1116, 320 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scatter-tiny + rotate: false + xy: 2029, 417 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scatter-xlarge + rotate: false + xy: 309, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scorch-large + rotate: false + xy: 679, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scorch-medium + rotate: false + xy: 689, 132 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scorch-small + rotate: false + xy: 1142, 320 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scorch-tiny + rotate: false + xy: 2029, 399 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scorch-xlarge + rotate: false + xy: 359, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-large + rotate: false + xy: 721, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-medium + rotate: false + xy: 689, 98 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-small + rotate: false + xy: 1168, 320 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-tiny + rotate: false + xy: 2029, 381 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-gigantic-xlarge + rotate: false + xy: 409, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-large + rotate: false + xy: 763, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-medium + rotate: false + xy: 723, 132 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-small + rotate: false + xy: 1194, 320 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-tiny + rotate: false + xy: 2029, 363 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-huge-xlarge + rotate: false + xy: 359, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-large + rotate: false + xy: 805, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-large + rotate: false + xy: 847, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-scrap-wall-large-medium + rotate: false + xy: 723, 98 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-large-small + rotate: false + xy: 1220, 320 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-large-tiny + rotate: false + xy: 2029, 345 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-large-xlarge + rotate: false + xy: 409, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-scrap-wall-medium + rotate: false + xy: 689, 64 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-scrap-wall-small + rotate: false + xy: 1246, 320 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-scrap-wall-tiny + rotate: false + xy: 1341, 265 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-scrap-wall-xlarge + rotate: false + xy: 459, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-separator-large + rotate: false + xy: 889, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-separator-medium + rotate: false + xy: 723, 64 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-separator-small + rotate: false + xy: 1272, 320 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-separator-tiny + rotate: false + xy: 1341, 247 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-separator-xlarge + rotate: false + xy: 409, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-boulder-large + rotate: false + xy: 931, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-boulder-medium + rotate: false + xy: 797, 326 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-boulder-small + rotate: false + xy: 1298, 320 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-boulder-tiny + rotate: false + xy: 1359, 266 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-boulder-xlarge + rotate: false + xy: 459, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shale-large + rotate: false + xy: 343, 53 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shale-medium + rotate: false + xy: 789, 292 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shale-small + rotate: false + xy: 1324, 320 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shale-tiny + rotate: false + xy: 1359, 248 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shale-xlarge + rotate: false + xy: 509, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shalerocks-large + rotate: false + xy: 385, 95 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shalerocks-medium + rotate: false + xy: 831, 334 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shalerocks-small + rotate: false + xy: 1350, 320 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shalerocks-tiny + rotate: false + xy: 1119, 88 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shalerocks-xlarge + rotate: false + xy: 459, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shock-mine-large + rotate: false + xy: 427, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shock-mine-medium + rotate: false + xy: 823, 292 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shock-mine-small + rotate: false + xy: 1376, 320 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shock-mine-tiny + rotate: false + xy: 1137, 88 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shock-mine-xlarge + rotate: false + xy: 509, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-shrubs-large + rotate: false + xy: 469, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-shrubs-medium + rotate: false + xy: 815, 258 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-shrubs-small + rotate: false + xy: 1402, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-shrubs-tiny + rotate: false + xy: 1155, 88 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-shrubs-xlarge + rotate: false + xy: 559, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-silicon-smelter-large + rotate: false + xy: 511, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-silicon-smelter-medium + rotate: false + xy: 815, 224 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-silicon-smelter-small + rotate: false + xy: 1428, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-silicon-smelter-tiny + rotate: false + xy: 1173, 88 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-silicon-smelter-xlarge + rotate: false + xy: 509, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-large + rotate: false + xy: 553, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-medium + rotate: false + xy: 849, 258 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-large + rotate: false + xy: 595, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snow-pine-medium + rotate: false + xy: 849, 224 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snow-pine-small + rotate: false + xy: 1454, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-pine-tiny + rotate: false + xy: 1191, 88 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-pine-xlarge + rotate: false + xy: 559, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snow-small + rotate: false + xy: 1480, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snow-tiny + rotate: false + xy: 1209, 88 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snow-xlarge + rotate: false + xy: 609, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snowrock-large + rotate: false + xy: 637, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snowrock-medium + rotate: false + xy: 815, 190 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snowrock-small + rotate: false + xy: 1506, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snowrock-tiny + rotate: false + xy: 1227, 88 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snowrock-xlarge + rotate: false + xy: 559, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-snowrocks-large + rotate: false + xy: 679, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-snowrocks-medium + rotate: false + xy: 849, 190 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-snowrocks-small + rotate: false + xy: 1532, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-snowrocks-tiny + rotate: false + xy: 1245, 88 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-snowrocks-xlarge + rotate: false + xy: 609, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-solar-panel-large + rotate: false + xy: 721, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-large + rotate: false + xy: 763, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-solar-panel-large-medium + rotate: false + xy: 923, 452 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-large-small + rotate: false + xy: 1558, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-solar-panel-large-tiny + rotate: false + xy: 1263, 234 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-solar-panel-large-xlarge + rotate: false + xy: 659, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-solar-panel-medium + rotate: false + xy: 915, 418 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-solar-panel-small + rotate: false + xy: 1584, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-solar-panel-tiny + rotate: false + xy: 1281, 234 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-solar-panel-xlarge + rotate: false + xy: 609, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sorter-large + rotate: false + xy: 805, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sorter-medium + rotate: false + xy: 957, 460 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sorter-small + rotate: false + xy: 1610, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sorter-tiny + rotate: false + xy: 1263, 216 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sorter-xlarge + rotate: false + xy: 659, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spawn-large + rotate: false + xy: 847, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spawn-medium + rotate: false + xy: 949, 418 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spawn-small + rotate: false + xy: 1636, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spawn-tiny + rotate: false + xy: 1299, 234 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spawn-xlarge + rotate: false + xy: 709, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spectre-large + rotate: false + xy: 889, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spectre-medium + rotate: false + xy: 941, 384 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spectre-small + rotate: false + xy: 1662, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spectre-tiny + rotate: false + xy: 1263, 198 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spectre-xlarge + rotate: false + xy: 659, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spirit-factory-large + rotate: false + xy: 931, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spirit-factory-medium + rotate: false + xy: 941, 350 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spirit-factory-small + rotate: false + xy: 1688, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spirit-factory-tiny + rotate: false + xy: 1281, 216 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spirit-factory-xlarge + rotate: false + xy: 709, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-cluster-large + rotate: false + xy: 973, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-cluster-medium + rotate: false + xy: 975, 384 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-cluster-small + rotate: false + xy: 1714, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-cluster-tiny + rotate: false + xy: 1263, 180 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-cluster-xlarge + rotate: false + xy: 759, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-moss-large + rotate: false + xy: 385, 53 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-moss-medium + rotate: false + xy: 975, 350 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-moss-small + rotate: false + xy: 1740, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-moss-tiny + rotate: false + xy: 1281, 198 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-moss-xlarge + rotate: false + xy: 709, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-pine-large + rotate: false + xy: 427, 95 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-pine-medium + rotate: false + xy: 941, 316 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-pine-small + rotate: false + xy: 1766, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-pine-tiny + rotate: false + xy: 1299, 216 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-pine-xlarge + rotate: false + xy: 759, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-spore-press-large + rotate: false + xy: 469, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-spore-press-medium + rotate: false + xy: 975, 316 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-spore-press-small + rotate: false + xy: 1792, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-spore-press-tiny + rotate: false + xy: 1263, 162 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-spore-press-xlarge + rotate: false + xy: 809, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-sporerocks-large + rotate: false + xy: 511, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-sporerocks-medium + rotate: false + xy: 1049, 578 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-sporerocks-small + rotate: false + xy: 1818, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-sporerocks-tiny + rotate: false + xy: 1281, 180 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-sporerocks-xlarge + rotate: false + xy: 759, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-stone-large + rotate: false + xy: 553, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-stone-medium + rotate: false + xy: 1041, 544 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-stone-small + rotate: false + xy: 1844, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-stone-tiny + rotate: false + xy: 1299, 198 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-stone-xlarge + rotate: false + xy: 809, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-tower-large + rotate: false + xy: 595, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-tower-medium + rotate: false + xy: 1075, 544 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-tower-small + rotate: false + xy: 1870, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-tower-tiny + rotate: false + xy: 1263, 144 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-tower-xlarge + rotate: false + xy: 859, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-large + rotate: false + xy: 637, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-large + rotate: false + xy: 679, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-surge-wall-large-medium + rotate: false + xy: 1067, 510 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-large-small + rotate: false + xy: 1896, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-large-tiny + rotate: false + xy: 1281, 162 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-large-xlarge + rotate: false + xy: 809, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-surge-wall-medium + rotate: false + xy: 1067, 476 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-surge-wall-small + rotate: false + xy: 1922, 311 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-surge-wall-tiny + rotate: false + xy: 1299, 180 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-surge-wall-xlarge + rotate: false + xy: 859, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-swarmer-large + rotate: false + xy: 721, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-swarmer-medium + rotate: false + xy: 1101, 510 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-swarmer-small + rotate: false + xy: 1948, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-swarmer-tiny + rotate: false + xy: 1263, 126 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-swarmer-xlarge + rotate: false + xy: 909, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tainted-water-large + rotate: false + xy: 763, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tainted-water-medium + rotate: false + xy: 1101, 476 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tainted-water-small + rotate: false + xy: 1974, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tainted-water-tiny + rotate: false + xy: 1281, 144 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tainted-water-xlarge + rotate: false + xy: 859, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tar-large + rotate: false + xy: 805, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tar-medium + rotate: false + xy: 1067, 442 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tar-small + rotate: false + xy: 2000, 315 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tar-tiny + rotate: false + xy: 1299, 162 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tar-xlarge + rotate: false + xy: 909, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tau-mech-pad-large + rotate: false + xy: 847, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tau-mech-pad-medium + rotate: false + xy: 1101, 442 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tau-mech-pad-small + rotate: false + xy: 1948, 289 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tau-mech-pad-tiny + rotate: false + xy: 1263, 108 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tau-mech-pad-xlarge + rotate: false + xy: 959, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-tendrils-large + rotate: false + xy: 889, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-tendrils-medium + rotate: false + xy: 1945, 597 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-tendrils-small + rotate: false + xy: 1974, 289 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-tendrils-tiny + rotate: false + xy: 1281, 126 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-tendrils-xlarge + rotate: false + xy: 909, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-generator-large + rotate: false + xy: 931, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-generator-medium + rotate: false + xy: 685, 30 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-generator-small + rotate: false + xy: 2000, 289 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-generator-tiny + rotate: false + xy: 1299, 144 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-generator-xlarge + rotate: false + xy: 959, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thermal-pump-large + rotate: false + xy: 973, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thermal-pump-medium + rotate: false + xy: 719, 30 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thermal-pump-small + rotate: false + xy: 1063, 312 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thermal-pump-tiny + rotate: false + xy: 1263, 90 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thermal-pump-xlarge + rotate: false + xy: 1009, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-reactor-large + rotate: false + xy: 1015, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-reactor-medium + rotate: false + xy: 1091, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-reactor-small + rotate: false + xy: 1089, 312 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-reactor-tiny + rotate: false + xy: 1281, 108 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-reactor-xlarge + rotate: false + xy: 959, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-large + rotate: false + xy: 427, 53 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-large + rotate: false + xy: 469, 95 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thorium-wall-large-medium + rotate: false + xy: 1125, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-large-small + rotate: false + xy: 1063, 286 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-large-tiny + rotate: false + xy: 1299, 126 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-large-xlarge + rotate: false + xy: 1009, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thorium-wall-medium + rotate: false + xy: 1159, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thorium-wall-small + rotate: false + xy: 1063, 260 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thorium-wall-tiny + rotate: false + xy: 1281, 90 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thorium-wall-xlarge + rotate: false + xy: 1059, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-thruster-large + rotate: false + xy: 511, 137 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-thruster-medium + rotate: false + xy: 1193, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-thruster-small + rotate: false + xy: 1089, 286 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-thruster-tiny + rotate: false + xy: 1299, 108 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-thruster-xlarge + rotate: false + xy: 1009, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titan-factory-large + rotate: false + xy: 553, 179 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titan-factory-medium + rotate: false + xy: 1227, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titan-factory-small + rotate: false + xy: 1089, 260 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titan-factory-tiny + rotate: false + xy: 1299, 90 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titan-factory-xlarge + rotate: false + xy: 1059, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-conveyor-large + rotate: false + xy: 595, 221 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-conveyor-medium + rotate: false + xy: 1261, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-conveyor-small + rotate: false + xy: 1115, 294 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-conveyor-tiny + rotate: false + xy: 1317, 229 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-conveyor-xlarge + rotate: false + xy: 1109, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-large + rotate: false + xy: 637, 263 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-large + rotate: false + xy: 679, 305 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-titanium-wall-large-medium + rotate: false + xy: 1295, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-large-small + rotate: false + xy: 1141, 294 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-large-tiny + rotate: false + xy: 1317, 211 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-large-xlarge + rotate: false + xy: 1059, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-titanium-wall-medium + rotate: false + xy: 1329, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-titanium-wall-small + rotate: false + xy: 1115, 268 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-titanium-wall-tiny + rotate: false + xy: 1335, 229 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-titanium-wall-xlarge + rotate: false + xy: 1109, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-trident-ship-pad-large + rotate: false + xy: 721, 347 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-trident-ship-pad-medium + rotate: false + xy: 1363, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-trident-ship-pad-small + rotate: false + xy: 1167, 294 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-trident-ship-pad-tiny + rotate: false + xy: 1317, 193 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-trident-ship-pad-xlarge + rotate: false + xy: 1159, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-turbine-generator-large + rotate: false + xy: 763, 389 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-turbine-generator-medium + rotate: false + xy: 1397, 594 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-turbine-generator-small + rotate: false + xy: 1141, 268 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-turbine-generator-tiny + rotate: false + xy: 1335, 211 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-turbine-generator-xlarge + rotate: false + xy: 1109, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-unloader-large + rotate: false + xy: 805, 431 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-unloader-medium + rotate: false + xy: 1431, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-unloader-small + rotate: false + xy: 1193, 294 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-unloader-tiny + rotate: false + xy: 1317, 175 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-unloader-xlarge + rotate: false + xy: 1159, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-vault-large + rotate: false + xy: 847, 473 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-vault-medium + rotate: false + xy: 1465, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-vault-small + rotate: false + xy: 1167, 268 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-vault-tiny + rotate: false + xy: 1335, 193 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-vault-xlarge + rotate: false + xy: 1209, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-extractor-large + rotate: false + xy: 889, 515 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-extractor-medium + rotate: false + xy: 1499, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-extractor-small + rotate: false + xy: 1219, 294 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-extractor-tiny + rotate: false + xy: 1317, 157 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-extractor-xlarge + rotate: false + xy: 1159, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-water-large + rotate: false + xy: 931, 557 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-water-medium + rotate: false + xy: 1533, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-water-small + rotate: false + xy: 1193, 268 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-water-tiny + rotate: false + xy: 1335, 175 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-water-xlarge + rotate: false + xy: 1209, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wave-large + rotate: false + xy: 973, 599 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wave-medium + rotate: false + xy: 1567, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wave-small + rotate: false + xy: 1245, 294 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wave-tiny + rotate: false + xy: 1317, 139 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wave-xlarge + rotate: false + xy: 1259, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-dead-large + rotate: false + xy: 1015, 641 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-dead-medium + rotate: false + xy: 1601, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-dead-small + rotate: false + xy: 1219, 268 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-dead-tiny + rotate: false + xy: 1335, 157 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-dead-xlarge + rotate: false + xy: 1209, 825 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-white-tree-large + rotate: false + xy: 1057, 683 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-white-tree-medium + rotate: false + xy: 1635, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-white-tree-small + rotate: false + xy: 1271, 294 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-white-tree-tiny + rotate: false + xy: 1317, 121 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-white-tree-xlarge + rotate: false + xy: 1259, 875 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 +block-wraith-factory-large + rotate: false + xy: 469, 53 + size: 40, 40 + orig: 40, 40 + offset: 0, 0 + index: -1 +block-wraith-factory-medium + rotate: false + xy: 1669, 589 + size: 32, 32 + orig: 32, 32 + offset: 0, 0 + index: -1 +block-wraith-factory-small + rotate: false + xy: 1245, 268 + size: 24, 24 + orig: 24, 24 + offset: 0, 0 + index: -1 +block-wraith-factory-tiny + rotate: false + xy: 1335, 139 + size: 16, 16 + orig: 16, 16 + offset: 0, 0 + index: -1 +block-wraith-factory-xlarge + rotate: false + xy: 1309, 925 + size: 48, 48 + orig: 48, 48 + offset: 0, 0 + index: -1 button rotate: false - xy: 377, 667 + xy: 1137, 696 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9042,7 +15699,7 @@ button index: -1 button-disabled rotate: false - xy: 2009, 946 + xy: 511, 108 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9050,7 +15707,7 @@ button-disabled index: -1 button-down rotate: false - xy: 2009, 917 + xy: 553, 150 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9058,7 +15715,7 @@ button-down index: -1 button-edge-1 rotate: false - xy: 2009, 888 + xy: 595, 192 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9066,7 +15723,7 @@ button-edge-1 index: -1 button-edge-2 rotate: false - xy: 2009, 859 + xy: 637, 234 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9074,7 +15731,7 @@ button-edge-2 index: -1 button-edge-3 rotate: false - xy: 2009, 830 + xy: 679, 276 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9082,7 +15739,7 @@ button-edge-3 index: -1 button-edge-4 rotate: false - xy: 2009, 801 + xy: 721, 318 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9090,7 +15747,7 @@ button-edge-4 index: -1 button-edge-over-4 rotate: false - xy: 2009, 772 + xy: 763, 360 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9098,7 +15755,7 @@ button-edge-over-4 index: -1 button-over rotate: false - xy: 1937, 720 + xy: 805, 402 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9106,7 +15763,7 @@ button-over index: -1 button-red rotate: false - xy: 301, 696 + xy: 847, 444 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9114,7 +15771,7 @@ button-red index: -1 button-right rotate: false - xy: 301, 638 + xy: 973, 570 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9122,7 +15779,7 @@ button-right index: -1 button-right-down rotate: false - xy: 301, 667 + xy: 889, 486 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9130,7 +15787,7 @@ button-right-down index: -1 button-right-over rotate: false - xy: 339, 696 + xy: 931, 528 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9138,7 +15795,7 @@ button-right-over index: -1 button-select rotate: false - xy: 844, 497 + xy: 1297, 294 size: 24, 24 split: 4, 4, 4, 4 orig: 24, 24 @@ -9146,7 +15803,7 @@ button-select index: -1 button-square rotate: false - xy: 301, 609 + xy: 1099, 696 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9154,7 +15811,7 @@ button-square index: -1 button-square-down rotate: false - xy: 339, 667 + xy: 1015, 612 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9162,7 +15819,7 @@ button-square-down index: -1 button-square-over rotate: false - xy: 377, 696 + xy: 1057, 654 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -9170,761 +15827,68 @@ button-square-over index: -1 button-trans rotate: false - xy: 339, 638 + xy: 511, 79 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 offset: 0, 0 index: -1 -char-icon-large - rotate: false - xy: 1, 420 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -char-icon-medium - rotate: false - xy: 301, 211 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -char-icon-small - rotate: false - xy: 535, 106 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 check-disabled rotate: false - xy: 301, 177 + xy: 1703, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-off rotate: false - xy: 301, 143 + xy: 1737, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on rotate: false - xy: 301, 109 + xy: 1771, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-disabled rotate: false - xy: 301, 75 + xy: 1805, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-on-over rotate: false - xy: 301, 41 + xy: 1839, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 check-over rotate: false - xy: 339, 549 + xy: 1873, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 clear rotate: false - xy: 387, 14 + xy: 803, 204 size: 10, 10 orig: 10, 10 offset: 0, 0 index: -1 -cliffs-icon-large - rotate: false - xy: 1, 370 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -cliffs-icon-medium - rotate: false - xy: 335, 515 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cliffs-icon-small - rotate: false - xy: 870, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -coal-centrifuge-icon-large - rotate: false - xy: 1, 320 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -coal-centrifuge-icon-medium - rotate: false - xy: 335, 481 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -coal-centrifuge-icon-small - rotate: false - xy: 535, 80 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -combustion-generator-icon-large - rotate: false - xy: 1, 270 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -combustion-generator-icon-medium - rotate: false - xy: 335, 447 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -combustion-generator-icon-small - rotate: false - xy: 896, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -command-center-icon-large - rotate: false - xy: 1, 220 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -command-center-icon-medium - rotate: false - xy: 335, 413 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -command-center-icon-small - rotate: false - xy: 535, 54 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -conduit-icon-large - rotate: false - xy: 1, 170 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -conduit-icon-medium - rotate: false - xy: 335, 379 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conduit-icon-small - rotate: false - xy: 922, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -container-icon-large - rotate: false - xy: 1, 120 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -container-icon-medium - rotate: false - xy: 335, 345 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -container-icon-small - rotate: false - xy: 535, 28 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -conveyor-icon-large - rotate: false - xy: 1, 70 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -conveyor-icon-medium - rotate: false - xy: 335, 311 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -conveyor-icon-small - rotate: false - xy: 948, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -copper-wall-icon-large - rotate: false - xy: 1, 20 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -copper-wall-icon-medium - rotate: false - xy: 335, 277 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-icon-small - rotate: false - xy: 974, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -copper-wall-large-icon-large - rotate: false - xy: 87, 717 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -copper-wall-large-icon-medium - rotate: false - xy: 335, 243 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -copper-wall-large-icon-small - rotate: false - xy: 1000, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -core-foundation-icon-large - rotate: false - xy: 137, 717 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -core-foundation-icon-medium - rotate: false - xy: 335, 209 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -core-foundation-icon-small - rotate: false - xy: 1026, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -core-nucleus-icon-large - rotate: false - xy: 187, 717 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -core-nucleus-icon-medium - rotate: false - xy: 335, 175 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -core-nucleus-icon-small - rotate: false - xy: 1052, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -core-shard-icon-large - rotate: false - xy: 345, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -core-shard-icon-medium - rotate: false - xy: 335, 141 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -core-shard-icon-small - rotate: false - xy: 1078, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -craters-icon-large - rotate: false - xy: 395, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -craters-icon-medium - rotate: false - xy: 335, 107 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -craters-icon-small - rotate: false - xy: 1104, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -crawler-factory-icon-large - rotate: false - xy: 445, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -crawler-factory-icon-medium - rotate: false - xy: 335, 73 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -crawler-factory-icon-small - rotate: false - xy: 1130, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -cryofluidmixer-icon-large - rotate: false - xy: 495, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -cryofluidmixer-icon-medium - rotate: false - xy: 335, 39 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cryofluidmixer-icon-small - rotate: false - xy: 1156, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -cultivator-icon-large - rotate: false - xy: 545, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -cultivator-icon-medium - rotate: false - xy: 377, 604 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cultivator-icon-small - rotate: false - xy: 1182, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 cursor rotate: false - xy: 599, 331 + xy: 1979, 735 size: 4, 4 orig: 4, 4 offset: 0, 0 index: -1 -cyclone-icon-large - rotate: false - xy: 595, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -cyclone-icon-medium - rotate: false - xy: 415, 633 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -cyclone-icon-small - rotate: false - xy: 1208, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -dagger-factory-icon-large - rotate: false - xy: 645, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dagger-factory-icon-medium - rotate: false - xy: 453, 662 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dagger-factory-icon-small - rotate: false - xy: 1234, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -dark-metal-icon-large - rotate: false - xy: 695, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dark-metal-icon-medium - rotate: false - xy: 491, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-metal-icon-small - rotate: false - xy: 1260, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -dark-panel-1-icon-large - rotate: false - xy: 745, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dark-panel-1-icon-medium - rotate: false - xy: 525, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-1-icon-small - rotate: false - xy: 1286, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -dark-panel-2-icon-large - rotate: false - xy: 795, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dark-panel-2-icon-medium - rotate: false - xy: 559, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-2-icon-small - rotate: false - xy: 1312, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -dark-panel-3-icon-large - rotate: false - xy: 845, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dark-panel-3-icon-medium - rotate: false - xy: 593, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-3-icon-small - rotate: false - xy: 1338, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -dark-panel-4-icon-large - rotate: false - xy: 895, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dark-panel-4-icon-medium - rotate: false - xy: 627, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-4-icon-small - rotate: false - xy: 1364, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -dark-panel-5-icon-large - rotate: false - xy: 945, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dark-panel-5-icon-medium - rotate: false - xy: 661, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-5-icon-small - rotate: false - xy: 1390, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -dark-panel-6-icon-large - rotate: false - xy: 995, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dark-panel-6-icon-medium - rotate: false - xy: 695, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dark-panel-6-icon-small - rotate: false - xy: 1416, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -darksand-icon-large - rotate: false - xy: 1045, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -darksand-icon-medium - rotate: false - xy: 729, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-icon-small - rotate: false - xy: 1442, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -darksand-tainted-water-icon-large - rotate: false - xy: 1095, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -darksand-tainted-water-icon-medium - rotate: false - xy: 763, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-tainted-water-icon-small - rotate: false - xy: 1468, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -darksand-water-icon-large - rotate: false - xy: 1145, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -darksand-water-icon-medium - rotate: false - xy: 797, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -darksand-water-icon-small - rotate: false - xy: 1494, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -dart-mech-pad-icon-large - rotate: false - xy: 1195, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dart-mech-pad-icon-medium - rotate: false - xy: 831, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dart-mech-pad-icon-small - rotate: false - xy: 1520, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -deepwater-icon-large - rotate: false - xy: 1245, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -deepwater-icon-medium - rotate: false - xy: 865, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -deepwater-icon-small - rotate: false - xy: 1546, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -delta-mech-pad-icon-large - rotate: false - xy: 1295, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -delta-mech-pad-icon-medium - rotate: false - xy: 899, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -delta-mech-pad-icon-small - rotate: false - xy: 1572, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -differential-generator-icon-large - rotate: false - xy: 1345, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -differential-generator-icon-medium - rotate: false - xy: 933, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -differential-generator-icon-small - rotate: false - xy: 1598, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 discord-banner rotate: false xy: 1, 720 @@ -9932,3556 +15896,3094 @@ discord-banner orig: 84, 45 offset: 0, 0 index: -1 -distributor-icon-large - rotate: false - xy: 1395, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -distributor-icon-medium - rotate: false - xy: 967, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -distributor-icon-small - rotate: false - xy: 1624, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -door-icon-large - rotate: false - xy: 1445, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -door-icon-medium - rotate: false - xy: 1001, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-icon-small - rotate: false - xy: 1650, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -door-large-icon-large - rotate: false - xy: 1495, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -door-large-icon-medium - rotate: false - xy: 1035, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -door-large-icon-small - rotate: false - xy: 1676, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -draug-factory-icon-large - rotate: false - xy: 1545, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -draug-factory-icon-medium - rotate: false - xy: 1069, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -draug-factory-icon-small - rotate: false - xy: 1702, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -dunerocks-icon-large - rotate: false - xy: 1595, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -dunerocks-icon-medium - rotate: false - xy: 1103, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -dunerocks-icon-small - rotate: false - xy: 1728, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -duo-icon-large - rotate: false - xy: 1645, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -duo-icon-medium - rotate: false - xy: 1137, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -duo-icon-small - rotate: false - xy: 1754, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 flat-down-base rotate: false - xy: 415, 696 + xy: 1175, 696 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 offset: 0, 0 index: -1 -force-projector-icon-large - rotate: false - xy: 1695, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -force-projector-icon-medium - rotate: false - xy: 1171, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -force-projector-icon-small - rotate: false - xy: 1780, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -fortress-factory-icon-large - rotate: false - xy: 1745, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -fortress-factory-icon-medium - rotate: false - xy: 1205, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -fortress-factory-icon-small - rotate: false - xy: 1806, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -fuse-icon-large - rotate: false - xy: 1795, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -fuse-icon-medium - rotate: false - xy: 1239, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -fuse-icon-small - rotate: false - xy: 1832, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ghoul-factory-icon-large - rotate: false - xy: 1845, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ghoul-factory-icon-medium - rotate: false - xy: 1273, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ghoul-factory-icon-small - rotate: false - xy: 1858, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -glaive-ship-pad-icon-large - rotate: false - xy: 1895, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -glaive-ship-pad-icon-medium - rotate: false - xy: 1307, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -glaive-ship-pad-icon-small - rotate: false - xy: 1884, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -graphite-press-icon-large - rotate: false - xy: 1945, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -graphite-press-icon-medium - rotate: false - xy: 1341, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -graphite-press-icon-small - rotate: false - xy: 727, 457 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -grass-icon-large - rotate: false - xy: 1995, 975 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -grass-icon-medium - rotate: false - xy: 1375, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -grass-icon-small - rotate: false - xy: 753, 457 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -hail-icon-large - rotate: false - xy: 237, 717 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -hail-icon-medium - rotate: false - xy: 1409, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hail-icon-small - rotate: false - xy: 2005, 746 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -holostone-icon-large - rotate: false - xy: 51, 667 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -holostone-icon-medium - rotate: false - xy: 1443, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -holostone-icon-small - rotate: false - xy: 535, 2 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -hotrock-icon-large - rotate: false - xy: 51, 617 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -hotrock-icon-medium - rotate: false - xy: 1477, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -hotrock-icon-small - rotate: false - xy: 2001, 720 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ice-icon-large - rotate: false - xy: 101, 667 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ice-icon-medium - rotate: false - xy: 1511, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-icon-small - rotate: false - xy: 721, 431 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ice-snow-icon-large - rotate: false - xy: 51, 567 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ice-snow-icon-medium - rotate: false - xy: 1545, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ice-snow-icon-small - rotate: false - xy: 747, 431 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -icerocks-icon-large - rotate: false - xy: 101, 617 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -icerocks-icon-medium - rotate: false - xy: 1579, 691 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -icerocks-icon-small - rotate: false - xy: 818, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 icon-about rotate: false - xy: 151, 667 + xy: 1259, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-about-small rotate: false - xy: 1613, 691 + xy: 1907, 589 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-about-smaller rotate: false - xy: 509, 523 + xy: 2017, 607 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-about-tiny rotate: false - xy: 561, 1 + xy: 1317, 103 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-add rotate: false - xy: 51, 517 + xy: 1309, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-add-small rotate: false - xy: 1647, 691 + xy: 1109, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-add-smaller rotate: false - xy: 541, 523 + xy: 2017, 575 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-add-tiny rotate: false - xy: 579, 1 + xy: 1335, 121 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-admin rotate: false - xy: 101, 567 + xy: 1359, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-admin-badge rotate: false - xy: 151, 617 + xy: 1309, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-admin-badge-small rotate: false - xy: 1681, 691 + xy: 1143, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-admin-badge-smaller rotate: false - xy: 573, 523 + xy: 1645, 421 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-admin-badge-tiny rotate: false - xy: 2031, 754 + xy: 1335, 103 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-admin-small rotate: false - xy: 1715, 691 + xy: 1177, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-admin-smaller rotate: false - xy: 605, 523 + xy: 1677, 421 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-admin-tiny rotate: false - xy: 597, 1 + xy: 1317, 85 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow rotate: false - xy: 201, 667 + xy: 1359, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-16 rotate: false - xy: 201, 667 + xy: 1359, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-16-small rotate: false - xy: 1749, 691 + xy: 1211, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-small rotate: false - xy: 1749, 691 + xy: 1211, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-16-smaller rotate: false - xy: 637, 523 + xy: 1709, 421 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-smaller rotate: false - xy: 637, 523 + xy: 1709, 421 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-16-tiny rotate: false - xy: 2031, 736 + xy: 1335, 85 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-tiny rotate: false - xy: 2031, 736 + xy: 1335, 85 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-down rotate: false - xy: 51, 467 + xy: 1409, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-down-small rotate: false - xy: 1783, 691 + xy: 1245, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-down-smaller rotate: false - xy: 669, 523 + xy: 1741, 421 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-down-tiny rotate: false - xy: 1, 2 + xy: 1377, 266 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-left rotate: false - xy: 101, 517 + xy: 1359, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-left-small rotate: false - xy: 1817, 691 + xy: 1279, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-left-smaller rotate: false - xy: 701, 523 + xy: 1773, 421 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-left-tiny rotate: false - xy: 369, 8 + xy: 1377, 248 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-right rotate: false - xy: 151, 567 + xy: 1409, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-right-small rotate: false - xy: 1851, 691 + xy: 1313, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-right-smaller rotate: false - xy: 733, 523 + xy: 1805, 421 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-right-tiny rotate: false - xy: 877, 453 + xy: 1353, 229 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-arrow-up rotate: false - xy: 201, 617 + xy: 1459, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-arrow-up-small rotate: false - xy: 1885, 691 + xy: 1347, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-arrow-up-smaller rotate: false - xy: 765, 523 + xy: 1837, 421 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-arrow-up-tiny rotate: false - xy: 19, 2 + xy: 1353, 211 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-back rotate: false - xy: 51, 417 + xy: 1409, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-back-small rotate: false - xy: 301, 7 + xy: 1381, 560 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-back-smaller rotate: false - xy: 797, 523 + xy: 1869, 421 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-back-tiny rotate: false - xy: 895, 453 + xy: 1353, 193 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-ban rotate: false - xy: 101, 467 + xy: 1459, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-ban-small rotate: false - xy: 335, 5 + xy: 1135, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-ban-smaller rotate: false - xy: 829, 523 + xy: 1925, 557 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-ban-tiny rotate: false - xy: 877, 435 + xy: 1353, 175 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-break rotate: false - xy: 151, 517 + xy: 1509, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-break-small rotate: false - xy: 411, 599 + xy: 1135, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-break-smaller rotate: false - xy: 861, 523 + xy: 1901, 421 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-break-tiny rotate: false - xy: 895, 435 + xy: 1353, 157 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cancel rotate: false - xy: 201, 567 + xy: 1459, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-cancel-small rotate: false - xy: 449, 628 + xy: 1169, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-cancel-smaller rotate: false - xy: 893, 523 + xy: 1957, 565 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-cancel-tiny rotate: false - xy: 877, 417 + xy: 1353, 139 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-quit-tiny rotate: false - xy: 877, 417 + xy: 1353, 139 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-changelog rotate: false - xy: 51, 367 + xy: 1509, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-changelog-small rotate: false - xy: 487, 657 + xy: 1135, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-changelog-smaller rotate: false - xy: 925, 523 + xy: 1917, 523 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-changelog-tiny rotate: false - xy: 895, 417 + xy: 1353, 121 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-chat rotate: false - xy: 101, 417 + xy: 1559, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-chat-small rotate: false - xy: 521, 657 + xy: 1169, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-chat-smaller rotate: false - xy: 957, 523 + xy: 1917, 491 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-chat-tiny rotate: false - xy: 825, 401 + xy: 1353, 103 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-check rotate: false - xy: 151, 467 + xy: 1509, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-check-small rotate: false - xy: 555, 657 + xy: 1203, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-check-smaller rotate: false - xy: 989, 523 + xy: 1917, 459 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-check-tiny rotate: false - xy: 843, 401 + xy: 1353, 85 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-attack rotate: false - xy: 201, 517 + xy: 1559, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-attack-small rotate: false - xy: 589, 657 + xy: 1169, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-attack-smaller rotate: false - xy: 1021, 523 + xy: 1933, 427 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-attack-tiny rotate: false - xy: 913, 437 + xy: 1371, 230 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-patrol rotate: false - xy: 51, 317 + xy: 1609, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-patrol-small rotate: false - xy: 623, 657 + xy: 1203, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-patrol-smaller rotate: false - xy: 1053, 523 + xy: 1957, 533 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-patrol-tiny rotate: false - xy: 913, 419 + xy: 1371, 212 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-rally rotate: false - xy: 101, 367 + xy: 1559, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-rally-small rotate: false - xy: 657, 657 + xy: 1237, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-rally-smaller rotate: false - xy: 1085, 523 + xy: 1949, 501 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-rally-tiny rotate: false - xy: 1983, 676 + xy: 1371, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-command-retreat rotate: false - xy: 151, 417 + xy: 1609, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-command-retreat-small rotate: false - xy: 691, 657 + xy: 1203, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-command-retreat-smaller rotate: false - xy: 1117, 523 + xy: 1949, 469 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-command-retreat-tiny rotate: false - xy: 2001, 676 + xy: 1371, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-copy rotate: false - xy: 201, 467 + xy: 1659, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-copy-small rotate: false - xy: 725, 657 + xy: 1237, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-copy-smaller rotate: false - xy: 1149, 523 + xy: 1981, 501 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-copy-tiny rotate: false - xy: 2019, 676 + xy: 1371, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-crafting rotate: false - xy: 51, 267 + xy: 1609, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-crafting-small rotate: false - xy: 759, 657 + xy: 1271, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-crafting-smaller rotate: false - xy: 1181, 523 + xy: 1981, 469 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-crafting-tiny rotate: false - xy: 1979, 658 + xy: 1371, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-cursor rotate: false - xy: 101, 317 + xy: 1659, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-cursor-small rotate: false - xy: 793, 657 + xy: 1237, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-cursor-smaller rotate: false - xy: 1213, 523 + xy: 1965, 437 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-cursor-tiny rotate: false - xy: 1997, 658 + xy: 1371, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-database rotate: false - xy: 151, 367 + xy: 1709, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-database-small rotate: false - xy: 827, 657 + xy: 1271, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-database-smaller rotate: false - xy: 1245, 523 + xy: 1997, 437 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-database-tiny rotate: false - xy: 2015, 658 + xy: 1371, 104 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-defense rotate: false - xy: 201, 417 + xy: 1659, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-defense-small rotate: false - xy: 861, 657 + xy: 1305, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-defense-smaller rotate: false - xy: 1277, 523 + xy: 1965, 405 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-defense-tiny rotate: false - xy: 645, 319 + xy: 1371, 86 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-dev-builds rotate: false - xy: 51, 217 + xy: 1709, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-dev-builds-small rotate: false - xy: 895, 657 + xy: 1271, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-dev-builds-smaller rotate: false - xy: 1309, 523 + xy: 1997, 405 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-dev-builds-tiny rotate: false - xy: 645, 301 + xy: 1389, 230 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-diagonal rotate: false - xy: 101, 267 + xy: 1759, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-diagonal-small rotate: false - xy: 929, 657 + xy: 1305, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-diagonal-smaller rotate: false - xy: 1341, 523 + xy: 1933, 395 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-diagonal-tiny rotate: false - xy: 645, 283 + xy: 1389, 212 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-discord rotate: false - xy: 151, 317 + xy: 1709, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-discord-small rotate: false - xy: 963, 657 + xy: 1339, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-discord-smaller rotate: false - xy: 1373, 523 + xy: 1965, 373 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-discord-tiny rotate: false - xy: 663, 325 + xy: 1389, 194 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-distribution rotate: false - xy: 201, 367 + xy: 1759, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-distribution-small rotate: false - xy: 997, 657 + xy: 1305, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-distribution-smaller rotate: false - xy: 1405, 523 + xy: 1997, 373 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-distribution-tiny rotate: false - xy: 663, 307 + xy: 1389, 176 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-donate rotate: false - xy: 51, 167 + xy: 1809, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-donate-small rotate: false - xy: 1031, 657 + xy: 1339, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-donate-smaller rotate: false - xy: 1437, 523 + xy: 753, 32 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-donate-tiny rotate: false - xy: 663, 289 + xy: 1389, 158 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-dots rotate: false - xy: 101, 217 + xy: 1759, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-dots-small rotate: false - xy: 1065, 657 + xy: 1373, 526 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-dots-smaller rotate: false - xy: 1469, 523 + xy: 1989, 543 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-dots-tiny rotate: false - xy: 619, 267 + xy: 1389, 140 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-editor rotate: false - xy: 151, 267 + xy: 1809, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-editor-small rotate: false - xy: 1099, 657 + xy: 1339, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-editor-smaller rotate: false - xy: 1501, 523 + xy: 549, 50 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-editor-tiny rotate: false - xy: 618, 249 + xy: 1389, 122 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-effect rotate: false - xy: 201, 317 + xy: 1859, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-effect-small rotate: false - xy: 1133, 657 + xy: 1373, 492 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-effect-smaller rotate: false - xy: 1533, 523 + xy: 581, 50 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-effect-tiny rotate: false - xy: 616, 231 + xy: 1389, 104 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-elevation rotate: false - xy: 51, 117 + xy: 1809, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-elevation-small rotate: false - xy: 1167, 657 + xy: 1373, 458 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-elevation-smaller rotate: false - xy: 1565, 523 + xy: 547, 18 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-elevation-tiny rotate: false - xy: 616, 213 + xy: 1389, 86 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-eraser rotate: false - xy: 101, 167 + xy: 1859, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-eraser-small rotate: false - xy: 1201, 657 + xy: 1135, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-eraser-smaller rotate: false - xy: 1597, 523 + xy: 579, 18 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-eraser-tiny rotate: false - xy: 616, 195 + xy: 611, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-exit rotate: false - xy: 151, 217 + xy: 1909, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-exit-small rotate: false - xy: 1235, 657 + xy: 1169, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-exit-smaller rotate: false - xy: 1629, 523 + xy: 1645, 389 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-exit-tiny rotate: false - xy: 616, 177 + xy: 629, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-fdroid rotate: false - xy: 201, 267 + xy: 1859, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-fdroid-small rotate: false - xy: 1269, 657 + xy: 1203, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-fdroid-smaller rotate: false - xy: 1661, 523 + xy: 1677, 389 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-fdroid-tiny rotate: false - xy: 616, 159 + xy: 647, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file rotate: false - xy: 51, 67 + xy: 1909, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-file-image rotate: false - xy: 101, 117 + xy: 1959, 925 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-file-image-small rotate: false - xy: 1303, 657 + xy: 1237, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-file-image-smaller rotate: false - xy: 1693, 523 + xy: 1709, 389 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-file-image-tiny rotate: false - xy: 616, 141 + xy: 665, 6 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-small rotate: false - xy: 1337, 657 + xy: 1271, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-file-smaller rotate: false - xy: 1725, 523 + xy: 1741, 389 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-file-text rotate: false - xy: 151, 167 + xy: 1909, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-file-text-small rotate: false - xy: 1371, 657 + xy: 1305, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-file-text-smaller rotate: false - xy: 1757, 523 + xy: 1773, 389 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-file-text-tiny rotate: false - xy: 613, 123 + xy: 683, 12 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-file-tiny rotate: false - xy: 613, 105 + xy: 701, 12 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-fill rotate: false - xy: 201, 217 + xy: 1959, 875 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-fill-small rotate: false - xy: 1405, 657 + xy: 1339, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-fill-smaller rotate: false - xy: 1789, 523 + xy: 1805, 389 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-fill-tiny rotate: false - xy: 613, 87 + xy: 719, 12 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-floppy rotate: false - xy: 101, 67 + xy: 1959, 825 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-floppy-16 rotate: false - xy: 151, 117 + xy: 309, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-floppy-16-small rotate: false - xy: 1439, 657 + xy: 1373, 424 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-floppy-16-smaller rotate: false - xy: 1821, 523 + xy: 1837, 389 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-floppy-16-tiny rotate: false - xy: 613, 69 + xy: 2029, 327 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-floppy-small rotate: false - xy: 1473, 657 + xy: 1415, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-floppy-smaller rotate: false - xy: 1853, 523 + xy: 1869, 389 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-floppy-tiny rotate: false - xy: 613, 51 + xy: 2026, 309 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-folder rotate: false - xy: 201, 167 + xy: 359, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-folder-parent rotate: false - xy: 151, 67 + xy: 409, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-folder-parent-small rotate: false - xy: 1507, 657 + xy: 1449, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-folder-parent-smaller rotate: false - xy: 471, 489 + xy: 1901, 389 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-folder-parent-tiny rotate: false - xy: 613, 33 + xy: 2026, 291 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-folder-small rotate: false - xy: 1541, 657 + xy: 1483, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-folder-smaller rotate: false - xy: 471, 457 + xy: 1933, 363 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-folder-tiny rotate: false - xy: 637, 265 + xy: 1067, 80 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-github rotate: false - xy: 201, 117 + xy: 459, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-github-small rotate: false - xy: 1575, 657 + xy: 1517, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-github-smaller rotate: false - xy: 471, 425 + xy: 1965, 341 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-github-tiny rotate: false - xy: 636, 247 + xy: 1085, 80 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-google-play rotate: false - xy: 201, 67 + xy: 509, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-google-play-small rotate: false - xy: 1609, 657 + xy: 1551, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-google-play-smaller rotate: false - xy: 471, 393 + xy: 1997, 341 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-google-play-tiny rotate: false - xy: 634, 229 + xy: 1067, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-grid rotate: false - xy: 51, 17 + xy: 559, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-grid-small rotate: false - xy: 1643, 657 + xy: 1585, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-grid-smaller rotate: false - xy: 471, 361 + xy: 613, 24 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-grid-tiny rotate: false - xy: 634, 211 + xy: 1067, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-home rotate: false - xy: 101, 17 + xy: 609, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-home-small rotate: false - xy: 1677, 657 + xy: 1619, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-home-smaller rotate: false - xy: 471, 329 + xy: 645, 24 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-home-tiny rotate: false - xy: 634, 193 + xy: 1085, 62 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-host rotate: false - xy: 151, 17 + xy: 659, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-host-small rotate: false - xy: 1711, 657 + xy: 1653, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-host-smaller rotate: false - xy: 471, 297 + xy: 2013, 773 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-host-tiny rotate: false - xy: 634, 175 + xy: 1085, 44 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-info rotate: false - xy: 201, 17 + xy: 709, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-info-small rotate: false - xy: 1745, 657 + xy: 1687, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-info-smaller rotate: false - xy: 471, 265 + xy: 2013, 741 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-info-tiny rotate: false - xy: 634, 157 + xy: 1075, 26 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-itch.io rotate: false - xy: 251, 667 + xy: 759, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-itch.io-small rotate: false - xy: 1779, 657 + xy: 1721, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-itch.io-smaller rotate: false - xy: 471, 233 + xy: 739, 184 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-itch.io-tiny rotate: false - xy: 634, 139 + xy: 1075, 8 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-item rotate: false - xy: 251, 617 + xy: 809, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-item-small rotate: false - xy: 1813, 657 + xy: 1755, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-item-smaller rotate: false - xy: 471, 201 + xy: 771, 184 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-item-tiny rotate: false - xy: 631, 121 + xy: 1093, 26 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-line rotate: false - xy: 251, 567 + xy: 859, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-line-small rotate: false - xy: 1847, 657 + xy: 1789, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-line-smaller rotate: false - xy: 471, 169 + xy: 757, 152 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-line-tiny rotate: false - xy: 631, 103 + xy: 1093, 8 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-link rotate: false - xy: 251, 517 + xy: 909, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-link-small rotate: false - xy: 1881, 657 + xy: 1823, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-link-smaller rotate: false - xy: 471, 137 + xy: 757, 120 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-link-tiny rotate: false - xy: 631, 85 + xy: 1263, 72 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-liquid rotate: false - xy: 251, 467 + xy: 959, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-liquid-consume rotate: false - xy: 251, 417 + xy: 1009, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-liquid-consume-small rotate: false - xy: 445, 594 + xy: 1857, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-liquid-consume-smaller rotate: false - xy: 471, 105 + xy: 757, 88 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-liquid-consume-tiny rotate: false - xy: 631, 67 + xy: 1281, 72 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-liquid-small rotate: false - xy: 483, 623 + xy: 1891, 555 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-liquid-smaller rotate: false - xy: 471, 73 + xy: 789, 152 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-liquid-tiny rotate: false - xy: 631, 49 + xy: 1299, 72 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-load rotate: false - xy: 251, 367 + xy: 1059, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-load-image rotate: false - xy: 251, 317 + xy: 1109, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-load-image-small rotate: false - xy: 517, 623 + xy: 1407, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-load-image-smaller rotate: false - xy: 471, 41 + xy: 789, 120 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-load-image-tiny rotate: false - xy: 631, 31 + xy: 1317, 67 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-load-map rotate: false - xy: 251, 267 + xy: 1159, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-load-map-small rotate: false - xy: 551, 623 + xy: 1407, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-load-map-smaller rotate: false - xy: 471, 9 + xy: 789, 88 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-load-map-tiny rotate: false - xy: 655, 265 + xy: 1335, 67 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-load-small rotate: false - xy: 585, 623 + xy: 1441, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-load-smaller rotate: false - xy: 1885, 523 + xy: 821, 158 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-load-tiny rotate: false - xy: 654, 247 + xy: 1353, 67 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-loading rotate: false - xy: 251, 217 + xy: 1209, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-loading-small rotate: false - xy: 619, 623 + xy: 1407, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-loading-smaller rotate: false - xy: 1919, 688 + xy: 821, 126 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-loading-tiny rotate: false - xy: 652, 229 + xy: 1371, 68 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-locked rotate: false - xy: 251, 167 + xy: 1259, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-locked-small rotate: false - xy: 653, 623 + xy: 1441, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-locked-smaller rotate: false - xy: 1915, 656 + xy: 821, 94 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-locked-tiny rotate: false - xy: 652, 211 + xy: 1389, 68 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-map rotate: false - xy: 251, 117 + xy: 1309, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-map-small rotate: false - xy: 687, 623 + xy: 1475, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-map-smaller rotate: false - xy: 1911, 624 + xy: 853, 158 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-map-tiny rotate: false - xy: 652, 193 + xy: 2026, 273 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-menu rotate: false - xy: 251, 67 + xy: 1359, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-menu-large rotate: false - xy: 251, 17 + xy: 1409, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-menu-large-small rotate: false - xy: 721, 623 + xy: 1441, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-menu-large-smaller rotate: false - xy: 1951, 688 + xy: 853, 126 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-menu-large-tiny rotate: false - xy: 652, 175 + xy: 1103, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-menu-small rotate: false - xy: 755, 623 + xy: 1475, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-menu-smaller rotate: false - xy: 1947, 656 + xy: 853, 94 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-menu-tiny rotate: false - xy: 652, 157 + xy: 1121, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-missing rotate: false - xy: 309, 925 + xy: 1459, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-missing-small rotate: false - xy: 789, 623 + xy: 1509, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-missing-smaller rotate: false - xy: 1943, 624 + xy: 785, 56 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-missing-tiny rotate: false - xy: 652, 139 + xy: 1103, 52 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-mode-attack rotate: false - xy: 309, 875 + xy: 1509, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-mode-attack-small rotate: false - xy: 823, 623 + xy: 1475, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-mode-attack-smaller rotate: false - xy: 503, 489 + xy: 785, 24 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-mode-attack-tiny rotate: false - xy: 649, 121 + xy: 1139, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-mode-pvp rotate: false - xy: 359, 925 + xy: 1559, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-mode-pvp-small rotate: false - xy: 857, 623 + xy: 1509, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-mode-pvp-smaller rotate: false - xy: 503, 457 + xy: 821, 62 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-mode-pvp-tiny rotate: false - xy: 649, 103 + xy: 1121, 52 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-mode-survival rotate: false - xy: 309, 825 + xy: 1609, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-mode-survival-small rotate: false - xy: 891, 623 + xy: 1543, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-mode-survival-smaller rotate: false - xy: 503, 425 + xy: 853, 62 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-mode-survival-tiny rotate: false - xy: 649, 85 + xy: 1157, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-none rotate: false - xy: 359, 875 + xy: 1659, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-none-small rotate: false - xy: 925, 623 + xy: 1509, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-none-smaller rotate: false - xy: 503, 393 + xy: 817, 30 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-none-tiny rotate: false - xy: 649, 67 + xy: 1139, 52 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-paste rotate: false - xy: 409, 925 + xy: 1709, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-paste-small rotate: false - xy: 959, 623 + xy: 1543, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-paste-smaller rotate: false - xy: 503, 361 + xy: 849, 30 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-paste-tiny rotate: false - xy: 649, 49 + xy: 1175, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-pause rotate: false - xy: 359, 825 + xy: 1759, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-pause-small rotate: false - xy: 993, 623 + xy: 1577, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-pause-smaller rotate: false - xy: 503, 329 + xy: 881, 30 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-pause-tiny rotate: false - xy: 649, 31 + xy: 1157, 52 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-pencil rotate: false - xy: 409, 875 + xy: 1809, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-pencil-small rotate: false - xy: 1027, 623 + xy: 1543, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-pencil-smaller rotate: false - xy: 503, 297 + xy: 865, 310 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-pencil-tiny rotate: false - xy: 677, 351 + xy: 1193, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-pick rotate: false - xy: 459, 925 + xy: 1859, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-pick-small rotate: false - xy: 1061, 623 + xy: 1577, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-pick-smaller rotate: false - xy: 503, 265 + xy: 897, 310 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-pick-tiny rotate: false - xy: 681, 333 + xy: 1175, 52 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-play rotate: false - xy: 409, 825 + xy: 1909, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-play-2 rotate: false - xy: 459, 875 + xy: 1959, 775 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-play-2-small rotate: false - xy: 1095, 623 + xy: 1611, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-play-2-smaller rotate: false - xy: 503, 233 + xy: 883, 278 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-play-2-tiny rotate: false - xy: 681, 315 + xy: 1211, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-play-tiny rotate: false - xy: 681, 315 + xy: 1211, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-play-custom rotate: false - xy: 509, 925 + xy: 287, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-play-custom-small rotate: false - xy: 1129, 623 + xy: 1577, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-play-custom-smaller rotate: false - xy: 503, 201 + xy: 883, 246 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-play-custom-tiny rotate: false - xy: 681, 297 + xy: 1193, 52 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-play-small rotate: false - xy: 1163, 623 + xy: 1611, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-play-smaller rotate: false - xy: 503, 169 + xy: 883, 214 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-players rotate: false - xy: 459, 825 + xy: 337, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-players-small rotate: false - xy: 1197, 623 + xy: 1645, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-players-smaller rotate: false - xy: 503, 137 + xy: 915, 278 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-players-tiny rotate: false - xy: 681, 279 + xy: 1229, 70 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-power rotate: false - xy: 509, 875 + xy: 387, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-power-small rotate: false - xy: 1231, 623 + xy: 1611, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-power-smaller rotate: false - xy: 503, 105 + xy: 915, 246 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-power-tiny rotate: false - xy: 673, 261 + xy: 1211, 52 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-production rotate: false - xy: 559, 925 + xy: 437, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-production-small rotate: false - xy: 1265, 623 + xy: 1645, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-production-smaller rotate: false - xy: 503, 73 + xy: 915, 214 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-production-tiny rotate: false - xy: 672, 243 + xy: 1229, 52 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-quit rotate: false - xy: 509, 825 + xy: 487, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-quit-small rotate: false - xy: 1299, 623 + xy: 1679, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-quit-smaller rotate: false - xy: 503, 41 + xy: 947, 284 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-redo rotate: false - xy: 559, 875 + xy: 537, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-redo-small rotate: false - xy: 1333, 623 + xy: 1645, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-redo-smaller rotate: false - xy: 503, 9 + xy: 947, 252 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-redo-tiny rotate: false - xy: 670, 225 + xy: 1111, 34 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-refresh rotate: false - xy: 609, 925 + xy: 587, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-refresh-small rotate: false - xy: 1367, 623 + xy: 1679, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-refresh-smaller rotate: false - xy: 535, 491 + xy: 947, 220 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-refresh-tiny rotate: false - xy: 670, 207 + xy: 1111, 16 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-rename rotate: false - xy: 559, 825 + xy: 637, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-rename-small rotate: false - xy: 1401, 623 + xy: 1713, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-rename-smaller rotate: false - xy: 535, 459 + xy: 979, 284 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-rename-tiny rotate: false - xy: 670, 189 + xy: 1129, 34 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-resize rotate: false - xy: 609, 875 + xy: 687, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-resize-small rotate: false - xy: 1435, 623 + xy: 1679, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-resize-smaller rotate: false - xy: 567, 491 + xy: 979, 252 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-resize-tiny rotate: false - xy: 670, 171 + xy: 1129, 16 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-rotate rotate: false - xy: 659, 925 + xy: 737, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-rotate-arrow rotate: false - xy: 609, 825 + xy: 787, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-rotate-arrow-small rotate: false - xy: 1469, 623 + xy: 1713, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-rotate-arrow-smaller rotate: false - xy: 535, 427 + xy: 979, 220 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-rotate-arrow-tiny rotate: false - xy: 670, 153 + xy: 1147, 34 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-rotate-left rotate: false - xy: 659, 875 + xy: 837, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-rotate-left-small rotate: false - xy: 1503, 623 + xy: 1747, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-rotate-left-smaller rotate: false - xy: 567, 459 + xy: 885, 182 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-rotate-left-tiny rotate: false - xy: 670, 135 + xy: 1147, 16 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-rotate-right rotate: false - xy: 709, 925 + xy: 887, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-rotate-right-small rotate: false - xy: 1537, 623 + xy: 1713, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-rotate-right-smaller rotate: false - xy: 599, 491 + xy: 885, 150 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-rotate-right-tiny rotate: false - xy: 667, 117 + xy: 1165, 34 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-rotate-small rotate: false - xy: 1571, 623 + xy: 1747, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-rotate-smaller rotate: false - xy: 535, 395 + xy: 885, 118 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-rotate-tiny rotate: false - xy: 667, 99 + xy: 1165, 16 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-save rotate: false - xy: 659, 825 + xy: 937, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-save-image rotate: false - xy: 709, 875 + xy: 987, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-save-image-small rotate: false - xy: 1605, 623 + xy: 1781, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-save-image-smaller rotate: false - xy: 567, 427 + xy: 885, 86 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-save-image-tiny rotate: false - xy: 667, 81 + xy: 1183, 34 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-save-map rotate: false - xy: 759, 925 + xy: 1037, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-save-map-small rotate: false - xy: 1639, 623 + xy: 1747, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-save-map-smaller rotate: false - xy: 599, 459 + xy: 917, 182 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-save-map-tiny rotate: false - xy: 667, 63 + xy: 1183, 16 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-save-small rotate: false - xy: 1673, 623 + xy: 1781, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-save-smaller rotate: false - xy: 631, 491 + xy: 917, 150 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-save-tiny rotate: false - xy: 667, 45 + xy: 1201, 34 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-settings rotate: false - xy: 709, 825 + xy: 1087, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-settings-small rotate: false - xy: 1707, 623 + xy: 1815, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-settings-smaller rotate: false - xy: 535, 363 + xy: 917, 118 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-settings-tiny rotate: false - xy: 667, 27 + xy: 1201, 16 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-spray rotate: false - xy: 759, 875 + xy: 1137, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-spray-small rotate: false - xy: 1741, 623 + xy: 1781, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-spray-smaller rotate: false - xy: 567, 395 + xy: 917, 86 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-spray-tiny rotate: false - xy: 691, 261 + xy: 1219, 34 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-terrain rotate: false - xy: 809, 925 + xy: 1187, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-terrain-small rotate: false - xy: 1775, 623 + xy: 1815, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-terrain-smaller rotate: false - xy: 599, 427 + xy: 949, 188 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-terrain-tiny rotate: false - xy: 690, 243 + xy: 1219, 16 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-tools rotate: false - xy: 759, 825 + xy: 1237, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-tools-small rotate: false - xy: 1809, 623 + xy: 1849, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-tools-smaller rotate: false - xy: 631, 459 + xy: 949, 156 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-tools-tiny rotate: false - xy: 688, 225 + xy: 1237, 34 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-trash rotate: false - xy: 809, 875 + xy: 1287, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-trash-16 rotate: false - xy: 859, 925 + xy: 1337, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-trash-16-small rotate: false - xy: 1843, 623 + xy: 1815, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-trash-16-smaller rotate: false - xy: 663, 491 + xy: 949, 124 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-trash-16-tiny rotate: false - xy: 688, 207 + xy: 1237, 16 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-trash-small rotate: false - xy: 1877, 623 + xy: 1849, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-trash-smaller rotate: false - xy: 535, 331 + xy: 949, 92 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-trash-tiny rotate: false - xy: 688, 189 + xy: 1247, 54 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-tree rotate: false - xy: 809, 825 + xy: 1387, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-tree-small rotate: false - xy: 479, 589 + xy: 1883, 521 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-tree-smaller rotate: false - xy: 567, 363 + xy: 981, 188 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-tree-tiny rotate: false - xy: 688, 171 + xy: 1265, 54 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-trello rotate: false - xy: 859, 875 + xy: 1437, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-trello-small rotate: false - xy: 513, 589 + xy: 1849, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-trello-smaller rotate: false - xy: 599, 395 + xy: 981, 156 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-trello-tiny rotate: false - xy: 688, 153 + xy: 1283, 54 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-turret rotate: false - xy: 909, 925 + xy: 1487, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-turret-small rotate: false - xy: 547, 589 + xy: 1883, 487 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-turret-smaller rotate: false - xy: 631, 427 + xy: 981, 124 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-turret-tiny rotate: false - xy: 688, 135 + xy: 1255, 36 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-tutorial rotate: false - xy: 859, 825 + xy: 1537, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-tutorial-small rotate: false - xy: 581, 589 + xy: 1883, 453 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-tutorial-smaller rotate: false - xy: 663, 459 + xy: 981, 92 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-tutorial-tiny rotate: false - xy: 685, 117 + xy: 1255, 18 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-undo rotate: false - xy: 909, 875 + xy: 1587, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-undo-small rotate: false - xy: 615, 589 + xy: 1407, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-undo-smaller rotate: false - xy: 695, 491 + xy: 913, 54 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-undo-tiny rotate: false - xy: 685, 99 + xy: 1273, 36 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-units rotate: false - xy: 959, 925 + xy: 1637, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-units-small rotate: false - xy: 649, 589 + xy: 1441, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-units-smaller rotate: false - xy: 535, 299 + xy: 913, 22 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-units-tiny rotate: false - xy: 685, 81 + xy: 1273, 18 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-unlocks rotate: false - xy: 909, 825 + xy: 1687, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-unlocks-small rotate: false - xy: 683, 589 + xy: 1475, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-unlocks-smaller rotate: false - xy: 567, 331 + xy: 949, 60 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-unlocks-tiny rotate: false - xy: 685, 63 + xy: 1291, 36 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-upgrade rotate: false - xy: 959, 875 + xy: 1737, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-upgrade-small rotate: false - xy: 717, 589 + xy: 1509, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-upgrade-smaller rotate: false - xy: 599, 363 + xy: 981, 60 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-upgrade-tiny rotate: false - xy: 685, 45 + xy: 1291, 18 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-wiki rotate: false - xy: 1009, 925 + xy: 1787, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-wiki-small rotate: false - xy: 751, 589 + xy: 1543, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-wiki-smaller rotate: false - xy: 631, 395 + xy: 945, 28 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-wiki-tiny rotate: false - xy: 685, 27 + xy: 1385, 297 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-workshop rotate: false - xy: 959, 825 + xy: 1837, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-workshop-small rotate: false - xy: 785, 589 + xy: 1577, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-workshop-smaller rotate: false - xy: 663, 427 + xy: 977, 28 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-workshop-tiny rotate: false - xy: 1907, 605 + xy: 1403, 297 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 icon-zoom rotate: false - xy: 1009, 875 + xy: 1887, 725 size: 48, 48 orig: 48, 48 offset: 0, 0 index: -1 icon-zoom-small rotate: false - xy: 819, 589 + xy: 1611, 419 size: 32, 32 orig: 32, 32 offset: 0, 0 index: -1 icon-zoom-smaller rotate: false - xy: 695, 459 + xy: 1009, 28 size: 30, 30 orig: 30, 30 offset: 0, 0 index: -1 icon-zoom-tiny rotate: false - xy: 1925, 606 + xy: 1421, 297 size: 16, 16 orig: 16, 16 offset: 0, 0 index: -1 -ignarock-icon-large - rotate: false - xy: 1059, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ignarock-icon-medium - rotate: false - xy: 853, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ignarock-icon-small - rotate: false - xy: 844, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -impact-reactor-icon-large - rotate: false - xy: 1009, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -impact-reactor-icon-medium - rotate: false - xy: 887, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -impact-reactor-icon-small - rotate: false - xy: 870, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -incinerator-icon-large - rotate: false - xy: 1059, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -incinerator-icon-medium - rotate: false - xy: 921, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -incinerator-icon-small - rotate: false - xy: 896, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 info-banner rotate: false xy: 259, 978 @@ -13491,621 +18993,12 @@ info-banner index: -1 inventory rotate: false - xy: 922, 455 + xy: 1271, 252 size: 24, 40 split: 10, 10, 10, 14 orig: 24, 40 offset: 0, 0 index: -1 -item-source-icon-large - rotate: false - xy: 1109, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-source-icon-medium - rotate: false - xy: 955, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-source-icon-small - rotate: false - xy: 948, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -item-void-icon-large - rotate: false - xy: 1059, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -item-void-icon-medium - rotate: false - xy: 989, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -item-void-icon-small - rotate: false - xy: 974, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -javelin-ship-pad-icon-large - rotate: false - xy: 1109, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -javelin-ship-pad-icon-medium - rotate: false - xy: 1023, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -javelin-ship-pad-icon-small - rotate: false - xy: 1000, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -junction-icon-large - rotate: false - xy: 1159, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -junction-icon-medium - rotate: false - xy: 1057, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -junction-icon-small - rotate: false - xy: 1026, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -kiln-icon-large - rotate: false - xy: 1109, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -kiln-icon-medium - rotate: false - xy: 1091, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -kiln-icon-small - rotate: false - xy: 1052, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -lancer-icon-large - rotate: false - xy: 1159, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -lancer-icon-medium - rotate: false - xy: 1125, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -lancer-icon-small - rotate: false - xy: 1078, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -laser-drill-icon-large - rotate: false - xy: 1209, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -laser-drill-icon-medium - rotate: false - xy: 1159, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -laser-drill-icon-small - rotate: false - xy: 1104, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -launch-pad-icon-large - rotate: false - xy: 1159, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -launch-pad-icon-medium - rotate: false - xy: 1193, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -launch-pad-icon-small - rotate: false - xy: 1130, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -launch-pad-large-icon-large - rotate: false - xy: 1209, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -launch-pad-large-icon-medium - rotate: false - xy: 1227, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -launch-pad-large-icon-small - rotate: false - xy: 1156, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-junction-icon-large - rotate: false - xy: 1259, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-junction-icon-medium - rotate: false - xy: 1261, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-junction-icon-small - rotate: false - xy: 1182, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-router-icon-large - rotate: false - xy: 1209, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-router-icon-medium - rotate: false - xy: 1295, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-router-icon-small - rotate: false - xy: 1208, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-source-icon-large - rotate: false - xy: 1259, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-source-icon-medium - rotate: false - xy: 1329, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-source-icon-small - rotate: false - xy: 1234, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -liquid-tank-icon-large - rotate: false - xy: 1309, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -liquid-tank-icon-medium - rotate: false - xy: 1363, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -liquid-tank-icon-small - rotate: false - xy: 1260, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -magmarock-icon-large - rotate: false - xy: 1259, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -magmarock-icon-medium - rotate: false - xy: 1397, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -magmarock-icon-small - rotate: false - xy: 1286, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -mass-driver-icon-large - rotate: false - xy: 1309, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mass-driver-icon-medium - rotate: false - xy: 1431, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mass-driver-icon-small - rotate: false - xy: 1312, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -mechanical-drill-icon-large - rotate: false - xy: 1359, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mechanical-drill-icon-medium - rotate: false - xy: 1465, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mechanical-drill-icon-small - rotate: false - xy: 1338, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -mechanical-pump-icon-large - rotate: false - xy: 1309, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mechanical-pump-icon-medium - rotate: false - xy: 1499, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mechanical-pump-icon-small - rotate: false - xy: 1364, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -meltdown-icon-large - rotate: false - xy: 1359, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -meltdown-icon-medium - rotate: false - xy: 1533, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -meltdown-icon-small - rotate: false - xy: 1390, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -melter-icon-large - rotate: false - xy: 1409, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -melter-icon-medium - rotate: false - xy: 1567, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -melter-icon-small - rotate: false - xy: 1416, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -mend-projector-icon-large - rotate: false - xy: 1359, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mend-projector-icon-medium - rotate: false - xy: 1601, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mend-projector-icon-small - rotate: false - xy: 1442, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -mender-icon-large - rotate: false - xy: 1409, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -mender-icon-medium - rotate: false - xy: 1635, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -mender-icon-small - rotate: false - xy: 1468, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -message-icon-large - rotate: false - xy: 1459, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -message-icon-medium - rotate: false - xy: 1669, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -message-icon-small - rotate: false - xy: 1494, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -metal-floor-2-icon-large - rotate: false - xy: 1409, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -metal-floor-2-icon-medium - rotate: false - xy: 1703, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-2-icon-small - rotate: false - xy: 1520, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -metal-floor-3-icon-large - rotate: false - xy: 1459, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -metal-floor-3-icon-medium - rotate: false - xy: 1737, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-3-icon-small - rotate: false - xy: 1546, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -metal-floor-5-icon-large - rotate: false - xy: 1509, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -metal-floor-5-icon-medium - rotate: false - xy: 1771, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-5-icon-small - rotate: false - xy: 1572, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -metal-floor-damaged-icon-large - rotate: false - xy: 1459, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -metal-floor-damaged-icon-medium - rotate: false - xy: 1805, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-damaged-icon-small - rotate: false - xy: 1598, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -metal-floor-icon-large - rotate: false - xy: 1509, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -metal-floor-icon-medium - rotate: false - xy: 1839, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -metal-floor-icon-small - rotate: false - xy: 1624, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -moss-icon-large - rotate: false - xy: 1559, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -moss-icon-medium - rotate: false - xy: 1873, 589 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -moss-icon-small - rotate: false - xy: 1650, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -multi-press-icon-large - rotate: false - xy: 1509, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -multi-press-icon-medium - rotate: false - xy: 376, 570 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -multi-press-icon-small - rotate: false - xy: 1676, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 nomap rotate: false xy: 1, 767 @@ -14113,93 +19006,9 @@ nomap orig: 256, 256 offset: 0, 0 index: -1 -oil-extractor-icon-large - rotate: false - xy: 1559, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -oil-extractor-icon-medium - rotate: false - xy: 410, 565 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -oil-extractor-icon-small - rotate: false - xy: 1702, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -omega-mech-pad-icon-large - rotate: false - xy: 1609, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -omega-mech-pad-icon-medium - rotate: false - xy: 444, 560 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -omega-mech-pad-icon-small - rotate: false - xy: 1728, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -overdrive-projector-icon-large - rotate: false - xy: 1559, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -overdrive-projector-icon-medium - rotate: false - xy: 478, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -overdrive-projector-icon-small - rotate: false - xy: 1754, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -overflow-gate-icon-large - rotate: false - xy: 1609, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -overflow-gate-icon-medium - rotate: false - xy: 512, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -overflow-gate-icon-small - rotate: false - xy: 1780, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 pane rotate: false - xy: 339, 609 + xy: 1251, 696 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -14207,813 +19016,15 @@ pane index: -1 pane-2 rotate: false - xy: 301, 580 + xy: 1213, 696 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 offset: 0, 0 index: -1 -pebbles-icon-large - rotate: false - xy: 1659, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pebbles-icon-medium - rotate: false - xy: 546, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pebbles-icon-small - rotate: false - xy: 1806, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -phantom-factory-icon-large - rotate: false - xy: 1609, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -phantom-factory-icon-medium - rotate: false - xy: 580, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phantom-factory-icon-small - rotate: false - xy: 1832, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -phase-conduit-icon-large - rotate: false - xy: 1659, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -phase-conduit-icon-medium - rotate: false - xy: 614, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conduit-icon-small - rotate: false - xy: 1858, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -phase-conveyor-icon-large - rotate: false - xy: 1709, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -phase-conveyor-icon-medium - rotate: false - xy: 648, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-conveyor-icon-small - rotate: false - xy: 1884, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -phase-wall-icon-large - rotate: false - xy: 1659, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -phase-wall-icon-medium - rotate: false - xy: 682, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-icon-small - rotate: false - xy: 948, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -phase-wall-large-icon-large - rotate: false - xy: 1709, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -phase-wall-large-icon-medium - rotate: false - xy: 716, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-wall-large-icon-small - rotate: false - xy: 974, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -phase-weaver-icon-large - rotate: false - xy: 1759, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -phase-weaver-icon-medium - rotate: false - xy: 750, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -phase-weaver-icon-small - rotate: false - xy: 1000, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -pine-icon-large - rotate: false - xy: 1709, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pine-icon-medium - rotate: false - xy: 784, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pine-icon-small - rotate: false - xy: 1026, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -plastanium-compressor-icon-large - rotate: false - xy: 1759, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -plastanium-compressor-icon-medium - rotate: false - xy: 818, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -plastanium-compressor-icon-small - rotate: false - xy: 1052, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -pneumatic-drill-icon-large - rotate: false - xy: 1809, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pneumatic-drill-icon-medium - rotate: false - xy: 852, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pneumatic-drill-icon-small - rotate: false - xy: 1078, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -power-node-icon-large - rotate: false - xy: 1759, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -power-node-icon-medium - rotate: false - xy: 886, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-icon-small - rotate: false - xy: 1104, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -power-node-large-icon-large - rotate: false - xy: 1809, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -power-node-large-icon-medium - rotate: false - xy: 920, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-node-large-icon-small - rotate: false - xy: 1130, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -power-source-icon-large - rotate: false - xy: 1859, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -power-source-icon-medium - rotate: false - xy: 954, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-source-icon-small - rotate: false - xy: 1156, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -power-void-icon-large - rotate: false - xy: 1809, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -power-void-icon-medium - rotate: false - xy: 988, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -power-void-icon-small - rotate: false - xy: 1182, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -pulse-conduit-icon-large - rotate: false - xy: 1859, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pulse-conduit-icon-medium - rotate: false - xy: 1022, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulse-conduit-icon-small - rotate: false - xy: 1208, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -pulverizer-icon-large - rotate: false - xy: 1909, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pulverizer-icon-medium - rotate: false - xy: 1056, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pulverizer-icon-small - rotate: false - xy: 1234, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -pyratite-mixer-icon-large - rotate: false - xy: 1859, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -pyratite-mixer-icon-medium - rotate: false - xy: 1090, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -pyratite-mixer-icon-small - rotate: false - xy: 1260, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -repair-point-icon-large - rotate: false - xy: 1909, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -repair-point-icon-medium - rotate: false - xy: 1124, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -repair-point-icon-small - rotate: false - xy: 1286, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -revenant-factory-icon-large - rotate: false - xy: 1959, 925 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -revenant-factory-icon-medium - rotate: false - xy: 1158, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -revenant-factory-icon-small - rotate: false - xy: 1312, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -ripple-icon-large - rotate: false - xy: 1909, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -ripple-icon-medium - rotate: false - xy: 1192, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -ripple-icon-small - rotate: false - xy: 1338, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -rock-icon-large - rotate: false - xy: 1959, 875 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rock-icon-medium - rotate: false - xy: 1226, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rock-icon-small - rotate: false - xy: 1364, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -rocks-icon-large - rotate: false - xy: 1959, 825 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rocks-icon-medium - rotate: false - xy: 1260, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rocks-icon-small - rotate: false - xy: 1390, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -rotary-pump-icon-large - rotate: false - xy: 309, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rotary-pump-icon-medium - rotate: false - xy: 1294, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rotary-pump-icon-small - rotate: false - xy: 1416, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -router-icon-large - rotate: false - xy: 359, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -router-icon-medium - rotate: false - xy: 1328, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -router-icon-small - rotate: false - xy: 1442, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -rtg-generator-icon-large - rotate: false - xy: 409, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -rtg-generator-icon-medium - rotate: false - xy: 1362, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -rtg-generator-icon-small - rotate: false - xy: 1468, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -salt-icon-large - rotate: false - xy: 459, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -salt-icon-medium - rotate: false - xy: 1396, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salt-icon-small - rotate: false - xy: 1494, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -saltrocks-icon-large - rotate: false - xy: 509, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -saltrocks-icon-medium - rotate: false - xy: 1430, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -saltrocks-icon-small - rotate: false - xy: 1520, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -salvo-icon-large - rotate: false - xy: 559, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -salvo-icon-medium - rotate: false - xy: 1464, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -salvo-icon-small - rotate: false - xy: 1546, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -sand-boulder-icon-large - rotate: false - xy: 609, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sand-boulder-icon-medium - rotate: false - xy: 1498, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-boulder-icon-small - rotate: false - xy: 1572, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -sand-icon-large - rotate: false - xy: 659, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sand-icon-medium - rotate: false - xy: 1532, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-icon-small - rotate: false - xy: 1598, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -sand-water-icon-large - rotate: false - xy: 709, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sand-water-icon-medium - rotate: false - xy: 1566, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sand-water-icon-small - rotate: false - xy: 1624, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -sandrocks-icon-large - rotate: false - xy: 759, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sandrocks-icon-medium - rotate: false - xy: 1600, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sandrocks-icon-small - rotate: false - xy: 1650, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -scatter-icon-large - rotate: false - xy: 809, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -scatter-icon-medium - rotate: false - xy: 1634, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scatter-icon-small - rotate: false - xy: 1676, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -scorch-icon-large - rotate: false - xy: 859, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -scorch-icon-medium - rotate: false - xy: 1668, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scorch-icon-small - rotate: false - xy: 1702, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -scrap-wall-gigantic-icon-large - rotate: false - xy: 909, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -scrap-wall-gigantic-icon-medium - rotate: false - xy: 1702, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-gigantic-icon-small - rotate: false - xy: 1728, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -scrap-wall-huge-icon-large - rotate: false - xy: 959, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -scrap-wall-huge-icon-medium - rotate: false - xy: 1736, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-huge-icon-small - rotate: false - xy: 1754, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -scrap-wall-icon-large - rotate: false - xy: 1009, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -scrap-wall-icon-medium - rotate: false - xy: 1770, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-icon-small - rotate: false - xy: 1780, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -scrap-wall-large-icon-large - rotate: false - xy: 1059, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -scrap-wall-large-icon-medium - rotate: false - xy: 1804, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -scrap-wall-large-icon-small - rotate: false - xy: 1806, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 scroll rotate: false - xy: 1858, 434 + xy: 1323, 283 size: 24, 35 split: 10, 10, 6, 5 orig: 24, 35 @@ -15021,7 +19032,7 @@ scroll index: -1 scroll-horizontal rotate: false - xy: 339, 583 + xy: 301, 1 size: 35, 24 split: 6, 5, 10, 10 orig: 35, 24 @@ -15029,17 +19040,15 @@ scroll-horizontal index: -1 scroll-knob-horizontal-black rotate: false - xy: 1937, 749 + xy: 301, 27 size: 40, 24 - split: 11, 10, 10, 10 orig: 40, 24 offset: 0, 0 index: -1 scroll-knob-vertical-black rotate: false - xy: 1832, 429 + xy: 1297, 252 size: 24, 40 - split: 10, 10, 6, 10 orig: 24, 40 offset: 0, 0 index: -1 @@ -15050,177 +19059,30 @@ selection orig: 1, 1 offset: 0, 0 index: -1 -separator-icon-large - rotate: false - xy: 1109, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -separator-icon-medium - rotate: false - xy: 1838, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -separator-icon-small - rotate: false - xy: 1884, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -shale-boulder-icon-large - rotate: false - xy: 1159, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -shale-boulder-icon-medium - rotate: false - xy: 1872, 555 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-boulder-icon-small - rotate: false - xy: 1884, 419 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -shale-icon-large - rotate: false - xy: 1209, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -shale-icon-medium - rotate: false - xy: 373, 536 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shale-icon-small - rotate: false - xy: 1858, 408 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -shalerocks-icon-large - rotate: false - xy: 1259, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -shalerocks-icon-medium - rotate: false - xy: 369, 502 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shalerocks-icon-small - rotate: false - xy: 1884, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -shock-mine-icon-large - rotate: false - xy: 1309, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -shock-mine-icon-medium - rotate: false - xy: 369, 468 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shock-mine-icon-small - rotate: false - xy: 779, 457 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -shrubs-icon-large - rotate: false - xy: 1359, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -shrubs-icon-medium - rotate: false - xy: 369, 434 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -shrubs-icon-small - rotate: false - xy: 773, 431 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -silicon-smelter-icon-large - rotate: false - xy: 1409, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -silicon-smelter-icon-medium - rotate: false - xy: 369, 400 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -silicon-smelter-icon-small - rotate: false - xy: 1983, 694 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 slider rotate: false - xy: 373, 573 + xy: 2026, 331 size: 1, 8 orig: 1, 8 offset: 0, 0 index: -1 slider-knob rotate: false - xy: 727, 483 + xy: 983, 420 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-down rotate: false - xy: 535, 259 + xy: 1014, 428 size: 29, 38 orig: 29, 38 offset: 0, 0 index: -1 slider-knob-over rotate: false - xy: 758, 483 + xy: 1009, 380 size: 29, 38 orig: 29, 38 offset: 0, 0 @@ -15232,765 +19094,9 @@ slider-vertical orig: 8, 1 offset: 0, 0 index: -1 -snow-icon-large - rotate: false - xy: 1459, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-icon-medium - rotate: false - xy: 369, 366 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-icon-small - rotate: false - xy: 2009, 694 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -snow-pine-icon-large - rotate: false - xy: 1509, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snow-pine-icon-medium - rotate: false - xy: 369, 332 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snow-pine-icon-small - rotate: false - xy: 695, 407 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -snowrock-icon-large - rotate: false - xy: 1559, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrock-icon-medium - rotate: false - xy: 369, 298 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snowrock-icon-small - rotate: false - xy: 721, 405 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -snowrocks-icon-large - rotate: false - xy: 1609, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -snowrocks-icon-medium - rotate: false - xy: 369, 264 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -snowrocks-icon-small - rotate: false - xy: 747, 405 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -solar-panel-icon-large - rotate: false - xy: 1659, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -solar-panel-icon-medium - rotate: false - xy: 369, 230 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-icon-small - rotate: false - xy: 773, 405 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -solar-panel-large-icon-large - rotate: false - xy: 1709, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -solar-panel-large-icon-medium - rotate: false - xy: 369, 196 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -solar-panel-large-icon-small - rotate: false - xy: 1910, 497 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -sorter-icon-large - rotate: false - xy: 1759, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sorter-icon-medium - rotate: false - xy: 369, 162 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sorter-icon-small - rotate: false - xy: 1910, 471 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -spawn-icon-large - rotate: false - xy: 1809, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spawn-icon-medium - rotate: false - xy: 369, 128 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spawn-icon-small - rotate: false - xy: 1910, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -spectre-icon-large - rotate: false - xy: 1859, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spectre-icon-medium - rotate: false - xy: 369, 94 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spectre-icon-small - rotate: false - xy: 1910, 419 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -spirit-factory-icon-large - rotate: false - xy: 1909, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spirit-factory-icon-medium - rotate: false - xy: 369, 60 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spirit-factory-icon-small - rotate: false - xy: 1910, 393 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -spore-cluster-icon-large - rotate: false - xy: 1959, 775 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-cluster-icon-medium - rotate: false - xy: 369, 26 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-cluster-icon-small - rotate: false - xy: 567, 279 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -spore-moss-icon-large - rotate: false - xy: 287, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-moss-icon-medium - rotate: false - xy: 407, 531 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-moss-icon-small - rotate: false - xy: 566, 253 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -spore-pine-icon-large - rotate: false - xy: 337, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-pine-icon-medium - rotate: false - xy: 403, 497 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-pine-icon-small - rotate: false - xy: 564, 227 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -spore-press-icon-large - rotate: false - xy: 387, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -spore-press-icon-medium - rotate: false - xy: 403, 463 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -spore-press-icon-small - rotate: false - xy: 564, 201 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -sporerocks-icon-large - rotate: false - xy: 437, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -sporerocks-icon-medium - rotate: false - xy: 403, 429 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -sporerocks-icon-small - rotate: false - xy: 564, 175 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -stone-icon-large - rotate: false - xy: 487, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -stone-icon-medium - rotate: false - xy: 403, 395 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -stone-icon-small - rotate: false - xy: 564, 149 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -surge-tower-icon-large - rotate: false - xy: 537, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -surge-tower-icon-medium - rotate: false - xy: 403, 361 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-tower-icon-small - rotate: false - xy: 561, 123 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -surge-wall-icon-large - rotate: false - xy: 587, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -surge-wall-icon-medium - rotate: false - xy: 403, 327 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-icon-small - rotate: false - xy: 561, 97 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -surge-wall-large-icon-large - rotate: false - xy: 637, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -surge-wall-large-icon-medium - rotate: false - xy: 403, 293 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -surge-wall-large-icon-small - rotate: false - xy: 561, 71 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -swarmer-icon-large - rotate: false - xy: 687, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -swarmer-icon-medium - rotate: false - xy: 403, 259 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -swarmer-icon-small - rotate: false - xy: 561, 45 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -tainted-water-icon-large - rotate: false - xy: 737, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -tainted-water-icon-medium - rotate: false - xy: 403, 225 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tainted-water-icon-small - rotate: false - xy: 561, 19 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -tar-icon-large - rotate: false - xy: 787, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -tar-icon-medium - rotate: false - xy: 403, 191 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tar-icon-small - rotate: false - xy: 593, 305 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -tau-mech-pad-icon-large - rotate: false - xy: 837, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -tau-mech-pad-icon-medium - rotate: false - xy: 403, 157 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tau-mech-pad-icon-small - rotate: false - xy: 593, 279 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -tendrils-icon-large - rotate: false - xy: 887, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -tendrils-icon-medium - rotate: false - xy: 403, 123 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -tendrils-icon-small - rotate: false - xy: 592, 253 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -thermal-generator-icon-large - rotate: false - xy: 937, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -thermal-generator-icon-medium - rotate: false - xy: 403, 89 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thermal-generator-icon-small - rotate: false - xy: 590, 227 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -thermal-pump-icon-large - rotate: false - xy: 987, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -thermal-pump-icon-medium - rotate: false - xy: 403, 55 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thermal-pump-icon-small - rotate: false - xy: 590, 201 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -thorium-reactor-icon-large - rotate: false - xy: 1037, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -thorium-reactor-icon-medium - rotate: false - xy: 403, 21 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-reactor-icon-small - rotate: false - xy: 590, 175 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -thorium-wall-icon-large - rotate: false - xy: 1087, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -thorium-wall-icon-medium - rotate: false - xy: 441, 526 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-icon-small - rotate: false - xy: 590, 149 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -thorium-wall-large-icon-large - rotate: false - xy: 1137, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -thorium-wall-large-icon-medium - rotate: false - xy: 437, 492 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thorium-wall-large-icon-small - rotate: false - xy: 587, 123 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -thruster-icon-large - rotate: false - xy: 1187, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -thruster-icon-medium - rotate: false - xy: 437, 458 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -thruster-icon-small - rotate: false - xy: 587, 97 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -titan-factory-icon-large - rotate: false - xy: 1237, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -titan-factory-icon-medium - rotate: false - xy: 437, 424 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titan-factory-icon-small - rotate: false - xy: 587, 71 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -titanium-conveyor-icon-large - rotate: false - xy: 1287, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -titanium-conveyor-icon-medium - rotate: false - xy: 437, 390 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-conveyor-icon-small - rotate: false - xy: 587, 45 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -titanium-wall-icon-large - rotate: false - xy: 1337, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -titanium-wall-icon-medium - rotate: false - xy: 437, 356 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-icon-small - rotate: false - xy: 587, 19 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -titanium-wall-large-icon-large - rotate: false - xy: 1387, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -titanium-wall-large-icon-medium - rotate: false - xy: 437, 322 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -titanium-wall-large-icon-small - rotate: false - xy: 625, 337 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -trident-ship-pad-icon-large - rotate: false - xy: 1437, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -trident-ship-pad-icon-medium - rotate: false - xy: 437, 288 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -trident-ship-pad-icon-small - rotate: false - xy: 619, 311 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -turbine-generator-icon-large - rotate: false - xy: 1487, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -turbine-generator-icon-medium - rotate: false - xy: 437, 254 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -turbine-generator-icon-small - rotate: false - xy: 619, 285 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 underline rotate: false - xy: 301, 551 + xy: 1403, 696 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -15998,7 +19104,7 @@ underline index: -1 underline-2 rotate: false - xy: 377, 638 + xy: 1289, 696 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16006,7 +19112,7 @@ underline-2 index: -1 underline-disabled rotate: false - xy: 415, 667 + xy: 1327, 696 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 @@ -16014,192 +19120,24 @@ underline-disabled index: -1 underline-red rotate: false - xy: 453, 696 + xy: 1365, 696 size: 36, 27 split: 12, 12, 12, 12 orig: 36, 27 offset: 0, 0 index: -1 -unloader-icon-large - rotate: false - xy: 1537, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -unloader-icon-medium - rotate: false - xy: 437, 220 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -unloader-icon-small - rotate: false - xy: 657, 369 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -vault-icon-large - rotate: false - xy: 1587, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -vault-icon-medium - rotate: false - xy: 437, 186 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -vault-icon-small - rotate: false - xy: 651, 343 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -water-extractor-icon-large - rotate: false - xy: 1637, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -water-extractor-icon-medium - rotate: false - xy: 437, 152 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water-extractor-icon-small - rotate: false - xy: 799, 431 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -water-icon-large - rotate: false - xy: 1687, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -water-icon-medium - rotate: false - xy: 437, 118 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -water-icon-small - rotate: false - xy: 799, 405 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -wave-icon-large - rotate: false - xy: 1737, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -wave-icon-medium - rotate: false - xy: 437, 84 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -wave-icon-small - rotate: false - xy: 825, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -white-tree-dead-icon-large - rotate: false - xy: 1787, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -white-tree-dead-icon-medium - rotate: false - xy: 437, 50 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -white-tree-dead-icon-small - rotate: false - xy: 825, 419 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 -white-tree-icon-large - rotate: false - xy: 1837, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -white-tree-icon-medium - rotate: false - xy: 437, 16 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -white-tree-icon-small - rotate: false - xy: 851, 445 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 whiteui rotate: false - xy: 1919, 720 + xy: 1415, 589 size: 3, 3 orig: 3, 3 offset: 0, 0 index: -1 window-empty rotate: false - xy: 535, 158 + xy: 2019, 640 size: 27, 61 split: 4, 4, 2, 2 orig: 27, 61 offset: 0, 0 index: -1 -wraith-factory-icon-large - rotate: false - xy: 1887, 725 - size: 48, 48 - orig: 48, 48 - offset: 0, 0 - index: -1 -wraith-factory-icon-medium - rotate: false - xy: 475, 521 - size: 32, 32 - orig: 32, 32 - offset: 0, 0 - index: -1 -wraith-factory-icon-small - rotate: false - xy: 851, 419 - size: 24, 24 - orig: 24, 24 - offset: 0, 0 - index: -1 diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png index ed2ea1d911..3b1dbc0ad1 100644 Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ diff --git a/core/assets/sprites/sprites5.png b/core/assets/sprites/sprites5.png index 861b83349a..e6443c9a51 100644 Binary files a/core/assets/sprites/sprites5.png and b/core/assets/sprites/sprites5.png differ diff --git a/core/src/io/anuke/mindustry/ClientLauncher.java b/core/src/io/anuke/mindustry/ClientLauncher.java index fe15d49d88..3234b1f9c5 100644 --- a/core/src/io/anuke/mindustry/ClientLauncher.java +++ b/core/src/io/anuke/mindustry/ClientLauncher.java @@ -2,6 +2,8 @@ package io.anuke.mindustry; import io.anuke.arc.*; import io.anuke.arc.assets.*; +import io.anuke.arc.assets.loaders.*; +import io.anuke.arc.audio.*; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; @@ -13,6 +15,7 @@ import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.maps.*; +import io.anuke.mindustry.mod.*; import io.anuke.mindustry.net.Net; import static io.anuke.arc.Core.*; @@ -40,9 +43,15 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform batch = new SpriteBatch(); assets = new AssetManager(); assets.setLoader(Texture.class, "." + mapExtension, new MapPreviewLoader()); + + tree = new FileTree(); + assets.setLoader(Sound.class, new SoundLoader(tree)); + assets.setLoader(Music.class, new MusicLoader(tree)); + assets.load("sprites/error.png", Texture.class); atlas = TextureAtlas.blankAtlas(); Vars.net = new Net(platform.getNet()); + mods = new Mods(); UI.loadSystemCursors(); @@ -71,6 +80,8 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform add(netServer = new NetServer()); add(netClient = new NetClient()); + assets.load(mods); + assets.loadRun("contentinit", ContentLoader.class, () -> { content.init(); content.load(); @@ -108,6 +119,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform listener.init(); } super.resize(graphics.getWidth(), graphics.getHeight()); + mods.each(Mod::init); finished = true; Events.fire(new ClientLoadEvent()); } @@ -182,7 +194,7 @@ public abstract class ClientLauncher extends ApplicationCore implements Platform if(assets.getCurrentLoading() != null){ String name = assets.getCurrentLoading().fileName.toLowerCase(); - String key = name.contains("content") ? "content" : name.contains("msav") || name.contains("maps") ? "map" : name.contains("ogg") || name.contains("mp3") ? "sound" : name.contains("png") ? "image" : "system"; + String key = name.contains("content") ? "content" : name.contains("mod") ? "mods" : name.contains("msav") || name.contains("maps") ? "map" : name.contains("ogg") || name.contains("mp3") ? "sound" : name.contains("png") ? "image" : "system"; font.draw(bundle.get("load." + key, ""), graphics.getWidth() / 2f, graphics.getHeight() / 2f - height / 2f - Scl.scl(10f), Align.center); } } diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java index 24807883d1..9b0593cc33 100644 --- a/core/src/io/anuke/mindustry/Vars.java +++ b/core/src/io/anuke/mindustry/Vars.java @@ -18,19 +18,21 @@ import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.input.*; import io.anuke.mindustry.maps.*; +import io.anuke.mindustry.mod.*; import io.anuke.mindustry.net.Net; -import io.anuke.mindustry.plugin.*; import io.anuke.mindustry.world.blocks.defense.ForceProjector.*; import java.nio.charset.*; import java.util.*; -import static io.anuke.arc.Core.settings; +import static io.anuke.arc.Core.*; @SuppressWarnings("unchecked") public class Vars implements Loadable{ /** Whether to load locales.*/ public static boolean loadLocales = true; + /** Maximum number of broken blocks. TODO implement or remove.*/ + public static final int maxBrokenBlocks = 256; /** IO buffer size. */ public static final int bufferSize = 8192; /** global charset, since Android doesn't support the Charsets class */ @@ -43,6 +45,10 @@ public class Vars implements Loadable{ public static final String discordURL = "https://discord.gg/mindustry"; /** URL for sending crash reports to */ public static final String crashReportURL = "http://mins.us.to/report"; + /** URL the links to the wiki's modding guide.*/ + public static final String modGuideURL = "https://mindustrygame.github.io/wiki/modding/"; + /** URL the links to the wiki's modding guide.*/ + 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(/*"mins.us.to"*/); /** maximum distance between mine and core that supports automatic transferring */ @@ -120,8 +126,8 @@ public class Vars implements Loadable{ public static FileHandle tmpDirectory; /** data subdirectory used for saves */ public static FileHandle saveDirectory; - /** data subdirectory used for plugins */ - public static FileHandle pluginDirectory; + /** data subdirectory used for mods */ + public static FileHandle modDirectory; /** map file extension */ public static final String mapExtension = "msav"; /** save file extension */ @@ -130,6 +136,7 @@ public class Vars implements Loadable{ /** list of all locales that can be switched to */ public static Locale[] locales; + public static FileTree tree; public static Net net; public static ContentLoader content; public static GameState state; @@ -138,7 +145,7 @@ public class Vars implements Loadable{ public static DefaultWaves defaultWaves; public static LoopControl loops; public static Platform platform = new Platform(){}; - public static Plugins plugins; + public static Mods mods; public static World world; public static Maps maps; @@ -193,6 +200,9 @@ public class Vars implements Loadable{ Version.init(); + if(tree == null) tree = new FileTree(); + if(mods == null) mods = new Mods(); + content = new ContentLoader(); loops = new LoopControl(); defaultWaves = new DefaultWaves(); @@ -240,15 +250,18 @@ public class Vars implements Loadable{ mapPreviewDirectory = dataDirectory.child("previews/"); saveDirectory = dataDirectory.child("saves/"); tmpDirectory = dataDirectory.child("tmp/"); - pluginDirectory = dataDirectory.child("plugins/"); + modDirectory = dataDirectory.child("mods/"); + modDirectory.mkdirs(); + + mods.load(); maps.load(); } public static void loadSettings(){ Core.settings.setAppName(appName); - if(steam){ + if(steam || "steam".equals(Version.modifier)){ Core.settings.setDataDirectory(Core.files.local("saves/")); } diff --git a/core/src/io/anuke/mindustry/ai/Pathfinder.java b/core/src/io/anuke/mindustry/ai/Pathfinder.java index 104669fd58..03ca073a08 100644 --- a/core/src/io/anuke/mindustry/ai/Pathfinder.java +++ b/core/src/io/anuke/mindustry/ai/Pathfinder.java @@ -6,6 +6,7 @@ import io.anuke.arc.collection.*; import io.anuke.arc.function.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.async.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; @@ -32,7 +33,8 @@ public class Pathfinder implements Runnable{ /** handles task scheduling on the update thread. */ private TaskQueue queue = new TaskQueue(); /** current pathfinding thread */ - private @Nullable Thread thread; + private @Nullable + Thread thread; public Pathfinder(){ Events.on(WorldLoadEvent.class, event -> { @@ -92,7 +94,11 @@ public class Pathfinder implements Runnable{ int x = tile.x, y = tile.y; - tile.getLinkedTiles(t -> tiles[t.x][t.y] = packTile(t)); + tile.getLinkedTiles(t -> { + if(Structs.inBounds(t.x, t.y, tiles)){ + tiles[t.x][t.y] = packTile(t); + } + }); //can't iterate through array so use the map, which should not lead to problems for(PathData[] arr : pathMap){ diff --git a/core/src/io/anuke/mindustry/ai/WaveSpawner.java b/core/src/io/anuke/mindustry/ai/WaveSpawner.java index daf4e7b00a..b4dadcd59a 100644 --- a/core/src/io/anuke/mindustry/ai/WaveSpawner.java +++ b/core/src/io/anuke/mindustry/ai/WaveSpawner.java @@ -48,7 +48,7 @@ public class WaveSpawner{ for(SpawnGroup group : state.rules.spawns){ int spawned = group.getUnitsSpawned(state.wave - 1); - if(group.type.isFlying){ + if(group.type.flying){ float spread = margin / 1.5f; eachFlyerSpawn((spawnX, spawnY) -> { diff --git a/core/src/io/anuke/mindustry/content/Blocks.java b/core/src/io/anuke/mindustry/content/Blocks.java index 8362b3e0b2..573ad8a832 100644 --- a/core/src/io/anuke/mindustry/content/Blocks.java +++ b/core/src/io/anuke/mindustry/content/Blocks.java @@ -781,7 +781,7 @@ public class Blocks implements ContentList{ }}; copperWallLarge = new Wall("copper-wall-large"){{ - requirements(Category.defense, ItemStack.mult(copperWall.buildRequirements, 4)); + requirements(Category.defense, ItemStack.mult(copperWall.requirements, 4)); health = 80 * 4 * wallHealthMultiplier; size = 2; }}; @@ -792,7 +792,7 @@ public class Blocks implements ContentList{ }}; titaniumWallLarge = new Wall("titanium-wall-large"){{ - requirements(Category.defense, ItemStack.mult(titaniumWall.buildRequirements, 4)); + requirements(Category.defense, ItemStack.mult(titaniumWall.requirements, 4)); health = 110 * wallHealthMultiplier * 4; size = 2; }}; @@ -803,7 +803,7 @@ public class Blocks implements ContentList{ }}; thoriumWallLarge = new Wall("thorium-wall-large"){{ - requirements(Category.defense, ItemStack.mult(thoriumWall.buildRequirements, 4)); + requirements(Category.defense, ItemStack.mult(thoriumWall.requirements, 4)); health = 200 * wallHealthMultiplier * 4; size = 2; }}; @@ -814,7 +814,7 @@ public class Blocks implements ContentList{ }}; phaseWallLarge = new DeflectorWall("phase-wall-large"){{ - requirements(Category.defense, ItemStack.mult(phaseWall.buildRequirements, 4)); + requirements(Category.defense, ItemStack.mult(phaseWall.requirements, 4)); health = 150 * 4 * wallHealthMultiplier; size = 2; }}; @@ -825,7 +825,7 @@ public class Blocks implements ContentList{ }}; surgeWallLarge = new SurgeWall("surge-wall-large"){{ - requirements(Category.defense, ItemStack.mult(surgeWall.buildRequirements, 4)); + requirements(Category.defense, ItemStack.mult(surgeWall.requirements, 4)); health = 230 * 4 * wallHealthMultiplier; size = 2; }}; @@ -836,7 +836,7 @@ public class Blocks implements ContentList{ }}; doorLarge = new Door("door-large"){{ - requirements(Category.defense, ItemStack.mult(door.buildRequirements, 4)); + requirements(Category.defense, ItemStack.mult(door.requirements, 4)); openfx = Fx.dooropenlarge; closefx = Fx.doorcloselarge; health = 100 * 4 * wallHealthMultiplier; @@ -1315,7 +1315,8 @@ public class Blocks implements ContentList{ requirements(Category.turret, ItemStack.with(Items.copper, 85, Items.lead, 45)); ammo( Items.scrap, Bullets.flakScrap, - Items.lead, Bullets.flakLead + Items.lead, Bullets.flakLead, + Items.metaglass, Bullets.flakGlass ); reload = 18f; range = 170f; @@ -1558,6 +1559,7 @@ public class Blocks implements ContentList{ cyclone = new ItemTurret("cyclone"){{ requirements(Category.turret, ItemStack.with(Items.copper, 200, Items.titanium, 125, Items.plastanium, 80)); ammo( + Items.metaglass, Bullets.flakGlass, Items.blastCompound, Bullets.flakExplosive, Items.plastanium, Bullets.flakPlastic, Items.surgealloy, Bullets.flakSurge @@ -1631,28 +1633,28 @@ public class Blocks implements ContentList{ produceTime = 2500; size = 2; maxSpawn = 1; - consumes.power(1.1f); + consumes.power(1.2f); consumes.items(); }}; spiritFactory = new UnitFactory("spirit-factory"){{ requirements(Category.units, ItemStack.with(Items.metaglass, 45, Items.lead, 55, Items.silicon, 45)); type = UnitTypes.spirit; - produceTime = 3500; + produceTime = 4000; size = 2; - maxSpawn = 2; - consumes.power(0.80f); - consumes.items(new ItemStack(Items.silicon, 15), new ItemStack(Items.lead, 15)); + maxSpawn = 1; + consumes.power(1.2f); + consumes.items(new ItemStack(Items.silicon, 30), new ItemStack(Items.lead, 30)); }}; phantomFactory = new UnitFactory("phantom-factory"){{ - requirements(Category.units, ItemStack.with(Items.titanium, 45, Items.thorium, 40, Items.lead, 55, Items.silicon, 105)); + requirements(Category.units, ItemStack.with(Items.titanium, 50, Items.thorium, 60, Items.lead, 65, Items.silicon, 105)); type = UnitTypes.phantom; - produceTime = 3650; + produceTime = 4400; size = 2; - maxSpawn = 2; - consumes.power(2f); - consumes.items(new ItemStack(Items.silicon, 30), new ItemStack(Items.lead, 20), new ItemStack(Items.titanium, 10)); + maxSpawn = 1; + consumes.power(2.5f); + consumes.items(new ItemStack(Items.silicon, 50), new ItemStack(Items.lead, 30), new ItemStack(Items.titanium, 20)); }}; commandCenter = new CommandCenter("command-center"){{ diff --git a/core/src/io/anuke/mindustry/content/Bullets.java b/core/src/io/anuke/mindustry/content/Bullets.java index dad4758000..ac18c8a2b0 100644 --- a/core/src/io/anuke/mindustry/content/Bullets.java +++ b/core/src/io/anuke/mindustry/content/Bullets.java @@ -8,11 +8,9 @@ import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.game.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.*; import static io.anuke.mindustry.Vars.*; @@ -23,7 +21,7 @@ public class Bullets implements ContentList{ artilleryDense, arilleryPlastic, artilleryPlasticFrag, artilleryHoming, artlleryIncendiary, artilleryExplosive, artilleryUnit, //flak - flakScrap, flakLead, flakPlastic, flakExplosive, flakSurge, + flakScrap, flakLead, flakPlastic, flakExplosive, flakSurge, flakGlass, glassFrag, //missiles missileExplosive, missileIncendiary, missileSurge, missileJavelin, missileSwarm, missileRevenant, @@ -39,7 +37,7 @@ public class Bullets implements ContentList{ waterShot, cryoShot, slagShot, oilShot, //environment, misc. - fireball, basicFlame, pyraFlame, driverBolt, healBullet, frag, eruptorShot, + fireball, basicFlame, pyraFlame, driverBolt, healBullet, healBulletBig, frag, eruptorShot, //bombs bombExplosive, bombIncendiary, bombOil; @@ -57,7 +55,7 @@ public class Bullets implements ContentList{ splashDamage = 33f; }}; - artilleryPlasticFrag = new BasicBulletType(2.5f, 7, "bullet"){{ + artilleryPlasticFrag = new BasicBulletType(2.5f, 10, "bullet"){{ bulletWidth = 10f; bulletHeight = 12f; bulletShrink = 1f; @@ -134,6 +132,16 @@ public class Bullets implements ContentList{ frontColor = Pal.bulletYellow; }}; + glassFrag = new BasicBulletType(3f, 6, "bullet"){{ + bulletWidth = 5f; + bulletHeight = 12f; + bulletShrink = 1f; + lifetime = 20f; + backColor = Pal.gray; + frontColor = Color.white; + despawnEffect = Fx.none; + }}; + flakLead = new FlakBulletType(4.2f, 3){{ lifetime = 60f; ammoMultiplier = 4f; @@ -157,8 +165,23 @@ public class Bullets implements ContentList{ splashDamageRadius = 24f; }}; + flakGlass = new FlakBulletType(4f, 3){{ + lifetime = 70f; + ammoMultiplier = 5f; + shootEffect = Fx.shootSmall; + reloadMultiplier = 0.8f; + bulletWidth = 6f; + bulletHeight = 8f; + hitEffect = Fx.flakExplosion; + splashDamage = 30f; + splashDamageRadius = 26f; + fragBullet = glassFrag; + fragBullets = 6; + }}; + flakPlastic = new FlakBulletType(4f, 6){{ splashDamageRadius = 50f; + splashDamage = 25f; fragBullet = artilleryPlasticFrag; fragBullets = 6; hitEffect = Fx.plasticExplosion; @@ -376,43 +399,13 @@ public class Bullets implements ContentList{ statusDuration = 10f; }}; - healBullet = new BulletType(5.2f, 13){ - float healPercent = 3f; + healBullet = new HealBulletType(5.2f, 13){{ + healPercent = 3f; + }}; - { - shootEffect = Fx.shootHeal; - smokeEffect = Fx.hitLaser; - hitEffect = Fx.hitLaser; - despawnEffect = Fx.hitLaser; - collidesTeam = true; - } - - @Override - public boolean collides(Bullet b, Tile tile){ - return tile.getTeam() != b.getTeam() || tile.entity.healthf() < 1f; - } - - @Override - public void draw(Bullet b){ - Draw.color(Pal.heal); - Lines.stroke(2f); - Lines.lineAngleCenter(b.x, b.y, b.rot(), 7f); - Draw.color(Color.white); - Lines.lineAngleCenter(b.x, b.y, b.rot(), 3f); - Draw.reset(); - } - - @Override - public void hitTile(Bullet b, Tile tile){ - super.hit(b); - tile = tile.link(); - - if(tile.entity != null && tile.getTeam() == b.getTeam() && !(tile.block() instanceof BuildBlock)){ - Effects.effect(Fx.healBlockFull, Pal.heal, tile.drawx(), tile.drawy(), tile.block().size); - tile.entity.healBy(healPercent / 100f * tile.entity.maxHealth()); - } - } - }; + healBulletBig = new HealBulletType(5.2f, 15){{ + healPercent = 5.5f; + }}; fireball = new BulletType(1f, 4){ { diff --git a/core/src/io/anuke/mindustry/content/Fx.java b/core/src/io/anuke/mindustry/content/Fx.java index a507f62261..47efe39e66 100644 --- a/core/src/io/anuke/mindustry/content/Fx.java +++ b/core/src/io/anuke/mindustry/content/Fx.java @@ -11,7 +11,6 @@ import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.type.Item.*; import static io.anuke.mindustry.Vars.tilesize; @@ -552,7 +551,7 @@ public class Fx implements ContentList{ float length = 20f * e.finpow(); float size = 7f * e.fout(); - Draw.rect(((Item)e.data).icon(Icon.large), e.x + Angles.trnsx(e.rotation, length), e.y + Angles.trnsy(e.rotation, length), size, size); + Draw.rect(((Item)e.data).icon(Cicon.medium), e.x + Angles.trnsx(e.rotation, length), e.y + Angles.trnsy(e.rotation, length), size, size); }); diff --git a/core/src/io/anuke/mindustry/content/Mechs.java b/core/src/io/anuke/mindustry/content/Mechs.java index 57dcf5afd3..b9dd4c80c9 100644 --- a/core/src/io/anuke/mindustry/content/Mechs.java +++ b/core/src/io/anuke/mindustry/content/Mechs.java @@ -220,7 +220,7 @@ public class Mechs implements ContentList{ dart = new Mech("dart-ship", true){ { drillPower = 1; - mineSpeed = 0.9f; + mineSpeed = 3f; speed = 0.5f; drag = 0.09f; health = 200f; diff --git a/core/src/io/anuke/mindustry/content/TechTree.java b/core/src/io/anuke/mindustry/content/TechTree.java index 7e5f7411bc..090257f468 100644 --- a/core/src/io/anuke/mindustry/content/TechTree.java +++ b/core/src/io/anuke/mindustry/content/TechTree.java @@ -13,6 +13,7 @@ public class TechTree implements ContentList{ @Override public void load(){ + TechNode.context = null; all = new Array<>(); root = node(coreShard, () -> { @@ -302,19 +303,24 @@ public class TechTree implements ContentList{ }); } - private TechNode node(Block block, Runnable children){ - ItemStack[] requirements = new ItemStack[block.buildRequirements.length]; + private static TechNode node(Block block, Runnable children){ + ItemStack[] requirements = new ItemStack[block.requirements.length]; for(int i = 0; i < requirements.length; i++){ - requirements[i] = new ItemStack(block.buildRequirements[i].item, 30 + block.buildRequirements[i].amount * 6); + requirements[i] = new ItemStack(block.requirements[i].item, 30 + block.requirements[i].amount * 6); } return new TechNode(block, requirements, children); } - private TechNode node(Block block){ + private static TechNode node(Block block){ return node(block, () -> {}); } + public static void create(Block parent, Block block){ + TechNode.context = all.find(t -> t.block == parent); + node(block, () -> {}); + } + public static class TechNode{ static TechNode context; @@ -322,19 +328,22 @@ public class TechTree implements ContentList{ public final ItemStack[] requirements; public final Array children = new Array<>(); - TechNode(Block block, ItemStack[] requirements, Runnable children){ - if(context != null){ - context.children.add(this); + TechNode(TechNode ccontext, Block block, ItemStack[] requirements, Runnable children){ + if(ccontext != null){ + ccontext.children.add(this); } this.block = block; this.requirements = requirements; - TechNode last = context; context = this; children.run(); - context = last; + context = ccontext; all.add(this); } + + TechNode(Block block, ItemStack[] requirements, Runnable children){ + this(context, block, requirements, children); + } } } diff --git a/core/src/io/anuke/mindustry/content/UnitTypes.java b/core/src/io/anuke/mindustry/content/UnitTypes.java index 6c4e54398f..f632fcee19 100644 --- a/core/src/io/anuke/mindustry/content/UnitTypes.java +++ b/core/src/io/anuke/mindustry/content/UnitTypes.java @@ -17,8 +17,8 @@ public class UnitTypes implements ContentList{ @Override public void load(){ - draug = new UnitType("draug", Draug.class, Draug::new){{ - isFlying = true; + draug = new UnitType("draug", Draug::new){{ + flying = true; drag = 0.01f; speed = 0.3f; maxVelocity = 1.2f; @@ -32,13 +32,13 @@ public class UnitTypes implements ContentList{ }}; }}; - spirit = new UnitType("spirit", Spirit.class, Spirit::new){{ - isFlying = true; + spirit = new UnitType("spirit", Spirit::new){{ + flying = true; drag = 0.01f; - speed = 0.4f; + speed = 0.42f; maxVelocity = 1.6f; range = 50f; - health = 60; + health = 100; engineSize = 1.8f; engineOffset = 5.7f; weapon = new Weapon("heal-blaster"){{ @@ -48,22 +48,21 @@ public class UnitTypes implements ContentList{ roundrobin = true; ejectEffect = Fx.none; recoil = 2f; - bullet = Bullets.healBullet; + bullet = Bullets.healBulletBig; shootSound = Sounds.pew; }}; }}; - phantom = new UnitType("phantom", Phantom.class, Phantom::new){{ - isFlying = true; + phantom = new UnitType("phantom", Phantom::new){{ + flying = true; drag = 0.01f; mass = 2f; speed = 0.45f; maxVelocity = 1.9f; range = 70f; itemCapacity = 70; - health = 220; - buildPower = 0.9f; - minePower = 1.1f; + health = 400; + buildPower = 1f; engineOffset = 6.5f; toMine = ObjectSet.with(Items.lead, Items.copper, Items.titanium); weapon = new Weapon("heal-blaster"){{ @@ -77,7 +76,7 @@ public class UnitTypes implements ContentList{ }}; }}; - dagger = new UnitType("dagger", Dagger.class, Dagger::new){{ + dagger = new UnitType("dagger", Dagger::new){{ maxVelocity = 1.1f; speed = 0.2f; drag = 0.4f; @@ -93,7 +92,7 @@ public class UnitTypes implements ContentList{ }}; }}; - crawler = new UnitType("crawler", Crawler.class, Crawler::new){{ + crawler = new UnitType("crawler", Crawler::new){{ maxVelocity = 1.27f; speed = 0.285f; drag = 0.4f; @@ -124,7 +123,7 @@ public class UnitTypes implements ContentList{ }}; }}; - titan = new UnitType("titan", Titan.class, Titan::new){{ + titan = new UnitType("titan", Titan::new){{ maxVelocity = 0.8f; speed = 0.22f; drag = 0.4f; @@ -146,7 +145,7 @@ public class UnitTypes implements ContentList{ }}; }}; - fortress = new UnitType("fortress", Fortress.class, Fortress::new){{ + fortress = new UnitType("fortress", Fortress::new){{ maxVelocity = 0.78f; speed = 0.15f; drag = 0.4f; @@ -168,7 +167,7 @@ public class UnitTypes implements ContentList{ }}; }}; - eruptor = new UnitType("eruptor", Eruptor.class, Eruptor::new){{ + eruptor = new UnitType("eruptor", Eruptor::new){{ maxVelocity = 0.81f; speed = 0.16f; drag = 0.4f; @@ -190,7 +189,7 @@ public class UnitTypes implements ContentList{ }}; }}; - chaosArray = new UnitType("chaos-array", Dagger.class, Dagger::new){{ + chaosArray = new UnitType("chaos-array", Dagger::new){{ maxVelocity = 0.68f; speed = 0.12f; drag = 0.4f; @@ -214,7 +213,7 @@ public class UnitTypes implements ContentList{ }}; }}; - eradicator = new UnitType("eradicator", Dagger.class, Dagger::new){{ + eradicator = new UnitType("eradicator", Dagger::new){{ maxVelocity = 0.68f; speed = 0.12f; drag = 0.4f; @@ -239,12 +238,12 @@ public class UnitTypes implements ContentList{ }}; }}; - wraith = new UnitType("wraith", Wraith.class, Wraith::new){{ + wraith = new UnitType("wraith", Wraith::new){{ speed = 0.3f; maxVelocity = 1.9f; drag = 0.01f; mass = 1.5f; - isFlying = true; + flying = true; health = 75; engineOffset = 5.5f; range = 140f; @@ -258,13 +257,13 @@ public class UnitTypes implements ContentList{ }}; }}; - ghoul = new UnitType("ghoul", Ghoul.class, Ghoul::new){{ + ghoul = new UnitType("ghoul", Ghoul::new){{ health = 220; speed = 0.2f; maxVelocity = 1.4f; mass = 3f; drag = 0.01f; - isFlying = true; + flying = true; targetAir = false; engineOffset = 7.8f; range = 140f; @@ -282,7 +281,7 @@ public class UnitTypes implements ContentList{ }}; }}; - revenant = new UnitType("revenant", Revenant.class, Revenant::new){{ + revenant = new UnitType("revenant", Revenant::new){{ health = 1000; mass = 5f; hitsize = 20f; @@ -291,7 +290,7 @@ public class UnitTypes implements ContentList{ drag = 0.01f; range = 80f; shootCone = 40f; - isFlying = true; + flying = true; rotateWeapon = true; engineOffset = 12f; engineSize = 3f; @@ -313,7 +312,7 @@ public class UnitTypes implements ContentList{ }}; }}; - lich = new UnitType("lich", Revenant.class, Revenant::new){{ + lich = new UnitType("lich", Revenant::new){{ health = 6000; mass = 20f; hitsize = 40f; @@ -322,7 +321,7 @@ public class UnitTypes implements ContentList{ drag = 0.02f; range = 80f; shootCone = 20f; - isFlying = true; + flying = true; rotateWeapon = true; engineOffset = 21; engineSize = 5.3f; @@ -346,7 +345,7 @@ public class UnitTypes implements ContentList{ }}; }}; - reaper = new UnitType("reaper", Revenant.class, Revenant::new){{ + reaper = new UnitType("reaper", Revenant::new){{ health = 11000; mass = 30f; hitsize = 56f; @@ -355,7 +354,7 @@ public class UnitTypes implements ContentList{ drag = 0.02f; range = 80f; shootCone = 30f; - isFlying = true; + flying = true; rotateWeapon = true; engineOffset = 40; engineSize = 7.3f; diff --git a/core/src/io/anuke/mindustry/core/ContentLoader.java b/core/src/io/anuke/mindustry/core/ContentLoader.java index a919233c2e..77ed6f219f 100644 --- a/core/src/io/anuke/mindustry/core/ContentLoader.java +++ b/core/src/io/anuke/mindustry/core/ContentLoader.java @@ -11,6 +11,7 @@ import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import static io.anuke.arc.Core.files; +import static io.anuke.mindustry.Vars.mods; /** * Loads all game content. @@ -41,6 +42,14 @@ public class ContentLoader{ new LegacyColorMapper(), }; + /** Clears all initialized content.*/ + public void clear(){ + contentNameMap = new ObjectMap[ContentType.values().length]; + contentMap = new Array[ContentType.values().length]; + initialization = new ObjectSet<>(); + loaded = false; + } + /** Creates all content types. */ public void createContent(){ if(loaded){ @@ -57,20 +66,11 @@ public class ContentLoader{ list.load(); } - for(ContentType type : ContentType.values()){ - - for(Content c : contentMap[type.ordinal()]){ - if(c instanceof MappableContent){ - String name = ((MappableContent)c).name; - if(contentNameMap[type.ordinal()].containsKey(name)){ - throw new IllegalArgumentException("Two content objects cannot have the same name! (issue: '" + name + "')"); - } - contentNameMap[type.ordinal()].put(name, (MappableContent)c); - } - } + if(mods != null){ + mods.loadContent(); } - //set up ID mapping + //check up ID mapping, make sure it's linear for(Array arr : contentMap){ for(int i = 0; i < arr.size; i++){ int id = arr.get(i).id; @@ -109,6 +109,7 @@ public class ContentLoader{ for(ContentType type : ContentType.values()){ for(Content content : contentMap[type.ordinal()]){ + //TODO catch error and display it per mod callable.accept(content); } } @@ -138,6 +139,14 @@ public class ContentLoader{ public void handleContent(Content content){ contentMap[content.getContentType().ordinal()].add(content); + + } + + public void handleMappableContent(MappableContent content){ + if(contentNameMap[content.getContentType().ordinal()].containsKey(content.name)){ + throw new IllegalArgumentException("Two content objects cannot have the same name! (issue: '" + content.name + "')"); + } + contentNameMap[content.getContentType().ordinal()].put(content.name, content); } public void setTemporaryMapper(MappableContent[][] temporaryMapper){ diff --git a/core/src/io/anuke/mindustry/core/Control.java b/core/src/io/anuke/mindustry/core/Control.java index 75519d1d08..771dbba8d4 100644 --- a/core/src/io/anuke/mindustry/core/Control.java +++ b/core/src/io/anuke/mindustry/core/Control.java @@ -91,6 +91,7 @@ public class Control implements ApplicationListener, Loadable{ hiscore = true; world.getMap().setHighScore(state.wave); } + Sounds.wave.play(); }); @@ -388,7 +389,10 @@ public class Control implements ApplicationListener, Loadable{ saves.update(); //update and load any requested assets - assets.update(); + try{ + assets.update(); + }catch(Exception ignored){ + } input.updateState(); diff --git a/core/src/io/anuke/mindustry/core/FileTree.java b/core/src/io/anuke/mindustry/core/FileTree.java new file mode 100644 index 0000000000..e6d7e78086 --- /dev/null +++ b/core/src/io/anuke/mindustry/core/FileTree.java @@ -0,0 +1,34 @@ +package io.anuke.mindustry.core; + +import io.anuke.arc.*; +import io.anuke.arc.assets.loaders.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.files.*; + +/** Handles files in a modded context. */ +public class FileTree implements FileHandleResolver{ + private ObjectMap files = new ObjectMap<>(); + + public void addFile(String path, FileHandle f){ + files.put(path, f); + } + + /** Gets an asset file.*/ + public FileHandle get(String path){ + if(files.containsKey(path)){ + return files.get(path); + }else{ + return Core.files.internal(path); + } + } + + /** Clears all mod files.*/ + public void clear(){ + files.clear(); + } + + @Override + public FileHandle resolve(String fileName){ + return get(fileName); + } +} diff --git a/core/src/io/anuke/mindustry/core/Logic.java b/core/src/io/anuke/mindustry/core/Logic.java index 5e4b37ba38..c0544f70bf 100644 --- a/core/src/io/anuke/mindustry/core/Logic.java +++ b/core/src/io/anuke/mindustry/core/Logic.java @@ -16,6 +16,7 @@ import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.blocks.BuildBlock.*; +import io.anuke.mindustry.world.blocks.power.*; import static io.anuke.mindustry.Vars.*; @@ -31,19 +32,24 @@ public class Logic implements ApplicationListener{ public Logic(){ Events.on(WaveEvent.class, event -> { + for(Player p : playerGroup.all()){ + p.respawns = state.rules.respawns; + } + if(world.isZone()){ world.getZone().updateWave(state.wave); } - for (Player p : playerGroup.all()) { - p.respawns = state.rules.respawns; - } }); Events.on(BlockDestroyEvent.class, event -> { //blocks that get broken are appended to the team's broken block queue Tile tile = event.tile; Block block = tile.block(); + //skip null entities or nukes, for obvious reasons + if(tile.entity == null || tile.block() instanceof NuclearReactor) return; + if(block instanceof BuildBlock){ + BuildEntity entity = tile.entity(); //update block to reflect the fact that something was being constructed @@ -56,7 +62,33 @@ public class Logic implements ApplicationListener{ } TeamData data = state.teams.get(tile.getTeam()); - data.brokenBlocks.addFirst(BrokenBlock.get(tile.x, tile.y, tile.rotation(), block.id)); + + //remove existing blocks that have been placed here. + //painful O(n) iteration + copy + for(int i = 0; i < data.brokenBlocks.size; i++){ + BrokenBlock b = data.brokenBlocks.get(i); + if(b.x == tile.x && b.y == tile.y){ + data.brokenBlocks.removeIndex(i); + break; + } + } + + data.brokenBlocks.addFirst(new BrokenBlock(tile.x, tile.y, tile.rotation(), block.id, tile.entity.config())); + }); + + Events.on(BlockBuildEndEvent.class, event -> { + if(!event.breaking){ + TeamData data = state.teams.get(event.team); + + //painful O(n) iteration + copy + for(int i = 0; i < data.brokenBlocks.size; i++){ + BrokenBlock b = data.brokenBlocks.get(i); + if(b.x == event.tile.x && b.y == event.tile.y){ + data.brokenBlocks.removeIndex(i); + break; + } + } + } }); } diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java index 619ebcbe94..911bb4ada4 100644 --- a/core/src/io/anuke/mindustry/core/NetClient.java +++ b/core/src/io/anuke/mindustry/core/NetClient.java @@ -76,6 +76,7 @@ public class NetClient implements ApplicationListener{ ConnectPacket c = new ConnectPacket(); c.name = player.name; + c.mods = mods.getModStrings(); c.mobile = mobile; c.versionType = Version.type; c.color = Color.rgba8888(player.color); @@ -235,7 +236,7 @@ public class NetClient implements ApplicationListener{ netClient.disconnectQuietly(); state.set(State.menu); logic.reset(); - ui.showText("$disconnect", reason); + ui.showText("$disconnect", reason, Align.left); ui.loadfrag.hide(); } @@ -329,6 +330,11 @@ public class NetClient implements ApplicationListener{ @Remote(variants = Variant.one, priority = PacketPriority.low, unreliable = true) public static void onStateSnapshot(float waveTime, int wave, int enemies, short coreDataLen, byte[] coreData){ try{ + if(wave > state.wave){ + state.wave = wave; + Events.fire(new WaveEvent()); + } + state.wavetime = waveTime; state.wave = wave; state.enemies = enemies; diff --git a/core/src/io/anuke/mindustry/core/NetServer.java b/core/src/io/anuke/mindustry/core/NetServer.java index cc65655b88..f5cc0f873a 100644 --- a/core/src/io/anuke/mindustry/core/NetServer.java +++ b/core/src/io/anuke/mindustry/core/NetServer.java @@ -104,6 +104,23 @@ public class NetServer implements ApplicationListener{ return; } + Array extraMods = packet.mods.copy(); + Array missingMods = mods.getIncompatibility(extraMods); + + if(!extraMods.isEmpty() || !missingMods.isEmpty()){ + //can't easily be localized since kick reasons can't have formatted text with them + StringBuilder result = new StringBuilder("[accent]Incompatible mods![]\n\n"); + if(!missingMods.isEmpty()){ + result.append("Missing:[lightgray]\n").append("> ").append(missingMods.toString("\n> ")); + result.append("[]\n"); + } + + if(!extraMods.isEmpty()){ + result.append("Unnecessary mods:[lightgray]\n").append("> ").append(extraMods.toString("\n> ")); + } + con.kick(result.toString()); + } + if(!admins.isWhitelisted(packet.uuid, packet.usid)){ info.adminUsid = packet.usid; info.lastName = packet.name; @@ -200,6 +217,11 @@ public class NetServer implements ApplicationListener{ registerCommands(); } + @Override + public void init(){ + mods.each(mod -> mod.registerClientCommands(clientCommands)); + } + private void registerCommands(){ clientCommands.register("help", "[page]", "Lists all commands.", (args, player) -> { if(args.length > 0 && !Strings.canParseInt(args[0])){ @@ -262,7 +284,7 @@ public class NetServer implements ApplicationListener{ } boolean checkPass(){ - if(votes >= votesRequired() && target.isAdded() && target.con.isConnected()){ + if(votes >= votesRequired()){ Call.sendMessage(Strings.format("[orange]Vote passed.[scarlet] {0}[orange] will be banned from the server for {1} minutes.", target.name, (kickDuration/60))); target.getInfo().lastKicked = Time.millis() + kickDuration*1000; playerGroup.all().each(p -> p.uuid != null && p.uuid.equals(target.uuid), p -> p.con.kick(KickReason.vote)); diff --git a/core/src/io/anuke/mindustry/core/Platform.java b/core/src/io/anuke/mindustry/core/Platform.java index a689bbbd02..d7aa0ea55d 100644 --- a/core/src/io/anuke/mindustry/core/Platform.java +++ b/core/src/io/anuke/mindustry/core/Platform.java @@ -37,6 +37,10 @@ public interface Platform{ /** Steam: View a map listing on the workshop.*/ default void viewMapListing(String mapid){} + /** Steam: View map workshop info, removing the map ID tag if its listing is deleted. + * Also presents the option to update the map. */ + default void viewMapListingInfo(Map map){} + /** Steam: Open workshop for maps.*/ default void openWorkshop(){} diff --git a/core/src/io/anuke/mindustry/core/Renderer.java b/core/src/io/anuke/mindustry/core/Renderer.java index 2d8ec566a2..5005e4cbe2 100644 --- a/core/src/io/anuke/mindustry/core/Renderer.java +++ b/core/src/io/anuke/mindustry/core/Renderer.java @@ -18,12 +18,10 @@ import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.effect.GroundEffectEntity.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.type.EffectEntity; -import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.input.*; -import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.defense.ForceProjector.*; import static io.anuke.arc.Core.*; @@ -241,6 +239,8 @@ public class Renderer implements ApplicationListener{ blocks.drawBlocks(Layer.block); blocks.drawFog(); + blocks.drawBroken(); + Draw.shader(Shaders.blockbuild, true); blocks.drawBlocks(Layer.placement); Draw.shader(); @@ -311,7 +311,7 @@ public class Renderer implements ApplicationListener{ float fract = landTime / Fx.coreLand.lifetime; TileEntity entity = player.getClosestCore(); - TextureRegion reg = entity.block.icon(Block.Icon.full); + TextureRegion reg = entity.block.icon(Cicon.full); float scl = Scl.scl(4f) / camerascale; float s = reg.getWidth() * Draw.scl * scl * 4f * fract; diff --git a/core/src/io/anuke/mindustry/core/UI.java b/core/src/io/anuke/mindustry/core/UI.java index ca5dafb8ed..5998f90cc7 100644 --- a/core/src/io/anuke/mindustry/core/UI.java +++ b/core/src/io/anuke/mindustry/core/UI.java @@ -68,6 +68,7 @@ public class UI implements ApplicationListener, Loadable{ public DeployDialog deploy; public TechTreeDialog tech; public MinimapDialog minimap; + public ModsDialog mods; public Cursor drillCursor, unloadCursor; @@ -108,6 +109,7 @@ public class UI implements ApplicationListener, Loadable{ ClickListener.clicked = () -> Sounds.press.play(); Colors.put("accent", Pal.accent); + Colors.put("unlaunched", Color.valueOf("8982ed")); Colors.put("highlight", Pal.accent.cpy().lerp(Color.white, 0.3f)); Colors.put("stat", Pal.stat); loadExtraCursors(); @@ -222,6 +224,7 @@ public class UI implements ApplicationListener, Loadable{ deploy = new DeployDialog(); tech = new TechTreeDialog(); minimap = new MinimapDialog(); + mods = new ModsDialog(); Group group = Core.scene.root; @@ -281,7 +284,7 @@ public class UI implements ApplicationListener, Loadable{ new Dialog(titleText){{ cont.margin(30).add(dtext).padRight(6f); TextFieldFilter filter = inumeric ? TextFieldFilter.digitsOnly : (f, c) -> true; - TextField field = cont.addField(def, t -> {}).size(170f, 50f).get(); + TextField field = cont.addField(def, t -> {}).size(330f, 50f).get(); field.setFilter((f, c) -> field.getText().length() < textLength && filter.acceptChar(f, c)); buttons.defaults().size(120, 54).pad(4); buttons.addButton("$ok", () -> { @@ -358,11 +361,15 @@ public class UI implements ApplicationListener, Loadable{ } public void showText(String titleText, String text){ + showText(titleText, text, Align.center); + } + + public void showText(String titleText, String text, int align){ new Dialog(titleText){{ cont.row(); cont.addImage().width(400f).pad(2).colspan(2).height(4f).color(Pal.accent); cont.row(); - cont.add(text).width(400f).wrap().get().setAlignment(Align.center, Align.center); + cont.add(text).width(400f).wrap().get().setAlignment(align, align); cont.row(); buttons.addButton("$ok", this::hide).size(90, 50).pad(4); }}.show(); @@ -410,6 +417,34 @@ public class UI implements ApplicationListener, Loadable{ dialog.show(); } + + public void showCustomConfirm(String title, String text, String yes, String no, Runnable confirmed){ + FloatingDialog dialog = new FloatingDialog(title); + dialog.cont.add(text).width(500f).wrap().pad(4f).get().setAlignment(Align.center, Align.center); + dialog.buttons.defaults().size(200f, 54f).pad(2f); + dialog.setFillParent(false); + dialog.buttons.addButton(no, dialog::hide); + dialog.buttons.addButton(yes, () -> { + dialog.hide(); + confirmed.run(); + }); + dialog.keyDown(KeyCode.ESCAPE, dialog::hide); + dialog.keyDown(KeyCode.BACK, dialog::hide); + dialog.show(); + } + + public void showOkText(String title, String text, Runnable confirmed){ + FloatingDialog dialog = new FloatingDialog(title); + dialog.cont.add(text).width(500f).wrap().pad(4f).get().setAlignment(Align.center, Align.center); + dialog.buttons.defaults().size(200f, 54f).pad(2f); + dialog.setFillParent(false); + dialog.buttons.addButton("$ok", () -> { + dialog.hide(); + confirmed.run(); + }); + dialog.show(); + } + public String formatAmount(int number){ if(number >= 1000000){ return Strings.fixed(number / 1000000f, 1) + "[gray]mil[]"; diff --git a/core/src/io/anuke/mindustry/core/World.java b/core/src/io/anuke/mindustry/core/World.java index 26e0441e8a..4e2806e62d 100644 --- a/core/src/io/anuke/mindustry/core/World.java +++ b/core/src/io/anuke/mindustry/core/World.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.core; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.game.EventType.*; @@ -82,7 +82,8 @@ public class World{ return height()*tilesize; } - public @Nullable Tile tile(int pos){ + public @Nullable + Tile tile(int pos){ return tiles == null ? null : tile(Pos.x(pos), Pos.y(pos)); } diff --git a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java index abf08d50ef..1a5da836bb 100644 --- a/core/src/io/anuke/mindustry/editor/MapEditorDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapEditorDialog.java @@ -15,6 +15,7 @@ import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; @@ -23,7 +24,7 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.maps.*; -import io.anuke.mindustry.ui.Styles; +import io.anuke.mindustry.ui.*; import io.anuke.mindustry.ui.dialogs.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; @@ -147,13 +148,19 @@ public class MapEditorDialog extends Dialog implements Disposable{ if(steam){ menu.cont.addImageTextButton("$editor.publish.workshop", Icon.linkSmall, () -> { - if(editor.getTags().containsKey("steamid")){ + Map builtin = maps.all().find(m -> m.name().equals(editor.getTags().get("name", "").trim())); + if(editor.getTags().containsKey("steamid") && builtin != null && !builtin.custom){ platform.viewMapListing(editor.getTags().get("steamid")); return; } Map map = save(); + if(editor.getTags().containsKey("steamid") && map != null){ + platform.viewMapListingInfo(map); + return; + } + if(map == null) return; if(map.tags.get("description", "").length() < 4){ @@ -167,7 +174,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ } platform.publishMap(map); - }).padTop(-3).size(swidth * 2f + 10, 60f).update(b -> b.setText(editor.getTags().containsKey("steamid") ? "$view.workshop" : "$editor.publish.workshop")); + }).padTop(-3).size(swidth * 2f + 10, 60f).update(b -> b.setText(editor.getTags().containsKey("steamid") ? editor.getTags().get("author").equals(player.name) ? "$workshop.listing" : "$view.workshop" : "$editor.publish.workshop")); menu.cont.row(); } @@ -208,14 +215,6 @@ public class MapEditorDialog extends Dialog implements Disposable{ return; } - Vector2 v = pane.stageToLocalCoordinates(Core.input.mouse()); - - if(v.x >= 0 && v.y >= 0 && v.x <= pane.getWidth() && v.y <= pane.getHeight()){ - Core.scene.setScrollFocus(pane); - }else{ - Core.scene.setScrollFocus(null); - } - if(Core.scene != null && Core.scene.getKeyboardFocus() == this){ doInput(); } @@ -287,7 +286,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ }); } - public Map save(){ + public @Nullable Map save(){ boolean isEditor = state.rules.editor; state.rules.editor = false; String name = editor.getTags().get("name", "").trim(); @@ -681,6 +680,11 @@ public class MapEditorDialog extends Dialog implements Disposable{ pane = new ScrollPane(content); pane.setFadeScrollBars(false); pane.setOverscroll(true, false); + pane.exited(() -> { + if(pane.hasScroll()){ + Core.scene.setScrollFocus(view); + } + }); ButtonGroup group = new ButtonGroup<>(); int i = 0; @@ -698,7 +702,7 @@ public class MapEditorDialog extends Dialog implements Disposable{ }); for(Block block : blocksOut){ - TextureRegion region = block.icon(Block.Icon.medium); + TextureRegion region = block.icon(Cicon.medium); if(!Core.atlas.isFound(region)) continue; diff --git a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java index 7acee240e7..dd1f77811e 100644 --- a/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapGenerateDialog.java @@ -388,7 +388,7 @@ public class MapGenerateDialog extends FloatingDialog{ GenTile tile = buffer1[px][py]; color = MapIO.colorFor(content.block(tile.floor), content.block(tile.block), content.block(tile.ore), Team.derelict); } - pixmap.drawPixel(px, pixmap.getHeight() - 1 - py, color); + pixmap.draw(px, pixmap.getHeight() - 1 - py, color); } } diff --git a/core/src/io/anuke/mindustry/editor/MapInfoDialog.java b/core/src/io/anuke/mindustry/editor/MapInfoDialog.java index 084258120a..b2b942250b 100644 --- a/core/src/io/anuke/mindustry/editor/MapInfoDialog.java +++ b/core/src/io/anuke/mindustry/editor/MapInfoDialog.java @@ -59,18 +59,25 @@ public class MapInfoDialog extends FloatingDialog{ t.row(); t.add("$editor.rules").padRight(8).left(); - t.addButton("$edit", () -> ruleInfo.show(Vars.state.rules, () -> Vars.state.rules = new Rules())).left().width(200f); + t.addButton("$edit", () -> { + ruleInfo.show(Vars.state.rules, () -> Vars.state.rules = new Rules()); + hide(); + }).left().width(200f); t.row(); t.add("$editor.waves").padRight(8).left(); - t.addButton("$edit", waveInfo::show).left().width(200f); + t.addButton("$edit", () -> { + waveInfo.show(); + hide(); + }).left().width(200f); t.row(); t.add("$editor.generation").padRight(8).left(); - t.addButton("$edit", - () -> generate.show(Vars.maps.readFilters(editor.getTags().get("genfilters", "")), - filters -> editor.getTags().put("genfilters", JsonIO.write(filters))) - ).left().width(200f); + t.addButton("$edit", () -> { + generate.show(Vars.maps.readFilters(editor.getTags().get("genfilters", "")), + filters -> editor.getTags().put("genfilters", JsonIO.write(filters))); + hide(); + }).left().width(200f); name.change(); description.change(); diff --git a/core/src/io/anuke/mindustry/editor/MapView.java b/core/src/io/anuke/mindustry/editor/MapView.java index 2e06352e49..c637e9b6f2 100644 --- a/core/src/io/anuke/mindustry/editor/MapView.java +++ b/core/src/io/anuke/mindustry/editor/MapView.java @@ -56,10 +56,16 @@ public class MapView extends Element implements GestureListener{ public boolean mouseMoved(InputEvent event, float x, float y){ mousex = x; mousey = y; + requestScroll(); return false; } + @Override + public void enter(InputEvent event, float x, float y, int pointer, Element fromActor){ + requestScroll(); + } + @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, KeyCode button){ if(pointer != 0){ diff --git a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java index f36a9f759e..aba7fa135d 100644 --- a/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java +++ b/core/src/io/anuke/mindustry/editor/WaveInfoDialog.java @@ -140,7 +140,7 @@ public class WaveInfoDialog extends FloatingDialog{ t.margin(0).defaults().pad(3).padLeft(5f).growX().left(); t.addButton(b -> { b.left(); - b.addImage(group.type.iconRegion).size(30f).padRight(3); + b.addImage(group.type.icon(Cicon.medium)).size(32f).padRight(3); b.add(group.type.localizedName).color(Pal.accent); }, () -> showUpdate(group)).pad(-6f).padBottom(0f); @@ -221,7 +221,7 @@ public class WaveInfoDialog extends FloatingDialog{ for(UnitType type : content.units()){ dialog.cont.addButton(t -> { t.left(); - t.addImage(type.iconRegion).size(40f).padRight(2f); + t.addImage(type.icon(Cicon.medium)).size(40f).padRight(2f); t.add(type.localizedName); }, () -> { lastType = type; @@ -253,7 +253,7 @@ public class WaveInfoDialog extends FloatingDialog{ for(int j = 0; j < spawned.length; j++){ if(spawned[j] > 0){ UnitType type = content.getByID(ContentType.unit, j); - table.addImage(type.iconRegion).size(30f).padRight(4); + table.addImage(type.icon(Cicon.medium)).size(8f * 4f).padRight(4); table.add(spawned[j] + "x").color(Color.lightGray).padRight(6); table.row(); } diff --git a/core/src/io/anuke/mindustry/entities/Units.java b/core/src/io/anuke/mindustry/entities/Units.java index a624282042..af3d3f4fe7 100644 --- a/core/src/io/anuke/mindustry/entities/Units.java +++ b/core/src/io/anuke/mindustry/entities/Units.java @@ -20,6 +20,7 @@ public class Units{ private static float cdist; private static boolean boolResult; + /** @return whether this player can interact with a specific tile. if either of these are null, returns true.*/ public static boolean canInteract(Player player, Tile tile){ return player == null || tile == null || tile.interactable(player.getTeam()); } diff --git a/core/src/io/anuke/mindustry/entities/bullet/HealBulletType.java b/core/src/io/anuke/mindustry/entities/bullet/HealBulletType.java new file mode 100644 index 0000000000..dab576883c --- /dev/null +++ b/core/src/io/anuke/mindustry/entities/bullet/HealBulletType.java @@ -0,0 +1,50 @@ +package io.anuke.mindustry.entities.bullet; + +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; + +public class HealBulletType extends BulletType{ + protected float healPercent = 3f; + + public HealBulletType(float speed, float damage){ + super(speed, damage); + + shootEffect = Fx.shootHeal; + smokeEffect = Fx.hitLaser; + hitEffect = Fx.hitLaser; + despawnEffect = Fx.hitLaser; + collidesTeam = true; + } + + @Override + public boolean collides(Bullet b, Tile tile){ + return tile.getTeam() != b.getTeam() || tile.entity.healthf() < 1f; + } + + @Override + public void draw(Bullet b){ + Draw.color(Pal.heal); + Lines.stroke(2f); + Lines.lineAngleCenter(b.x, b.y, b.rot(), 7f); + Draw.color(Color.white); + Lines.lineAngleCenter(b.x, b.y, b.rot(), 3f); + Draw.reset(); + } + + @Override + public void hitTile(Bullet b, Tile tile){ + super.hit(b); + tile = tile.link(); + + if(tile.entity != null && tile.getTeam() == b.getTeam() && !(tile.block() instanceof BuildBlock)){ + Effects.effect(Fx.healBlockFull, Pal.heal, tile.drawx(), tile.drawy(), tile.block().size); + tile.entity.healBy(healPercent / 100f * tile.entity.maxHealth()); + } + } +} diff --git a/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java b/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java index 69bf90833a..0d8ab641ff 100644 --- a/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java +++ b/core/src/io/anuke/mindustry/entities/effect/ItemTransfer.java @@ -47,10 +47,8 @@ public class ItemTransfer extends TimedEntity implements DrawTrait{ @Remote(called = Loc.server) public static void transferItemTo(Item item, int amount, float x, float y, Tile tile){ if(tile == null || tile.entity == null || tile.entity.items == null) return; - if(!Units.canInteract(player, tile)) return; for(int i = 0; i < Mathf.clamp(amount / 3, 1, 8); i++){ - Time.run(i * 3, () -> create(item, x, y, tile, () -> { - })); + Time.run(i * 3, () -> create(item, x, y, tile, () -> {})); } tile.entity.items.add(item, amount); } diff --git a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java index e9536abbf8..79069ca5b4 100644 --- a/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java +++ b/core/src/io/anuke/mindustry/entities/traits/BuilderTrait.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.entities.traits; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.Queue; import io.anuke.arc.collection.*; @@ -8,6 +7,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.type.*; @@ -104,7 +104,11 @@ public interface BuilderTrait extends Entity, TeamTrait{ if(current.breaking){ entity.deconstruct(unit, core, 1f / entity.buildCost * Time.delta() * getBuildPower(tile) * state.rules.buildSpeedMultiplier); }else{ - entity.construct(unit, core, 1f / entity.buildCost * Time.delta() * getBuildPower(tile) * state.rules.buildSpeedMultiplier); + if(entity.construct(unit, core, 1f / entity.buildCost * Time.delta() * getBuildPower(tile) * state.rules.buildSpeedMultiplier)){ + if(current.hasConfig){ + Call.onTileConfig(null, tile, current.config); + } + } } current.progress = entity.progress; @@ -200,7 +204,8 @@ public interface BuilderTrait extends Entity, TeamTrait{ * Return the build requests currently active, or the one at the top of the queue. * May return null. */ - default @Nullable BuildRequest buildRequest(){ + default @Nullable + BuildRequest buildRequest(){ return buildQueue().size == 0 ? null : buildQueue().first(); } @@ -256,6 +261,8 @@ public interface BuilderTrait extends Entity, TeamTrait{ public final int x, y, rotation; public final Block block; public final boolean breaking; + public boolean hasConfig; + public int config; public float progress; public boolean initialized; @@ -278,6 +285,12 @@ public interface BuilderTrait extends Entity, TeamTrait{ this.breaking = true; } + public BuildRequest configure(int config){ + this.config = config; + this.hasConfig = true; + return this; + } + public Tile tile(){ return world.tile(x, y); } diff --git a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java index 006a679daa..369170e560 100644 --- a/core/src/io/anuke/mindustry/entities/type/BaseUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/BaseUnit.java @@ -6,6 +6,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; @@ -93,7 +94,8 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ } } - public @Nullable Tile getSpawner(){ + public @Nullable + Tile getSpawner(){ return world.tile(spawner); } @@ -234,7 +236,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ @Override public TextureRegion getIconRegion(){ - return type.iconRegion; + return type.icon(Cicon.full); } @Override @@ -263,7 +265,7 @@ public abstract class BaseUnit extends Unit implements ShooterTrait{ @Override public boolean isFlying(){ - return type.isFlying; + return type.flying; } @Override diff --git a/core/src/io/anuke/mindustry/entities/type/Player.java b/core/src/io/anuke/mindustry/entities/type/Player.java index 7f51aed5d1..e262cf5097 100644 --- a/core/src/io/anuke/mindustry/entities/type/Player.java +++ b/core/src/io/anuke/mindustry/entities/type/Player.java @@ -10,6 +10,7 @@ import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; @@ -48,7 +49,8 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ public float baseRotation; public float pointerX, pointerY; public String name = "noname"; - public @Nullable String uuid, usid; + public @Nullable + String uuid, usid; public boolean isAdmin, isTransferring, isShooting, isBoosting, isMobile, isTyping; public float boostHeat, shootHeat, destructTime; public boolean achievedFlight; @@ -158,7 +160,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ @Override public TextureRegion getIconRegion(){ - return mech.iconRegion; + return mech.icon(Cicon.full); } @Override @@ -279,7 +281,7 @@ public class Player extends Unit implements BuilderMinerTrait, ShooterTrait{ public void drawShadow(float offsetX, float offsetY){ float scl = mech.flying ? 1f : boostHeat / 2f; - Draw.rect(mech.iconRegion, x + offsetX * scl, y + offsetY * scl, rotation - 90); + Draw.rect(getIconRegion(), x + offsetX * scl, y + offsetY * scl, rotation - 90); } @Override diff --git a/core/src/io/anuke/mindustry/entities/type/TileEntity.java b/core/src/io/anuke/mindustry/entities/type/TileEntity.java index 30aa8b9cb7..5fa2ea9aae 100644 --- a/core/src/io/anuke/mindustry/entities/type/TileEntity.java +++ b/core/src/io/anuke/mindustry/entities/type/TileEntity.java @@ -7,6 +7,7 @@ import io.anuke.arc.collection.ObjectSet; import io.anuke.arc.math.geom.Point2; import io.anuke.arc.math.geom.Vector2; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.EntityGroup; import io.anuke.mindustry.entities.traits.HealthTrait; import io.anuke.mindustry.entities.traits.TargetTrait; @@ -230,6 +231,11 @@ public class TileEntity extends BaseEntity implements TargetTrait, HealthTrait{ return proximity; } + /** Tile configuration. Defaults to 0. Used for block rebuilding. */ + public int config(){ + return 0; + } + @Override public void removed(){ if(sound != null){ diff --git a/core/src/io/anuke/mindustry/entities/type/Unit.java b/core/src/io/anuke/mindustry/entities/type/Unit.java index 63289f53e1..618c733f3a 100644 --- a/core/src/io/anuke/mindustry/entities/type/Unit.java +++ b/core/src/io/anuke/mindustry/entities/type/Unit.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.entities.type; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; @@ -9,6 +8,7 @@ import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; @@ -216,10 +216,14 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ float cx = x - fsize/2f, cy = y - fsize/2f; for(Team team : Team.all){ - avoid(unitGroups[team.ordinal()].intersect(cx, cy, fsize, fsize)); + if(team != getTeam() || !(this instanceof Player)){ + avoid(unitGroups[team.ordinal()].intersect(cx, cy, fsize, fsize)); + } } - avoid(playerGroup.intersect(cx, cy, fsize, fsize)); + if(!(this instanceof Player)){ + avoid(playerGroup.intersect(cx, cy, fsize, fsize)); + } velocity.add(moveVector.x / mass() * Time.delta(), moveVector.y / mass() * Time.delta()); } @@ -227,7 +231,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ float radScl = 1.5f; for(Unit en : arr){ - if(en.isFlying() != isFlying()) continue; + if(en.isFlying() != isFlying() || (en instanceof Player && en.getTeam() != getTeam())) continue; float dst = dst(en); float scl = Mathf.clamp(1f - dst / (getSize()/(radScl*2f) + en.getSize()/(radScl*2f))); moveVector.add(Tmp.v1.set((x - en.x) * scl, (y - en.y) * scl).limit(0.4f)); @@ -403,7 +407,7 @@ public abstract class Unit extends DestructibleEntity implements SaveTrait, Targ float size = (itemSize + Mathf.absin(Time.time(), 5f, 1f)) * itemtime; Draw.mixcol(Pal.accent, Mathf.absin(Time.time(), 5f, 0.5f)); - Draw.rect(item.item.icon(Item.Icon.large), + Draw.rect(item.item.icon(Cicon.medium), x + Angles.trnsx(rotation + 180f, backTrns), y + Angles.trnsy(rotation + 180f, backTrns), size, size, rotation); diff --git a/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java b/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java index 2821a00832..a6a4d0dbfa 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java +++ b/core/src/io/anuke/mindustry/entities/type/base/BaseDrone.java @@ -2,7 +2,6 @@ package io.anuke.mindustry.entities.type.base; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Geometry; -import io.anuke.mindustry.entities.type.FlyingUnit; import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.world.Tile; import io.anuke.mindustry.world.meta.BlockFlag; diff --git a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java b/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java index 21649dbf07..06a3ceb60d 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java +++ b/core/src/io/anuke/mindustry/entities/type/base/BuilderDrone.java @@ -1,23 +1,19 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.arc.Core; -import io.anuke.arc.Events; -import io.anuke.arc.collection.IntIntMap; -import io.anuke.arc.collection.Queue; -import io.anuke.arc.math.Mathf; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.math.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.entities.EntityGroup; -import io.anuke.mindustry.entities.traits.BuilderTrait; -import io.anuke.mindustry.entities.traits.TargetTrait; +import io.anuke.mindustry.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.units.UnitState; -import io.anuke.mindustry.game.EventType.BuildSelectEvent; -import io.anuke.mindustry.game.Teams.TeamData; -import io.anuke.mindustry.gen.BrokenBlock; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.BuildBlock; -import io.anuke.mindustry.world.blocks.BuildBlock.BuildEntity; +import io.anuke.mindustry.entities.units.*; +import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.game.Teams.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.world.blocks.BuildBlock.*; import java.io.*; @@ -45,7 +41,7 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ BuildEntity entity = (BuildEntity)target; TileEntity core = getClosestCore(); - if(isBuilding() && entity == null && isRebuild()){ + if(isBuilding() && entity == null && canRebuild()){ target = world.tile(buildRequest().x, buildRequest().y); circle(placeDistance * 0.7f); target = null; @@ -100,9 +96,9 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ incDrones(playerTarget); TargetTrait prev = target; target = playerTarget; - float dst = 90f + (id % 4)*30; + float dst = 90f + (id % 10)*3; float tdst = dst(target); - float scale = (Mathf.lerp(1f, 0.77f, 1f - Mathf.clamp((tdst - dst) / dst))); + float scale = (Mathf.lerp(1f, 0.2f, 1f - Mathf.clamp((tdst - dst) / dst))); circle(dst); velocity.scl(scale); target = prev; @@ -151,9 +147,8 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ } } - boolean isRebuild(){ - //disabled until further notice, reason being that it's too annoying when playing enemies and too broken for ally use - return false; //Vars.state.rules.enemyCheat && team == waveTeam; + boolean canRebuild(){ + return true; } @Override @@ -188,13 +183,14 @@ public class BuilderDrone extends BaseDrone implements BuilderTrait{ } } - if(isRebuild() && !isBuilding()){ + if(timer.get(timerTarget, 80) && Units.closestEnemy(getTeam(), x, y, 100f, u -> !(u instanceof BaseDrone)) == null && !isBuilding()){ TeamData data = Vars.state.teams.get(team); if(!data.brokenBlocks.isEmpty()){ - long block = data.brokenBlocks.removeLast(); - - placeQueue.addFirst(new BuildRequest(BrokenBlock.x(block), BrokenBlock.y(block), BrokenBlock.rotation(block), content.block(BrokenBlock.block(block)))); - setState(build); + BrokenBlock block = data.brokenBlocks.removeLast(); + if(Build.validPlace(getTeam(), block.x, block.y, content.block(block.block), block.rotation)){ + placeQueue.addFirst(new BuildRequest(block.x, block.y, block.rotation, content.block(block.block)).configure(block.config)); + setState(build); + } } } } diff --git a/core/src/io/anuke/mindustry/entities/type/base/Crawler.java b/core/src/io/anuke/mindustry/entities/type/base/Crawler.java index f3c12c9604..44da8bea5f 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Crawler.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Crawler.java @@ -1,6 +1,4 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.GroundUnit; - public class Crawler extends GroundUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/base/Dagger.java b/core/src/io/anuke/mindustry/entities/type/base/Dagger.java index 13bf6021c9..09a39daaa7 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Dagger.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Dagger.java @@ -1,7 +1,5 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.GroundUnit; - public class Dagger extends GroundUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java b/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java index dfbfe9db39..4c86371811 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Eruptor.java @@ -1,6 +1,4 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.GroundUnit; - public class Eruptor extends GroundUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java b/core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java similarity index 96% rename from core/src/io/anuke/mindustry/entities/type/FlyingUnit.java rename to core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java index 4b67274cb4..8a7e04dbcf 100644 --- a/core/src/io/anuke/mindustry/entities/type/FlyingUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/base/FlyingUnit.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.type; +package io.anuke.mindustry.entities.type.base; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; @@ -8,6 +8,7 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.world.*; @@ -15,7 +16,7 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.*; -public abstract class FlyingUnit extends BaseUnit{ +public class FlyingUnit extends BaseUnit{ protected float[] weaponAngles = {0,0}; protected final UnitState @@ -36,6 +37,10 @@ public abstract class FlyingUnit extends BaseUnit{ if(target == null) targetClosestEnemyFlag(BlockFlag.producer); if(target == null) targetClosestEnemyFlag(BlockFlag.turret); + + if(target == null && isCommanded() && getCommand() != UnitCommand.attack){ + onCommand(getCommand()); + } } if(getClosestSpawner() == null && getSpawner() != null && target == null){ diff --git a/core/src/io/anuke/mindustry/entities/type/base/Fortress.java b/core/src/io/anuke/mindustry/entities/type/base/Fortress.java index 992948fa79..c4f36dba69 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Fortress.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Fortress.java @@ -1,6 +1,4 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.GroundUnit; - public class Fortress extends GroundUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java b/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java index bc1f6a5317..0c4294645a 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Ghoul.java @@ -1,7 +1,5 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.FlyingUnit; - public class Ghoul extends FlyingUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/GroundUnit.java b/core/src/io/anuke/mindustry/entities/type/base/GroundUnit.java similarity index 98% rename from core/src/io/anuke/mindustry/entities/type/GroundUnit.java rename to core/src/io/anuke/mindustry/entities/type/base/GroundUnit.java index ddb33a2662..c35c6c1528 100644 --- a/core/src/io/anuke/mindustry/entities/type/GroundUnit.java +++ b/core/src/io/anuke/mindustry/entities/type/base/GroundUnit.java @@ -1,4 +1,4 @@ -package io.anuke.mindustry.entities.type; +package io.anuke.mindustry.entities.type.base; import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; @@ -9,6 +9,7 @@ import io.anuke.mindustry.*; import io.anuke.mindustry.ai.Pathfinder.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.units.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; @@ -18,7 +19,7 @@ import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.*; -public abstract class GroundUnit extends BaseUnit{ +public class GroundUnit extends BaseUnit{ protected static Vector2 vec = new Vector2(); protected float walkTime; diff --git a/core/src/io/anuke/mindustry/entities/type/base/Revenant.java b/core/src/io/anuke/mindustry/entities/type/base/Revenant.java index 03233dbb5d..393c134891 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Revenant.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Revenant.java @@ -4,7 +4,6 @@ import io.anuke.arc.graphics.g2d.Draw; import io.anuke.arc.math.Angles; import io.anuke.arc.math.Mathf; import io.anuke.mindustry.entities.Units; -import io.anuke.mindustry.entities.type.FlyingUnit; public class Revenant extends FlyingUnit{ diff --git a/core/src/io/anuke/mindustry/entities/type/base/Titan.java b/core/src/io/anuke/mindustry/entities/type/base/Titan.java index 1ac30593ac..9324d4d215 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Titan.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Titan.java @@ -1,7 +1,5 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.GroundUnit; - public class Titan extends GroundUnit{ } diff --git a/core/src/io/anuke/mindustry/entities/type/base/Wraith.java b/core/src/io/anuke/mindustry/entities/type/base/Wraith.java index 9123ffcb8d..c8923e309f 100644 --- a/core/src/io/anuke/mindustry/entities/type/base/Wraith.java +++ b/core/src/io/anuke/mindustry/entities/type/base/Wraith.java @@ -1,7 +1,5 @@ package io.anuke.mindustry.entities.type.base; -import io.anuke.mindustry.entities.type.FlyingUnit; - public class Wraith extends FlyingUnit{ } diff --git a/core/src/io/anuke/mindustry/game/Cicon.java b/core/src/io/anuke/mindustry/game/Cicon.java new file mode 100644 index 0000000000..eccc436c1e --- /dev/null +++ b/core/src/io/anuke/mindustry/game/Cicon.java @@ -0,0 +1,23 @@ +package io.anuke.mindustry.game; + +import java.util.*; + +/** Defines sizes of a content's preview icon. */ +public enum Cicon{ + /** Full size. */ + full(0), + tiny(8 * 2), + small(8 * 3), + medium(8 * 4), + large(8 * 5), + xlarge(8 * 6); + + public static final Cicon[] all = values(); + public static final Cicon[] scaled = Arrays.copyOfRange(all, 1, all.length); + + public final int size; + + Cicon(int size){ + this.size = size; + } +} diff --git a/core/src/io/anuke/mindustry/game/Content.java b/core/src/io/anuke/mindustry/game/Content.java index f75a4495fb..20d8612697 100644 --- a/core/src/io/anuke/mindustry/game/Content.java +++ b/core/src/io/anuke/mindustry/game/Content.java @@ -1,12 +1,16 @@ package io.anuke.mindustry.game; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.Vars; +import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.type.ContentType; /** Base class for a content type that is loaded in {@link io.anuke.mindustry.core.ContentLoader}. */ public abstract class Content{ public final short id; + /** The mod that loaded this piece of content. */ + public @Nullable LoadedMod mod; public Content(){ this.id = (short)Vars.content.getBy(getContentType()).size; diff --git a/core/src/io/anuke/mindustry/game/EventType.java b/core/src/io/anuke/mindustry/game/EventType.java index 5be7008c1a..f26dc08970 100644 --- a/core/src/io/anuke/mindustry/game/EventType.java +++ b/core/src/io/anuke/mindustry/game/EventType.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.game; -import io.anuke.annotations.Annotations.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.core.GameState.State; import io.anuke.mindustry.entities.traits.BuilderTrait; import io.anuke.mindustry.entities.type.*; @@ -83,6 +83,10 @@ public class EventType{ } + public static class ContentReloadEvent{ + + } + public static class DisposeEvent{ } @@ -195,7 +199,8 @@ public class EventType{ public static class BlockBuildEndEvent{ public final Tile tile; public final Team team; - public final @Nullable Player player; + public final @Nullable + Player player; public final boolean breaking; public BlockBuildEndEvent(Tile tile, @Nullable Player player, Team team, boolean breaking){ diff --git a/core/src/io/anuke/mindustry/game/GlobalData.java b/core/src/io/anuke/mindustry/game/GlobalData.java index a782dc3f07..a644c3eed8 100644 --- a/core/src/io/anuke/mindustry/game/GlobalData.java +++ b/core/src/io/anuke/mindustry/game/GlobalData.java @@ -150,6 +150,7 @@ public class GlobalData{ @SuppressWarnings("unchecked") public void load(){ + items.clear(); unlocked = Core.settings.getObject("unlocks", ObjectMap.class, ObjectMap::new); for(Item item : Vars.content.items()){ items.put(item, Core.settings.getInt("item-" + item.name, 0)); diff --git a/core/src/io/anuke/mindustry/game/MappableContent.java b/core/src/io/anuke/mindustry/game/MappableContent.java index 3253975085..785113d2b8 100644 --- a/core/src/io/anuke/mindustry/game/MappableContent.java +++ b/core/src/io/anuke/mindustry/game/MappableContent.java @@ -1,10 +1,13 @@ package io.anuke.mindustry.game; +import io.anuke.mindustry.*; + public abstract class MappableContent extends Content{ public final String name; public MappableContent(String name){ this.name = name; + Vars.content.handleMappableContent(this); } @Override diff --git a/core/src/io/anuke/mindustry/game/MusicControl.java b/core/src/io/anuke/mindustry/game/MusicControl.java index a582babaca..7b5c314a95 100644 --- a/core/src/io/anuke/mindustry/game/MusicControl.java +++ b/core/src/io/anuke/mindustry/game/MusicControl.java @@ -1,11 +1,11 @@ package io.anuke.mindustry.game; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.audio.*; import io.anuke.arc.collection.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; @@ -22,7 +22,8 @@ public class MusicControl{ public Array darkMusic = Array.with(); private Music lastRandomPlayed; private Interval timer = new Interval(); - private @Nullable Music current; + private @Nullable + Music current; private float fade; private boolean silenced; diff --git a/core/src/io/anuke/mindustry/game/Saves.java b/core/src/io/anuke/mindustry/game/Saves.java index 74046d2fa4..ff22a74210 100644 --- a/core/src/io/anuke/mindustry/game/Saves.java +++ b/core/src/io/anuke/mindustry/game/Saves.java @@ -7,6 +7,7 @@ import io.anuke.arc.files.*; import io.anuke.arc.graphics.*; import io.anuke.arc.util.*; import io.anuke.arc.util.async.*; +import io.anuke.mindustry.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.io.*; @@ -253,6 +254,17 @@ public class Saves{ return meta.map; } + public void cautiousLoad(Runnable run){ + Array mods = Array.with(getMods()); + mods.removeAll(Vars.mods.getModStrings()); + + if(!mods.isEmpty()){ + ui.showConfirm("$warning", Core.bundle.format("mod.missing", mods.toString("\n")), run); + }else{ + run.run(); + } + } + public String getName(){ return Core.settings.getString("save-" + index + "-name", "untitled"); } @@ -262,6 +274,10 @@ public class Saves{ Core.settings.save(); } + public String[] getMods(){ + return meta.mods; + } + public Zone getZone(){ return meta == null || meta.rules == null ? null : meta.rules.zone; } diff --git a/core/src/io/anuke/mindustry/game/Teams.java b/core/src/io/anuke/mindustry/game/Teams.java index be4d1a7e2c..45f5daf070 100644 --- a/core/src/io/anuke/mindustry/game/Teams.java +++ b/core/src/io/anuke/mindustry/game/Teams.java @@ -1,9 +1,8 @@ package io.anuke.mindustry.game; -import io.anuke.annotations.Annotations.Struct; import io.anuke.arc.collection.*; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.*; +import io.anuke.mindustry.world.*; /** Class for various team-based utilities. */ public class Teams{ @@ -52,7 +51,7 @@ public class Teams{ public final ObjectSet cores = new ObjectSet<>(); public final EnumSet enemies; public final Team team; - public LongQueue brokenBlocks = new LongQueue(); + public Queue brokenBlocks = new Queue<>(); public TeamData(Team team, EnumSet enemies){ this.team = team; @@ -62,8 +61,16 @@ public class Teams{ /** Represents a block made by this team that was destroyed somewhere on the map. * This does not include deconstructed blocks.*/ - @Struct - public class BrokenBlockStruct{ - public short x, y, rotation, block; + public static class BrokenBlock{ + public final short x, y, rotation, block; + public final int config; + + public BrokenBlock(short x, short y, short rotation, short block, int config){ + this.x = x; + this.y = y; + this.rotation = rotation; + this.block = block; + this.config = config; + } } } diff --git a/core/src/io/anuke/mindustry/game/UnlockableContent.java b/core/src/io/anuke/mindustry/game/UnlockableContent.java index 24edd13949..149fb3e0d4 100644 --- a/core/src/io/anuke/mindustry/game/UnlockableContent.java +++ b/core/src/io/anuke/mindustry/game/UnlockableContent.java @@ -1,9 +1,10 @@ package io.anuke.mindustry.game; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.Vars; +import io.anuke.annotations.Annotations.*; +import io.anuke.arc.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.*; /** Base interface for an unlockable content type. */ public abstract class UnlockableContent extends MappableContent{ @@ -11,6 +12,8 @@ public abstract class UnlockableContent extends MappableContent{ public String localizedName; /** Localized description. May be null. */ public String description; + /** Icons by Cicon ID.*/ + protected TextureRegion[] cicons = new TextureRegion[Cicon.all.length]; public UnlockableContent(String name){ super(name); @@ -19,10 +22,24 @@ public abstract class UnlockableContent extends MappableContent{ this.description = Core.bundle.getOrNull(getContentType() + "." + name + ".description"); } + /** Generate any special icons for this content. Called asynchronously.*/ + @CallSuper + public void createIcons(PixmapPacker out, PixmapPacker editor){ + + } + + /** Returns a specific content icon, or the region {contentType}-{name} if not found.*/ + public TextureRegion icon(Cicon icon){ + if(cicons[icon.ordinal()] == null){ + cicons[icon.ordinal()] = Core.atlas.find(getContentType().name() + "-" + name + "-" + icon.name(), Core.atlas.find(getContentType().name() + "-" + name + "-full", Core.atlas.find(getContentType().name() + "-" + name, Core.atlas.find(name)))); + } + return cicons[icon.ordinal()]; + } + /** Returns the localized name of this content. */ public abstract String localizedName(); - public abstract TextureRegion getContentIcon(); + //public abstract TextureRegion getContentIcon(); /** This should show all necessary info about this content in the specified table. */ public abstract void displayInfo(Table table); diff --git a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java index ab9af0d674..767ffa9ec2 100644 --- a/core/src/io/anuke/mindustry/graphics/BlockRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/BlockRenderer.java @@ -2,15 +2,19 @@ package io.anuke.mindustry.graphics; import io.anuke.arc.*; import io.anuke.arc.collection.*; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.Texture.TextureFilter; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.Texture.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.graphics.glutils.FrameBuffer; +import io.anuke.arc.graphics.glutils.*; +import io.anuke.arc.math.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.content.Blocks; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.type.base.*; import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.Teams.*; import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.Block.*; import static io.anuke.arc.Core.camera; import static io.anuke.mindustry.Vars.*; @@ -120,6 +124,20 @@ public class BlockRenderer implements Disposable{ Draw.shader(); } + public void drawBroken(){ + if(unitGroups[player.getTeam().ordinal()].all().contains(p -> p instanceof BuilderDrone)){ + for(BrokenBlock block : state.teams.get(player.getTeam()).brokenBlocks){ + Block b = content.block(block.block); + if(!camera.bounds(Tmp.r1).grow(tilesize * 2f).overlaps(Tmp.r2.setSize(b.size * tilesize).setCenter(block.x * tilesize + b.offset(), block.y * tilesize + b.offset()))) continue; + + Draw.alpha(0.5f); + Draw.mixcol(Pal.accent, 0.2f + Mathf.absin(5f, 0.2f)); + Draw.rect(b.icon(Cicon.full), block.x * tilesize + b.offset(), block.y * tilesize + b.offset(), b.rotate ? block.rotation * 90 : 0f); + } + Draw.reset(); + } + } + public void drawShadows(){ if(!shadowEvents.isEmpty()){ Draw.flush(); diff --git a/core/src/io/anuke/mindustry/graphics/MenuRenderer.java b/core/src/io/anuke/mindustry/graphics/MenuRenderer.java index 0fcd5b82d3..d6d3bcbd97 100644 --- a/core/src/io/anuke/mindustry/graphics/MenuRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/MenuRenderer.java @@ -14,6 +14,7 @@ import io.anuke.arc.util.noise.RidgedPerlin; import io.anuke.arc.util.noise.Simplex; import io.anuke.mindustry.content.Blocks; import io.anuke.mindustry.content.UnitTypes; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.UnitType; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.Floor; @@ -252,7 +253,9 @@ public class MenuRenderer implements Disposable{ private void drawFlyers(){ Draw.color(0f, 0f, 0f, 0.4f); - float size = Math.max(flyerType.iconRegion.getWidth(), flyerType.iconRegion.getHeight()) * Draw.scl * 1.6f; + TextureRegion icon = flyerType.icon(Cicon.full); + + float size = Math.max(icon.getWidth(), icon.getHeight()) * Draw.scl * 1.6f; flyers((x, y) -> { Draw.rect(flyerType.region, x - 12f, y - 13f, flyerRot - 90); diff --git a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java index 629ed54791..92c8497b26 100644 --- a/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/MinimapRenderer.java @@ -106,7 +106,7 @@ public class MinimapRenderer implements Disposable{ public void updateAll(){ for(int x = 0; x < world.width(); x++){ for(int y = 0; y < world.height(); y++){ - pixmap.drawPixel(x, pixmap.getHeight() - 1 - y, colorFor(world.tile(x, y))); + pixmap.draw(x, pixmap.getHeight() - 1 - y, colorFor(world.tile(x, y))); } } texture.draw(pixmap, 0, 0); @@ -114,7 +114,7 @@ public class MinimapRenderer implements Disposable{ public void update(Tile tile){ int color = colorFor(world.tile(tile.x, tile.y)); - pixmap.drawPixel(tile.x, pixmap.getHeight() - 1 - tile.y, color); + pixmap.draw(tile.x, pixmap.getHeight() - 1 - tile.y, color); Pixmaps.drawPixel(texture, tile.x, pixmap.getHeight() - 1 - tile.y, color); } diff --git a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java index 97b74f881f..b47b648f69 100644 --- a/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java +++ b/core/src/io/anuke/mindustry/graphics/OverlayRenderer.java @@ -1,22 +1,18 @@ package io.anuke.mindustry.graphics; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.Lines; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Rectangle; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.Time; -import io.anuke.arc.util.Tmp; -import io.anuke.mindustry.Vars; -import io.anuke.mindustry.content.Blocks; -import io.anuke.mindustry.entities.Units; -import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.game.Team; -import io.anuke.mindustry.input.InputHandler; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Tile; +import io.anuke.arc.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.input.*; +import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -112,6 +108,13 @@ public class OverlayRenderer{ if(tile != null && tile.block() != Blocks.air && tile.getTeam() == player.getTeam()){ tile.block().drawSelect(tile); + + if(Core.input.keyDown(Binding.rotateplaced) && tile.block().rotate){ + control.input.drawArrow(tile.block(), tile.x, tile.y, tile.rotation(), true); + Draw.color(Pal.accent, 0.3f + Mathf.absin(4f, 0.2f)); + Fill.square(tile.drawx(), tile.drawy(), tile.block().size * tilesize/2f); + Draw.color(); + } } } @@ -119,7 +122,7 @@ public class OverlayRenderer{ if(input.isDroppingItem()){ Vector2 v = Core.input.mouseWorld(input.getMouseX(), input.getMouseY()); float size = 8; - Draw.rect(player.item().item.icon(Item.Icon.large), v.x, v.y, size, size); + Draw.rect(player.item().item.icon(Cicon.medium), v.x, v.y, size, size); Draw.color(Pal.accent); Lines.circle(v.x, v.y, 6 + Mathf.absin(Time.time(), 5f, 1f)); Draw.reset(); diff --git a/core/src/io/anuke/mindustry/graphics/Shaders.java b/core/src/io/anuke/mindustry/graphics/Shaders.java index 83c879aa90..008d7da637 100644 --- a/core/src/io/anuke/mindustry/graphics/Shaders.java +++ b/core/src/io/anuke/mindustry/graphics/Shaders.java @@ -1,17 +1,18 @@ package io.anuke.mindustry.graphics; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.Core; import io.anuke.arc.graphics.Color; import io.anuke.arc.graphics.g2d.TextureRegion; import io.anuke.arc.graphics.glutils.Shader; import io.anuke.arc.scene.ui.layout.Scl; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.Time; public class Shaders{ public static Shadow shadow; public static BlockBuild blockbuild; - public static @Nullable Shield shield; + public static @Nullable + Shield shield; public static UnitBuild build; public static FogShader fog; public static MenuShader menu; diff --git a/core/src/io/anuke/mindustry/input/Binding.java b/core/src/io/anuke/mindustry/input/Binding.java index 1eb5da1875..8f599a872f 100644 --- a/core/src/io/anuke/mindustry/input/Binding.java +++ b/core/src/io/anuke/mindustry/input/Binding.java @@ -13,6 +13,7 @@ public enum Binding implements KeyBind{ deselect(KeyCode.MOUSE_RIGHT), break_block(KeyCode.MOUSE_RIGHT), rotate(new Axis(KeyCode.SCROLL)), + rotateplaced(KeyCode.R), diagonal_placement(KeyCode.CONTROL_LEFT), pick(KeyCode.MOUSE_MIDDLE), dash(KeyCode.SHIFT_LEFT), diff --git a/core/src/io/anuke/mindustry/input/DesktopInput.java b/core/src/io/anuke/mindustry/input/DesktopInput.java index acef76ac47..3bd752086e 100644 --- a/core/src/io/anuke/mindustry/input/DesktopInput.java +++ b/core/src/io/anuke/mindustry/input/DesktopInput.java @@ -11,9 +11,9 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.game.EventType.*; +import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.input.PlaceUtils.*; -import io.anuke.mindustry.net.Net; import io.anuke.mindustry.world.*; import static io.anuke.arc.Core.scene; @@ -189,6 +189,10 @@ public class DesktopInput extends InputHandler{ if(canTapPlayer(Core.input.mouseWorld().x, Core.input.mouseWorld().y)){ cursorType = ui.unloadCursor; } + + if(!isPlacing() && Math.abs(Core.input.axisTap(Binding.rotate)) > 0 && Core.input.keyDown(Binding.rotateplaced) && cursor.block().rotate){ + Call.rotateBlock(player, cursor, Core.input.axisTap(Binding.rotate) > 0); + } } if(!Core.scene.hasMouse()){ diff --git a/core/src/io/anuke/mindustry/input/InputHandler.java b/core/src/io/anuke/mindustry/input/InputHandler.java index caa89ffc56..4caaf25677 100644 --- a/core/src/io/anuke/mindustry/input/InputHandler.java +++ b/core/src/io/anuke/mindustry/input/InputHandler.java @@ -57,6 +57,20 @@ public abstract class InputHandler implements InputProcessor{ player.clearItem(); } + @Remote(targets = Loc.both, called = Loc.server, forward = true, unreliable = true) + public static void rotateBlock(Player player, Tile tile, boolean direction){ + if(net.server() && !Units.canInteract(player, tile)){ + throw new ValidateException(player, "Player cannot drop an item."); + } + + tile.rotation(Mathf.mod(tile.rotation() + Mathf.sign(direction), 4)); + + if(tile.entity != null){ + tile.entity.updateProximity(); + tile.entity.noSleep(); + } + } + @Remote(targets = Loc.both, forward = true, called = Loc.server) public static void transferInventory(Player player, Tile tile){ if(player == null || player.timer == null || !player.timer.get(Player.timerTransfer, 40)) return; @@ -114,6 +128,12 @@ public abstract class InputHandler implements InputProcessor{ tile.block().tapped(tile, player); } + @Remote(targets = Loc.both, called = Loc.both, forward = true) + public static void onTileConfig(Player player, Tile tile, int value){ + if(tile == null || !Units.canInteract(player, tile)) return; + tile.block().configured(tile, player, value); + } + public OverlayFragment getFrag(){ return frag; } @@ -352,15 +372,19 @@ public abstract class InputHandler implements InputProcessor{ player.addBuildRequest(new BuildRequest(tile.x, tile.y)); } - void drawArrow(Block block, int x, int y, int rotation){ - Draw.color(!validPlace(x, y, block, rotation) ? Pal.removeBack : Pal.accentBack); + public void drawArrow(Block block, int x, int y, int rotation){ + drawArrow(block, x, y, rotation, validPlace(x, y, block, rotation)); + } + + public void drawArrow(Block block, int x, int y, int rotation, boolean valid){ + Draw.color(!valid ? Pal.removeBack : Pal.accentBack); Draw.rect(Core.atlas.find("place-arrow"), x * tilesize + block.offset(), y * tilesize + block.offset() - 1, Core.atlas.find("place-arrow").getWidth() * Draw.scl, Core.atlas.find("place-arrow").getHeight() * Draw.scl, rotation * 90 - 90); - Draw.color(!validPlace(x, y, block, rotation) ? Pal.remove : Pal.accent); + Draw.color(!valid ? Pal.remove : Pal.accent); Draw.rect(Core.atlas.find("place-arrow"), x * tilesize + block.offset(), y * tilesize + block.offset(), diff --git a/core/src/io/anuke/mindustry/io/JsonIO.java b/core/src/io/anuke/mindustry/io/JsonIO.java index 15f1e18476..7e0b8f640c 100644 --- a/core/src/io/anuke/mindustry/io/JsonIO.java +++ b/core/src/io/anuke/mindustry/io/JsonIO.java @@ -1,12 +1,10 @@ package io.anuke.mindustry.io; -import io.anuke.arc.collection.*; import io.anuke.arc.util.serialization.*; import io.anuke.arc.util.serialization.Json.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.game.*; -import io.anuke.mindustry.game.Teams.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -98,6 +96,7 @@ public class JsonIO{ } }); + /* json.setSerializer(TeamData.class, new Serializer(){ @Override public void write(Json json, TeamData object, Class knownType){ @@ -115,7 +114,7 @@ public class JsonIO{ out.brokenBlocks = new LongQueue(blocks); return out; } - }); + });*/ json.setSerializer(ItemStack.class, new Serializer(){ @Override diff --git a/core/src/io/anuke/mindustry/io/MapIO.java b/core/src/io/anuke/mindustry/io/MapIO.java index eb462724b2..7d14c210d9 100644 --- a/core/src/io/anuke/mindustry/io/MapIO.java +++ b/core/src/io/anuke/mindustry/io/MapIO.java @@ -81,8 +81,8 @@ public class MapIO{ super.setBlock(type); int c = colorFor(Blocks.air, block(), Blocks.air, getTeam()); if(c != black){ - walls.drawPixel(x, floors.getHeight() - 1 - y, c); - floors.drawPixel(x, floors.getHeight() - 1 - y + 1, shade); + walls.draw(x, floors.getHeight() - 1 - y, c); + floors.draw(x, floors.getHeight() - 1 - y + 1, shade); } } @@ -112,9 +112,9 @@ public class MapIO{ @Override public Tile create(int x, int y, int floorID, int overlayID, int wallID){ if(overlayID != 0){ - floors.drawPixel(x, floors.getHeight() - 1 - y, colorFor(Blocks.air, Blocks.air, content.block(overlayID), Team.derelict)); + floors.draw(x, floors.getHeight() - 1 - y, colorFor(Blocks.air, Blocks.air, content.block(overlayID), Team.derelict)); }else{ - floors.drawPixel(x, floors.getHeight() - 1 - y, colorFor(content.block(floorID), Blocks.air, Blocks.air, Team.derelict)); + floors.draw(x, floors.getHeight() - 1 - y, colorFor(content.block(floorID), Blocks.air, Blocks.air, Team.derelict)); } if(content.block(overlayID) == Blocks.spawn){ map.spawns ++; @@ -136,7 +136,7 @@ public class MapIO{ for(int x = 0; x < pixmap.getWidth(); x++){ for(int y = 0; y < pixmap.getHeight(); y++){ Tile tile = tiles[x][y]; - pixmap.drawPixel(x, pixmap.getHeight() - 1 - y, colorFor(tile.floor(), tile.block(), tile.overlay(), tile.getTeam())); + pixmap.draw(x, pixmap.getHeight() - 1 - y, colorFor(tile.floor(), tile.block(), tile.overlay(), tile.getTeam())); } } return pixmap; diff --git a/core/src/io/anuke/mindustry/io/SaveIO.java b/core/src/io/anuke/mindustry/io/SaveIO.java index cb79c0222d..8a6035363a 100644 --- a/core/src/io/anuke/mindustry/io/SaveIO.java +++ b/core/src/io/anuke/mindustry/io/SaveIO.java @@ -5,8 +5,7 @@ import io.anuke.arc.files.FileHandle; import io.anuke.arc.util.io.CounterInputStream; import io.anuke.arc.util.io.FastDeflaterOutputStream; import io.anuke.mindustry.Vars; -import io.anuke.mindustry.io.versions.Save1; -import io.anuke.mindustry.io.versions.Save2; +import io.anuke.mindustry.io.versions.*; import io.anuke.mindustry.world.WorldContext; import java.io.*; @@ -19,7 +18,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()); + public static final Array versionArray = Array.with(new Save1(), new Save2(), new Save3()); static{ for(SaveVersion version : versionArray){ diff --git a/core/src/io/anuke/mindustry/io/SaveMeta.java b/core/src/io/anuke/mindustry/io/SaveMeta.java index 429c82561d..4759b955ab 100644 --- a/core/src/io/anuke/mindustry/io/SaveMeta.java +++ b/core/src/io/anuke/mindustry/io/SaveMeta.java @@ -15,6 +15,7 @@ public class SaveMeta{ public int wave; public Rules rules; public StringMap tags; + public String[] mods; public SaveMeta(int version, long timestamp, long timePlayed, int build, String map, int wave, Rules rules, StringMap tags){ this.version = version; @@ -25,5 +26,6 @@ public class SaveMeta{ this.wave = wave; this.rules = rules; this.tags = tags; + this.mods = JsonIO.read(String[].class, tags.get("mods", "[]")); } } diff --git a/core/src/io/anuke/mindustry/io/SaveVersion.java b/core/src/io/anuke/mindustry/io/SaveVersion.java index 53524d4625..76e7ce5e09 100644 --- a/core/src/io/anuke/mindustry/io/SaveVersion.java +++ b/core/src/io/anuke/mindustry/io/SaveVersion.java @@ -6,7 +6,7 @@ import io.anuke.arc.util.io.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.game.*; -import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.game.Teams.*; import io.anuke.mindustry.maps.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -16,7 +16,7 @@ import java.io.*; import static io.anuke.mindustry.Vars.*; public abstract class SaveVersion extends SaveFileReader{ - public final int version; + public int version; //HACK stores the last read build of the save file, valid after read meta call protected int lastReadBuild; @@ -66,6 +66,7 @@ public abstract class SaveVersion extends SaveFileReader{ "wavetime", state.wavetime, "stats", JsonIO.write(state.stats), "rules", JsonIO.write(state.rules), + "mods", JsonIO.write(mods.getModStrings().toArray(String.class)), "width", world.width(), "height", world.height() ).merge(tags)); @@ -80,6 +81,7 @@ public abstract class SaveVersion extends SaveFileReader{ state.rules = JsonIO.read(Rules.class, map.get("rules", "{}")); if(state.rules.spawns.isEmpty()) state.rules.spawns = defaultWaves.get(); lastReadBuild = map.getInt("build", -1); + String[] mods = JsonIO.read(String[].class, map.get("mods", "[]")); Map worldmap = maps.byName(map.get("mapname", "\\\\\\")); world.setMap(worldmap == null ? new Map(StringMap.of( @@ -206,6 +208,21 @@ public abstract class SaveVersion extends SaveFileReader{ } public void writeEntities(DataOutput stream) throws IOException{ + //write team data with entities. + Array data = state.teams.getActive(); + stream.writeInt(data.size); + for(TeamData team : data){ + stream.writeInt(team.team.ordinal()); + stream.writeInt(team.brokenBlocks.size); + for(BrokenBlock block : team.brokenBlocks){ + stream.writeShort(block.x); + stream.writeShort(block.y); + stream.writeShort(block.rotation); + stream.writeShort(block.block); + stream.writeInt(block.config); + } + } + //write entity chunk int groups = 0; @@ -234,6 +251,16 @@ public abstract class SaveVersion extends SaveFileReader{ } public void readEntities(DataInput stream) throws IOException{ + int teamc = stream.readInt(); + for(int i = 0; i < teamc; i++){ + Team team = Team.all[stream.readInt()]; + TeamData data = state.teams.get(team); + int blocks = stream.readInt(); + for(int j = 0; j < blocks; j++){ + data.brokenBlocks.addLast(new BrokenBlock(stream.readShort(), stream.readShort(), stream.readShort(), stream.readShort(), stream.readInt())); + } + } + byte groups = stream.readByte(); for(int i = 0; i < groups; i++){ @@ -290,17 +317,4 @@ public abstract class SaveVersion extends SaveFileReader{ } } } - - /** sometimes it's necessary to remap IDs after the content header is read.*/ - public void remapContent(){ - for(Team team : Team.all){ - if(state.teams.isActive(team)){ - LongQueue queue = state.teams.get(team).brokenBlocks; - for(int i = 0; i < queue.size; i++){ - //remap broken block IDs - queue.set(i, BrokenBlock.block(queue.get(i), content.block(BrokenBlock.block(queue.get(i))).id)); - } - } - } - } } diff --git a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java b/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java index 9af7e9f785..19168c9802 100644 --- a/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java +++ b/core/src/io/anuke/mindustry/io/versions/LegacyTypeTable.java @@ -118,7 +118,7 @@ public class LegacyTypeTable{ public static Supplier[] getTable(int build){ if(build == -1 || build == 81){ - //return most recent one since that's probably is; not guaranteed + //return most recent one since that's probably it; not guaranteed return build81Table; }else if(build == 80){ return build80Table; diff --git a/core/src/io/anuke/mindustry/io/versions/Save1.java b/core/src/io/anuke/mindustry/io/versions/Save1.java index 545ae99eb2..554bf7c94a 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save1.java +++ b/core/src/io/anuke/mindustry/io/versions/Save1.java @@ -1,16 +1,14 @@ package io.anuke.mindustry.io.versions; -import io.anuke.arc.function.Supplier; -import io.anuke.mindustry.entities.traits.SaveTrait; -import io.anuke.mindustry.io.SaveVersion; +import io.anuke.arc.function.*; +import io.anuke.mindustry.entities.traits.*; -import java.io.DataInput; -import java.io.IOException; +import java.io.*; -public class Save1 extends SaveVersion{ +public class Save1 extends Save2{ public Save1(){ - super(1); + version = 1; } @Override diff --git a/core/src/io/anuke/mindustry/io/versions/Save2.java b/core/src/io/anuke/mindustry/io/versions/Save2.java index 66d61964c5..4fb9954b0c 100644 --- a/core/src/io/anuke/mindustry/io/versions/Save2.java +++ b/core/src/io/anuke/mindustry/io/versions/Save2.java @@ -1,9 +1,35 @@ package io.anuke.mindustry.io.versions; -import io.anuke.mindustry.io.SaveVersion; +import io.anuke.mindustry.entities.traits.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.io.*; +import io.anuke.mindustry.type.*; + +import java.io.*; + +import static io.anuke.mindustry.Vars.content; public class Save2 extends SaveVersion{ + public Save2(){ super(2); } + + @Override + public void readEntities(DataInput stream) throws IOException{ + byte groups = stream.readByte(); + + for(int i = 0; i < groups; i++){ + int amount = stream.readInt(); + for(int j = 0; j < amount; j++){ + //TODO throw exception on read fail + readChunk(stream, true, in -> { + byte typeid = in.readByte(); + byte version = in.readByte(); + SaveTrait trait = (SaveTrait)content.getByID(ContentType.typeid, typeid).constructor.get(); + trait.readSave(in, version); + }); + } + } + } } diff --git a/core/src/io/anuke/mindustry/io/versions/Save3.java b/core/src/io/anuke/mindustry/io/versions/Save3.java new file mode 100644 index 0000000000..c418a1bf46 --- /dev/null +++ b/core/src/io/anuke/mindustry/io/versions/Save3.java @@ -0,0 +1,9 @@ +package io.anuke.mindustry.io.versions; + +import io.anuke.mindustry.io.*; + +public class Save3 extends SaveVersion{ + public Save3(){ + super(3); + } +} diff --git a/core/src/io/anuke/mindustry/maps/Maps.java b/core/src/io/anuke/mindustry/maps/Maps.java index 71e5924960..72d1b17b77 100644 --- a/core/src/io/anuke/mindustry/maps/Maps.java +++ b/core/src/io/anuke/mindustry/maps/Maps.java @@ -70,7 +70,7 @@ public class Maps{ * Does not add this map to the map list. */ public Map loadInternalMap(String name){ - FileHandle file = Core.files.internal("maps/" + name + "." + mapExtension); + FileHandle file = tree.get("maps/" + name + "." + mapExtension); try{ return MapIO.createMap(file, false); diff --git a/core/src/io/anuke/mindustry/maps/filters/FilterOption.java b/core/src/io/anuke/mindustry/maps/filters/FilterOption.java index 7874f85c5b..038819b122 100644 --- a/core/src/io/anuke/mindustry/maps/filters/FilterOption.java +++ b/core/src/io/anuke/mindustry/maps/filters/FilterOption.java @@ -8,20 +8,20 @@ import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.ui.dialogs.*; import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.Block.*; import io.anuke.mindustry.world.blocks.*; import static io.anuke.mindustry.Vars.updateEditorOnChange; public abstract class FilterOption{ - public static final Predicate floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(Icon.full)); - public static final Predicate wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(Icon.full)); - public static final Predicate floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(Icon.full))); - public static final Predicate wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(Icon.full))); - public static final Predicate wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(Icon.full))); - public static final Predicate oresOnly = b -> b instanceof OverlayFloor && Core.atlas.isFound(b.icon(Icon.full)); + public static final Predicate floorsOnly = b -> (b instanceof Floor && !(b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(Cicon.full)); + public static final Predicate wallsOnly = b -> (!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(Cicon.full)); + public static final Predicate floorsOptional = b -> b == Blocks.air || ((b instanceof Floor && !(b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(Cicon.full))); + public static final Predicate wallsOptional = b -> b == Blocks.air || ((!b.synthetic() && !(b instanceof Floor)) && Core.atlas.isFound(b.icon(Cicon.full))); + public static final Predicate wallsOresOptional = b -> b == Blocks.air || (((!b.synthetic() && !(b instanceof Floor)) || (b instanceof OverlayFloor)) && Core.atlas.isFound(b.icon(Cicon.full))); + public static final Predicate oresOnly = b -> b instanceof OverlayFloor && Core.atlas.isFound(b.icon(Cicon.full)); public static final Predicate anyOptional = b -> floorsOnly.test(b) || wallsOnly.test(b) || oresOnly.test(b) || b == Blocks.air; public abstract void build(Table table); @@ -76,15 +76,15 @@ public abstract class FilterOption{ @Override public void build(Table table){ - table.addButton(b -> b.addImage(supplier.get().icon(Icon.small)).update(i -> ((TextureRegionDrawable)i.getDrawable()) - .setRegion(supplier.get() == Blocks.air ? Core.atlas.find("icon-none") : supplier.get().icon(Icon.small))).size(8 * 3), () -> { + table.addButton(b -> b.addImage(supplier.get().icon(Cicon.small)).update(i -> ((TextureRegionDrawable)i.getDrawable()) + .setRegion(supplier.get() == Blocks.air ? Core.atlas.find("icon-none") : supplier.get().icon(Cicon.small))).size(8 * 3), () -> { FloatingDialog dialog = new FloatingDialog(""); dialog.setFillParent(false); int i = 0; for(Block block : Vars.content.blocks()){ if(!filter.test(block)) continue; - dialog.cont.addImage(block == Blocks.air ? Core.atlas.find("icon-none-small") : block.icon(Icon.medium)).size(8 * 4).pad(3).get().clicked(() -> { + dialog.cont.addImage(block == Blocks.air ? Core.atlas.find("icon-none-small") : block.icon(Cicon.medium)).size(8 * 4).pad(3).get().clicked(() -> { consumer.accept(block); dialog.hide(); changed.run(); diff --git a/core/src/io/anuke/mindustry/mod/ContentParser.java b/core/src/io/anuke/mindustry/mod/ContentParser.java new file mode 100644 index 0000000000..fda221c100 --- /dev/null +++ b/core/src/io/anuke/mindustry/mod/ContentParser.java @@ -0,0 +1,345 @@ +package io.anuke.mindustry.mod; + +import io.anuke.arc.*; +import io.anuke.arc.audio.*; +import io.anuke.arc.collection.Array; +import io.anuke.arc.collection.*; +import io.anuke.arc.function.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.arc.util.*; +import io.anuke.arc.util.reflect.Field; +import io.anuke.arc.util.reflect.*; +import io.anuke.arc.util.serialization.*; +import io.anuke.arc.util.serialization.Json.*; +import io.anuke.mindustry.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.entities.bullet.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.mod.Mods.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; + +import java.lang.reflect.*; + +@SuppressWarnings("unchecked") +public class ContentParser{ + private static final boolean ignoreUnknownFields = true; + private ObjectMap, ContentType> contentTypes = new ObjectMap<>(); + private ObjectMap, FieldParser> classParsers = new ObjectMap, FieldParser>(){{ + put(BulletType.class, (type, data) -> field(Bullets.class, data)); + put(Effect.class, (type, data) -> field(Fx.class, data)); + put(StatusEffect.class, (type, data) -> field(StatusEffects.class, data)); + put(Loadout.class, (type, data) -> field(Loadouts.class, data)); + put(Color.class, (type, data) -> Color.valueOf(data.asString())); + put(Music.class, (type, data) -> { + if(fieldOpt(Musics.class, data) != null) return fieldOpt(Musics.class, data); + + String path = "music/" + data.asString() + (Vars.ios ? ".mp3" : ".ogg"); + Core.assets.load(path, Music.class); + Core.assets.finishLoadingAsset(path); + return Core.assets.get(path); + }); + put(Sound.class, (type, data) -> { + if(fieldOpt(Sounds.class, data) != null) return fieldOpt(Sounds.class, data); + + String path = "sounds/" + data.asString() + (Vars.ios ? ".mp3" : ".ogg"); + Core.assets.load(path, Sound.class); + Core.assets.finishLoadingAsset(path); + Log.info(Core.assets.get(path)); + return Core.assets.get(path); + }); + }}; + /** 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 LoadedMod currentMod; + + private Json parser = new Json(){ + public T readValue(Class type, Class elementType, JsonValue jsonData){ + if(type != null){ + if(classParsers.containsKey(type)){ + return (T)classParsers.get(type).parse(type, jsonData); + } + + 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 + "-" : ""; + T one = (T)Vars.content.getByName(ctype, prefix + jsonData.asString()); + if(one != null) return one; + return (T)Vars.content.getByName(ctype, jsonData.asString()); + } + } + + return super.readValue(type, elementType, jsonData); + } + }; + + private ObjectMap> parsers = ObjectMap.of( + ContentType.block, (TypeParser)(mod, name, value) -> { + //TODO generate dynamically instead of doing.. this + Class type = resolve(value.getString("type"), + "io.anuke.mindustry.world", + "io.anuke.mindustry.world.blocks", + "io.anuke.mindustry.world.blocks.defense", + "io.anuke.mindustry.world.blocks.defense.turrets", + "io.anuke.mindustry.world.blocks.distribution", + "io.anuke.mindustry.world.blocks.logic", + "io.anuke.mindustry.world.blocks.power", + "io.anuke.mindustry.world.blocks.production", + "io.anuke.mindustry.world.blocks.sandbox", + "io.anuke.mindustry.world.blocks.storage", + "io.anuke.mindustry.world.blocks.units" + ); + + Block block = type.getDeclaredConstructor(String.class).newInstance(mod + "-" + name); + read(() -> { + if(value.has("consumes")){ + for(JsonValue child : value.get("consumes")){ + if(child.name.equals("item")){ + if(child.isString()){ + block.consumes.item(Vars.content.getByName(ContentType.item, child.asString())); + }else{ + ItemStack stack = parser.readValue(ItemStack.class, child); + block.consumes.item(stack.item, stack.amount); + } + }else if(child.name.equals("items")){ + block.consumes.items(parser.readValue(ItemStack[].class, child)); + }else if(child.name.equals("liquid")){ + LiquidStack stack = parser.readValue(LiquidStack.class, child); + block.consumes.liquid(stack.liquid, stack.amount); + }else if(child.name.equals("power")){ + block.consumes.power(child.asFloat()); + }else if(child.name.equals("powerBuffered")){ + block.consumes.powerBuffered(child.asFloat()); + }else{ + throw new IllegalArgumentException("Unknown consumption type: '" + child.name + "' for block '" + block.name + "'."); + } + } + value.remove("consumes"); + } + + readFields(block, value, true); + + //add research tech node + if(value.has("research")){ + TechTree.create(Vars.content.getByName(ContentType.block, value.get("research").asString()), block); + } + + //make block visible + if(value.has("requirements")){ + block.buildVisibility = () -> true; + } + }); + + return block; + }, + ContentType.unit, (TypeParser)(mod, name, value) -> { + Class type = resolve(value.getString("type"), "io.anuke.mindustry.entities.type.base"); + UnitType unit = new UnitType(mod + "-" + name, supply(type)); + read(() -> readFields(unit, value, true)); + + return unit; + }, + ContentType.item, parser(ContentType.item, Item::new), + ContentType.liquid, parser(ContentType.liquid, Liquid::new), + ContentType.mech, parser(ContentType.mech, Mech::new), + ContentType.zone, parser(ContentType.zone, Zone::new) + ); + + private TypeParser parser(ContentType type, Function constructor){ + return (mod, name, value) -> { + T item; + if(Vars.content.getByName(type, name) != null){ + item = (T)Vars.content.getByName(type, name); + }else{ + item = constructor.get(mod + "-" + name); + } + read(() -> readFields(item, value)); + return item; + }; + } + + /** Call to read a content's extra info later.*/ + private void read(Runnable run){ + LoadedMod mod = currentMod; + reads.add(() -> { + this.currentMod = mod; + run.run(); + }); + } + + private void init(){ + for(ContentType type : ContentType.all){ + Array arr = Vars.content.getBy(type); + if(!arr.isEmpty()){ + Class c = arr.first().getClass(); + //get base content class, skipping intermediates + while(!(c.getSuperclass() == Content.class || c.getSuperclass() == UnlockableContent.class || Modifier.isAbstract(c.getSuperclass().getModifiers()))){ + c = c.getSuperclass(); + } + + contentTypes.put(c, type); + } + } + } + + public void finishParsing(){ + reads.each(Runnable::run); + reads.clear(); + } + + /** + * Parses content from a json file. + * @param name the name of the file without its extension + * @param json the json to parse + * @param type the type of content this is + * @return the content that was parsed + */ + public Content parse(LoadedMod mod, String name, String json, ContentType type) throws Exception{ + if(contentTypes.isEmpty()){ + init(); + } + + JsonValue value = parser.fromJson(null, json); + if(!parsers.containsKey(type)){ + throw new SerializationException("No parsers for content type '" + type + "'"); + } + + currentMod = mod; + Content c = parsers.get(type).parse(mod.name, name, value); + c.mod = mod; + checkNulls(c); + return c; + } + + private Supplier supply(Class type){ + try{ + java.lang.reflect.Constructor cons = type.getDeclaredConstructor(); + return () -> { + try{ + return cons.newInstance(); + }catch(Exception e){ + throw new RuntimeException(e); + } + }; + }catch(Exception e){ + throw new RuntimeException(e); + } + } + + private Object field(Class type, JsonValue value){ + return field(type, value.asString()); + } + + /** Gets a field from a static class by name, throwing a descriptive exception if not found. */ + private Object field(Class type, String name){ + try{ + Object b = type.getField(name).get(null); + if(b == null) throw new IllegalArgumentException(type.getSimpleName() + ": not found: '" + name + "'"); + return b; + }catch(Exception e){ + throw new RuntimeException(e); + } + } + + private Object fieldOpt(Class type, JsonValue value){ + try{ + Object b = type.getField(value.asString()).get(null); + if(b == null) return null; + return b; + }catch(Exception e){ + return null; + } + } + + /** Checks all @NonNull fields in this object, recursively. + * Throws an exception if any are null.*/ + private void checkNulls(Object object){ + checkNulls(object, new ObjectSet<>()); + } + + private void checkNulls(Object object, ObjectSet checked){ + checked.add(object); + + parser.getFields(object.getClass()).values().toArray().each(field -> { + try{ + if(field.field.getType().isPrimitive()) return; + + Object obj = field.field.get(object); + if(field.field.isAnnotationPresent(NonNull.class) && field.field.get(object) == null){ + throw new RuntimeException("Field '" + field.field.getName() + "' in " + object.getClass().getSimpleName() + " is missing!"); + } + + if(obj != null && !checked.contains(obj)){ + checkNulls(obj, checked); + checked.add(obj); + } + }catch(Exception e){ + throw new RuntimeException(e); + } + }); + } + + private void readFields(Object object, JsonValue jsonMap, boolean stripType){ + if(stripType) jsonMap.remove("type"); + readFields(object, jsonMap); + } + + private void readFields(Object object, JsonValue jsonMap){ + Class type = object.getClass(); + ObjectMap fields = parser.getFields(type); + for(JsonValue child = jsonMap.child; child != null; child = child.next){ + FieldMetadata metadata = fields.get(child.name().replace(" ", "_")); + if(metadata == null){ + if(ignoreUnknownFields){ + if(!child.name.equals("research")){ + Log.err("{0}: Ignoring unknown field: " + child.name + " (" + type.getName() + ")", object); + } + continue; + }else{ + SerializationException ex = new SerializationException("Field not found: " + child.name + " (" + type.getName() + ")"); + ex.addTrace(child.trace()); + throw ex; + } + } + Field field = metadata.field; + try{ + field.set(object, parser.readValue(field.getType(), metadata.elementType, child)); + }catch(ReflectionException ex){ + throw new SerializationException("Error accessing field: " + field.getName() + " (" + type.getName() + ")", ex); + }catch(SerializationException ex){ + ex.addTrace(field.getName() + " (" + type.getName() + ")"); + throw ex; + }catch(RuntimeException runtimeEx){ + SerializationException ex = new SerializationException(runtimeEx); + ex.addTrace(child.trace()); + ex.addTrace(field.getName() + " (" + type.getName() + ")"); + throw ex; + } + } + } + + /** Tries to resolve a class from a list of potential class names. */ + private Class resolve(String base, String... potentials) throws Exception{ + for(String type : potentials){ + try{ + return (Class)Class.forName(type + '.' + base); + }catch(Exception ignored){ + } + } + throw new IllegalArgumentException("Type not found: " + potentials[0]); + } + + private interface FieldParser{ + Object parse(Class type, JsonValue value); + } + + private interface TypeParser{ + T parse(String mod, String name, JsonValue value) throws Exception; + } + +} diff --git a/core/src/io/anuke/mindustry/mod/Mod.java b/core/src/io/anuke/mindustry/mod/Mod.java new file mode 100644 index 0000000000..5ee0f699c4 --- /dev/null +++ b/core/src/io/anuke/mindustry/mod/Mod.java @@ -0,0 +1,32 @@ +package io.anuke.mindustry.mod; + +import io.anuke.arc.files.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.*; + +public class Mod{ + /** @return the config file for this plugin, as the file 'mods/[plugin-name]/config.json'.*/ + public FileHandle getConfig(){ + return Vars.mods.getConfig(this); + } + + /** Called after all plugins have been created and commands have been registered.*/ + public void init(){ + + } + + /** Create any content needed here. */ + public void loadContent(){ + + } + + /** Register any commands to be used on the server side, e.g. from the console. */ + public void registerServerCommands(CommandHandler handler){ + + } + + /** Register any commands to be used on the client side, e.g. sent from an in-game player.. */ + public void registerClientCommands(CommandHandler handler){ + + } +} diff --git a/core/src/io/anuke/mindustry/mod/Mods.java b/core/src/io/anuke/mindustry/mod/Mods.java new file mode 100644 index 0000000000..bfe8df2ce1 --- /dev/null +++ b/core/src/io/anuke/mindustry/mod/Mods.java @@ -0,0 +1,419 @@ +package io.anuke.mindustry.mod; + +import io.anuke.arc.*; +import io.anuke.arc.assets.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.files.*; +import io.anuke.arc.function.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.Pixmap.*; +import io.anuke.arc.graphics.Texture.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.graphics.g2d.TextureAtlas.*; +import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.arc.util.*; +import io.anuke.arc.util.io.*; +import io.anuke.arc.util.serialization.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.plugin.*; +import io.anuke.mindustry.type.*; + +import java.io.*; +import java.net.*; + +import static io.anuke.mindustry.Vars.*; + +public class Mods implements Loadable{ + private Json json = new Json(); + private ContentParser parser = new ContentParser(); + private ObjectMap> bundles = new ObjectMap<>(); + private ObjectSet specialFolders = ObjectSet.with("bundles", "sprites"); + + private int totalSprites; + private PixmapPacker packer; + + private Array loaded = new Array<>(); + private Array disabled = new Array<>(); + private ObjectMap, ModMeta> metas = new ObjectMap<>(); + private boolean requiresReload; + + /** Returns a file named 'config.json' in a special folder for the specified plugin. + * Call this in init(). */ + public FileHandle getConfig(Mod mod){ + ModMeta load = metas.get(mod.getClass()); + if(load == null) throw new IllegalArgumentException("Mod is not loaded yet (or missing)!"); + return modDirectory.child(load.name).child("config.json"); + } + + /** @return the loaded mod found by class, or null if not found. */ + public @Nullable + LoadedMod getMod(Class type){ + return loaded.find(l -> l.mod.getClass() == type); + } + + /** Imports an external mod file.*/ + public void importMod(FileHandle file) throws IOException{ + FileHandle dest = modDirectory.child(file.name()); + if(dest.exists()){ + throw new IOException("A mod with the same filename already exists!"); + } + + file.copyTo(dest); + try{ + loaded.add(loadMod(file)); + requiresReload = true; + }catch(IOException e){ + dest.delete(); + throw e; + }catch(Throwable t){ + dest.delete(); + throw new IOException(t); + } + } + + /** Repacks all in-game sprites. */ + @Override + public void loadAsync(){ + if(loaded.isEmpty()) return; + + packer = new PixmapPacker(2048, 2048, Format.RGBA8888, 2, true); + + for(LoadedMod mod : loaded){ + int[] packed = {0}; + boolean[] failed = {false}; + mod.root.child("sprites").walk(file -> { + if(failed[0]) return; + if(file.extension().equals("png")){ + try(InputStream stream = file.read()){ + byte[] bytes = Streams.copyStreamToByteArray(stream, Math.max((int)file.length(), 512)); + Pixmap pixmap = new Pixmap(bytes, 0, bytes.length); + packer.pack(mod.name + "-" + file.nameWithoutExtension(), pixmap); + pixmap.dispose(); + packed[0] ++; + totalSprites ++; + }catch(IOException e){ + failed[0] = true; + Core.app.post(() -> { + Log.err("Error packing images for mod: {0}", mod.meta.name); + e.printStackTrace(); + if(!headless) ui.showException(e); + }); + } + } + }); + Log.info("Packed {0} images for mod '{1}'.", packed[0], mod.meta.name); + } + } + + @Override + public void loadSync(){ + if(packer == null) return; + + Texture editor = Core.atlas.find("clear-editor").getTexture(); + PixmapPacker editorPacker = new PixmapPacker(2048, 2048, Format.RGBA8888, 2, true); + + for(AtlasRegion region : Core.atlas.getRegions()){ + if(region.getTexture() == editor){ + editorPacker.pack(region.name, Core.atlas.getPixmap(region).crop()); + } + } + + //get textures packed + if(totalSprites > 0){ + TextureFilter filter = Core.settings.getBool("linear") ? TextureFilter.Linear : TextureFilter.Nearest; + + packer.updateTextureAtlas(Core.atlas, filter, filter, false); + //generate new icons + for(Array arr : content.getContentMap()){ + arr.each(c -> { + if(c instanceof UnlockableContent && c.mod != null){ + UnlockableContent u = (UnlockableContent)c; + u.createIcons(packer, editorPacker); + } + }); + } + + editorPacker.updateTextureAtlas(Core.atlas, filter, filter, false); + packer.updateTextureAtlas(Core.atlas, filter, filter, false); + } + + packer.dispose(); + packer = null; + } + + /** Removes a mod file and marks it for requiring a restart. */ + public void removeMod(LoadedMod mod){ + if(mod.file.isDirectory()){ + mod.file.deleteDirectory(); + }else{ + mod.file.delete(); + } + loaded.remove(mod); + requiresReload = true; + } + + public boolean requiresReload(){ + return requiresReload; + } + + /** Loads all mods from the folder, but does call any methods on them.*/ + public void load(){ + for(FileHandle file : modDirectory.list()){ + if(!file.extension().equals("jar") && !file.extension().equals("zip") && !(file.isDirectory() && file.child("mod.json").exists())) continue; + + try{ + LoadedMod mod = loadMod(file); + if(mod.enabled()){ + loaded.add(mod); + }else{ + disabled.add(mod); + } + }catch(IllegalArgumentException ignored){ + }catch(Exception e){ + Log.err("Failed to load plugin file {0}. Skipping.", file); + e.printStackTrace(); + } + } + + //sort mods to make sure servers handle them properly. + loaded.sort(Structs.comparing(m -> m.name)); + + buildFiles(); + } + + private void buildFiles(){ + for(LoadedMod mod : loaded){ + for(FileHandle file : mod.root.list()){ + //ignore special folders like bundles or sprites + if(file.isDirectory() && !specialFolders.contains(file.name())){ + //TODO calling child/parent on these files will give you gibberish; create wrapper class. + file.walk(f -> tree.addFile(mod.file.isDirectory() ? f.path().substring(1 + mod.file.path().length()) : f.path(), f)); + } + } + + //load up bundles. + FileHandle folder = mod.root.child("bundles"); + if(folder.exists()){ + for(FileHandle file : folder.list()){ + if(file.name().startsWith("bundle") && file.extension().equals("properties")){ + String name = file.nameWithoutExtension(); + bundles.getOr(name, Array::new).add(file); + } + } + } + } + + //add new keys to each bundle + I18NBundle bundle = Core.bundle; + while(bundle != null){ + String str = bundle.getLocale().toString(); + String locale = "bundle" + (str.isEmpty() ? "" : "_" + str); + for(FileHandle file : bundles.getOr(locale, Array::new)){ + try{ + PropertiesUtils.load(bundle.getProperties(), file.reader()); + }catch(Exception e){ + throw new RuntimeException("Error loading bundle: " + file + "/" + locale, e); + } + } + bundle = bundle.getParent(); + } + } + + /** Reloads all mod content. How does this even work? I refuse to believe that it functions correctly.*/ + public void reloadContent(){ + //epic memory leak + Core.atlas = new TextureAtlas(Core.files.internal("sprites/sprites.atlas")); + loaded.clear(); + disabled.clear(); + load(); + buildFiles(); + Musics.dispose(); + Sounds.dispose(); + Musics.load(); + Sounds.load(); + Core.assets.finishLoading(); + content.clear(); + content.createContent(); + loadAsync(); + loadSync(); + content.init(); + content.load(); + content.loadColors(); + data.load(); + requiresReload = false; + } + + /** Creates all the content found in mod files. */ + public void loadContent(){ + for(LoadedMod mod : loaded){ + if(mod.root.child("content").exists()){ + FileHandle contentRoot = mod.root.child("content"); + for(ContentType type : ContentType.all){ + FileHandle folder = contentRoot.child(type.name().toLowerCase() + "s"); + if(folder.exists()){ + for(FileHandle file : folder.list()){ + if(file.extension().equals("json")){ + try{ + //this binds the content but does not load it entirely + Content loaded = parser.parse(mod, file.nameWithoutExtension(), file.readString(), type); + Log.info("[{0}] Loaded '{1}'.", mod.meta.name, loaded); + }catch(Exception e){ + throw new RuntimeException("Failed to parse content file '" + file + "' for mod '" + mod.meta.name + "'.", e); + } + } + } + } + } + } + } + + //this finishes parsing content fields + parser.finishParsing(); + + each(Mod::loadContent); + } + + /** @return all loaded mods. */ + public Array all(){ + return loaded; + } + + /** @return all disabled mods. */ + public Array disabled(){ + return disabled; + } + + /** @return a list of mod names only, without versions. */ + public Array getModNames(){ + return loaded.select(l -> !l.meta.hidden).map(l -> l.name + ":" + l.meta.version); + } + + /** @return a list of mods and versions, in the format name:version. */ + public Array getModStrings(){ + return loaded.select(l -> !l.meta.hidden).map(l -> l.name + ":" + l.meta.version); + } + + /** Makes a mod enabled or disabled. shifts it.*/ + public void setEnabled(LoadedMod mod, boolean enabled){ + if(mod.enabled() != enabled){ + Core.settings.putSave(mod.name + "-enabled", enabled); + requiresReload = true; + if(!enabled){ + loaded.remove(mod); + disabled.add(mod); + }else{ + loaded.add(mod); + disabled.remove(mod); + } + } + } + + /** @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(); + for(String mod : mods){ + if(out.remove(mod)){ + result.remove(mod); + } + } + return result; + } + + /** Iterates through each mod with a main class.*/ + public void each(Consumer cons){ + loaded.each(p -> p.mod != null, p -> cons.accept(p.mod)); + } + + /** Loads a mod file+meta, but does not add it to the list. + * Note that directories can be loaded as mods.*/ + private LoadedMod loadMod(FileHandle sourceFile) throws Exception{ + FileHandle zip = sourceFile.isDirectory() ? sourceFile : new ZipFileHandle(sourceFile); + if(zip.list().length == 1 && zip.list()[0].isDirectory()){ + zip = zip.list()[0]; + } + + FileHandle metaf = zip.child("mod.json").exists() ? zip.child("mod.json") : zip.child("plugin.json"); + if(!metaf.exists()){ + Log.warn("Mod {0} doesn't have a 'mod.json'/'plugin.json' file, skipping.", sourceFile); + throw new IllegalArgumentException("No mod.json found."); + } + + ModMeta meta = json.fromJson(ModMeta.class, metaf.readString()); + String camelized = meta.name.replace(" ", ""); + String mainClass = meta.main == null ? camelized.toLowerCase() + "." + camelized + "Mod" : meta.main; + String baseName = meta.name.toLowerCase().replace(" ", "-"); + + if(loaded.contains(m -> m.name.equals(baseName)) || disabled.contains(m -> m.name.equals(baseName))){ + throw new IllegalArgumentException("A mod with the name '" + baseName + "' is already imported."); + } + + Mod mainMod; + + FileHandle mainFile = zip; + String[] path = (mainClass.replace('.', '/') + ".class").split("/"); + for(String str : path){ + if(!str.isEmpty()){ + mainFile = mainFile.child(str); + } + } + + //make sure the main class exists before loading it; if it doesn't just don't put it there + if(mainFile.exists()){ + //other platforms don't have standard java class loaders + if(!headless && Version.build != -1){ + throw new IllegalArgumentException("Java class mods are currently unsupported outside of custom builds."); + } + + URLClassLoader classLoader = new URLClassLoader(new URL[]{sourceFile.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); + Class main = classLoader.loadClass(mainClass); + metas.put(main, meta); + mainMod = (Mod)main.getDeclaredConstructor().newInstance(); + }else{ + mainMod = null; + } + + //all plugins are hidden implicitly + if(mainMod instanceof Plugin){ + meta.hidden = true; + } + + return new LoadedMod(sourceFile, zip, mainMod, meta); + } + + /** Represents a plugin that has been loaded from a jar file.*/ + public static class LoadedMod{ + /** The location of this mod's zip file/folder on the disk. */ + public final FileHandle file; + /** The root zip file; points to the contents of this mod. In the case of folders, this is the same as the mod's file. */ + public final FileHandle root; + /** The mod's main class; may be null. */ + public final @Nullable Mod mod; + /** Internal mod name. Used for textures. */ + public final String name; + /** This mod's metadata. */ + public final ModMeta meta; + + public LoadedMod(FileHandle file, FileHandle root, Mod mod, ModMeta meta){ + this.root = root; + this.file = file; + this.mod = mod; + this.meta = meta; + this.name = meta.name.toLowerCase().replace(" ", "-"); + } + + public boolean enabled(){ + return Core.settings.getBool(name + "-enabled", true); + } + } + + /** Plugin metadata information.*/ + public static class ModMeta{ + public String name, author, description, version, main; + public String[] dependencies = {}; //TODO implement + /** Hidden mods are only server-side or client-side, and do not support adding new content. */ + public boolean hidden; + } +} diff --git a/core/src/io/anuke/mindustry/net/CrashSender.java b/core/src/io/anuke/mindustry/net/CrashSender.java index 0e7d20c9f9..332371ff58 100644 --- a/core/src/io/anuke/mindustry/net/CrashSender.java +++ b/core/src/io/anuke/mindustry/net/CrashSender.java @@ -26,7 +26,7 @@ public class CrashSender{ exception.printStackTrace(); //don't create crash logs for custom builds, as it's expected - if(Version.build == -1) return; + if(Version.build == -1 || (System.getProperty("user.name").equals("anuke") && "release".equals(Version.modifier))) return; //attempt to load version regardless if(Version.number == 0){ @@ -93,6 +93,7 @@ public class CrashSender{ ex(() -> value.addChild("versionNumber", new JsonValue(Version.number))); ex(() -> value.addChild("versionModifier", new JsonValue(Version.modifier))); ex(() -> value.addChild("build", new JsonValue(Version.build))); + ex(() -> value.addChild("revision", new JsonValue(Version.revision))); ex(() -> value.addChild("net", new JsonValue(fn))); ex(() -> value.addChild("server", new JsonValue(fs))); ex(() -> value.addChild("players", new JsonValue(Vars.playerGroup.size()))); @@ -143,8 +144,7 @@ public class CrashSender{ private static void ex(Runnable r){ try{ r.run(); - }catch(Throwable t){ - t.printStackTrace(); + }catch(Throwable ignored){ } } } diff --git a/core/src/io/anuke/mindustry/net/Net.java b/core/src/io/anuke/mindustry/net/Net.java index eddd19c1e6..6cb22a7794 100644 --- a/core/src/io/anuke/mindustry/net/Net.java +++ b/core/src/io/anuke/mindustry/net/Net.java @@ -1,10 +1,10 @@ package io.anuke.mindustry.net; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.function.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.net.Packets.*; @@ -21,7 +21,8 @@ public class Net{ private boolean server; private boolean active; private boolean clientLoaded; - private @Nullable StreamBuilder currentStream; + private @Nullable + StreamBuilder currentStream; private final Array packetQueue = new Array<>(); private final ObjectMap, Consumer> clientListeners = new ObjectMap<>(); diff --git a/core/src/io/anuke/mindustry/net/NetConnection.java b/core/src/io/anuke/mindustry/net/NetConnection.java index a6bea925ba..f0d37b2e9f 100644 --- a/core/src/io/anuke/mindustry/net/NetConnection.java +++ b/core/src/io/anuke/mindustry/net/NetConnection.java @@ -1,7 +1,7 @@ package io.anuke.mindustry.net; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.net.Administration.*; @@ -15,7 +15,8 @@ import static io.anuke.mindustry.Vars.netServer; public abstract class NetConnection{ public final String address; public boolean mobile, modclient; - public @Nullable Player player; + public @Nullable + Player player; /** ID of last recieved client snapshot. */ public int lastRecievedClientSnapshot = -1; @@ -48,7 +49,7 @@ public abstract class NetConnection{ /** Kick with an arbitrary reason. */ public void kick(String reason){ - Log.info("Kicking connection {0}; Reason: {1}", address, reason); + Log.info("Kicking connection {0}; Reason: {1}", address, reason.replace("\n", " ")); if(player != null && player.uuid != null){ PlayerInfo info = netServer.admins.getInfo(player.uuid); diff --git a/core/src/io/anuke/mindustry/net/Packets.java b/core/src/io/anuke/mindustry/net/Packets.java index 117c9348c4..760728d945 100644 --- a/core/src/io/anuke/mindustry/net/Packets.java +++ b/core/src/io/anuke/mindustry/net/Packets.java @@ -1,6 +1,7 @@ package io.anuke.mindustry.net; import io.anuke.arc.Core; +import io.anuke.arc.collection.*; import io.anuke.arc.util.serialization.Base64Coder; import io.anuke.mindustry.game.Version; import io.anuke.mindustry.io.TypeIO; @@ -65,6 +66,7 @@ public class Packets{ public static class ConnectPacket implements Packet{ public int version; public String versionType; + public Array mods; public String name, uuid, usid; public boolean mobile; public int color; @@ -78,6 +80,10 @@ public class Packets{ buffer.put(mobile ? (byte)1 : 0); buffer.putInt(color); buffer.put(Base64Coder.decode(uuid)); + buffer.putInt(mods.size); + for(int i = 0; i < mods.size; i++){ + TypeIO.writeString(buffer, mods.get(i)); + } } @Override @@ -91,6 +97,11 @@ public class Packets{ byte[] idbytes = new byte[8]; buffer.get(idbytes); uuid = new String(Base64Coder.encode(idbytes)); + int totalMods = buffer.getInt(); + mods = new Array<>(totalMods); + for(int i = 0; i < totalMods; i++){ + mods.add(TypeIO.readString(buffer)); + } } } diff --git a/core/src/io/anuke/mindustry/plugin/Plugin.java b/core/src/io/anuke/mindustry/plugin/Plugin.java index e94ad6a7ae..d3f4da04da 100644 --- a/core/src/io/anuke/mindustry/plugin/Plugin.java +++ b/core/src/io/anuke/mindustry/plugin/Plugin.java @@ -1,28 +1,7 @@ package io.anuke.mindustry.plugin; -import io.anuke.arc.files.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.*; +import io.anuke.mindustry.mod.*; -public abstract class Plugin{ +public abstract class Plugin extends Mod{ - /** @return the config file for this plugin, as the file 'plugins/[plugin-name]/config.json'.*/ - public FileHandle getConfig(){ - return Vars.plugins.getConfig(this); - } - - /** Called after all plugins have been created and commands have been registered.*/ - public void init(){ - - } - - /** Register any commands to be used on the server side, e.g. from the console. */ - public void registerServerCommands(CommandHandler handler){ - - } - - /** Register any commands to be used on the client side, e.g. sent from an in-game player.. */ - public void registerClientCommands(CommandHandler handler){ - - } } diff --git a/core/src/io/anuke/mindustry/plugin/Plugins.java b/core/src/io/anuke/mindustry/plugin/Plugins.java deleted file mode 100644 index 946ec00f4f..0000000000 --- a/core/src/io/anuke/mindustry/plugin/Plugins.java +++ /dev/null @@ -1,93 +0,0 @@ -package io.anuke.mindustry.plugin; - -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.collection.*; -import io.anuke.arc.files.*; -import io.anuke.arc.function.*; -import io.anuke.arc.util.*; -import io.anuke.mindustry.io.*; - -import java.net.*; - -import static io.anuke.mindustry.Vars.pluginDirectory; - -public class Plugins{ - private Array loaded = new Array<>(); - private ObjectMap, PluginMeta> metas = new ObjectMap<>(); - - /** Returns a file named 'config.json' in a special folder for the specified plugin. - * Call this in init(). */ - public FileHandle getConfig(Plugin plugin){ - PluginMeta load = metas.get(plugin.getClass()); - if(load == null) throw new IllegalArgumentException("Plugin is not loaded yet (or missing)!"); - return pluginDirectory.child(load.name).child("config.json"); - } - - /** @return the loaded plugin found by class, or null if not found. */ - public @Nullable LoadedPlugin getPlugin(Class type){ - return loaded.find(l -> l.plugin.getClass() == type); - } - - /** Loads all plugins from the folder, but does call any methods on them.*/ - public void load(){ - for(FileHandle file : pluginDirectory.list()){ - if(!file.extension().equals("jar")) continue; - - try{ - loaded.add(loadPlugin(file)); - }catch(IllegalArgumentException ignored){ - }catch(Exception e){ - Log.err("Failed to load plugin file {0}. Skipping.", file); - e.printStackTrace(); - } - } - } - - /** @return all loaded plugins. */ - public Array all(){ - return loaded; - } - - /** Iterates through each plugin.*/ - public void each(Consumer cons){ - loaded.each(p -> cons.accept(p.plugin)); - } - - private LoadedPlugin loadPlugin(FileHandle jar) throws Exception{ - FileHandle zip = new ZipFileHandle(jar); - - FileHandle metaf = zip.child("plugin.json"); - if(!metaf.exists()){ - Log.warn("Plugin {0} doesn't have a 'plugin.json' file, skipping.", jar); - throw new IllegalArgumentException(); - } - - PluginMeta meta = JsonIO.read(PluginMeta.class, metaf.readString()); - - URLClassLoader classLoader = new URLClassLoader(new URL[]{jar.file().toURI().toURL()}, ClassLoader.getSystemClassLoader()); - Class main = classLoader.loadClass(meta.main); - metas.put(main, meta); - return new LoadedPlugin(jar, zip, (Plugin)main.getDeclaredConstructor().newInstance(), meta); - } - - /** Represents a plugin that has been loaded from a jar file.*/ - public static class LoadedPlugin{ - public final FileHandle jarFile; - public final FileHandle zipRoot; - public final Plugin plugin; - public final PluginMeta meta; - - public LoadedPlugin(FileHandle jarFile, FileHandle zipRoot, Plugin plugin, PluginMeta meta){ - this.zipRoot = zipRoot; - this.jarFile = jarFile; - this.plugin = plugin; - this.meta = meta; - } - } - - /** Plugin metadata information.*/ - public static class PluginMeta{ - public String name, author, main, description; - public String version; - } -} diff --git a/core/src/io/anuke/mindustry/type/ContentType.java b/core/src/io/anuke/mindustry/type/ContentType.java index 31ddcf35d2..f6b980a5d5 100644 --- a/core/src/io/anuke/mindustry/type/ContentType.java +++ b/core/src/io/anuke/mindustry/type/ContentType.java @@ -13,5 +13,7 @@ public enum ContentType{ effect, zone, loadout, - typeid + typeid; + + public static final ContentType[] all = values(); } diff --git a/core/src/io/anuke/mindustry/type/Item.java b/core/src/io/anuke/mindustry/type/Item.java index 19ca42e7b4..fa766dc505 100644 --- a/core/src/io/anuke/mindustry/type/Item.java +++ b/core/src/io/anuke/mindustry/type/Item.java @@ -3,7 +3,6 @@ package io.anuke.mindustry.type; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; -import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.ui.*; @@ -13,7 +12,6 @@ import static io.anuke.mindustry.Vars.content; public class Item extends UnlockableContent implements Comparable{ public final Color color; - private TextureRegion[] regions; /** type of the item; used for tabs and core acceptance. default value is {@link ItemType#resource}. */ public ItemType type = ItemType.resource; @@ -39,17 +37,8 @@ public class Item extends UnlockableContent implements Comparable{ this.description = Core.bundle.getOrNull("item." + this.name + ".description"); } - @Override - public void load(){ - regions = new TextureRegion[Icon.values().length]; - for(int i = 0; i < regions.length; i++){ - Icon icon = Icon.values()[i]; - regions[i] = Core.atlas.find(icon == Icon.large ? "item-" + name : "item-" + name + "-" + icon.name()); - } - } - - public TextureRegion icon(Icon icon){ - return regions[icon.ordinal()]; + public Item(String name){ + this(name, new Color(Color.black)); } @Override @@ -67,11 +56,6 @@ public class Item extends UnlockableContent implements Comparable{ return Core.bundle.get("item." + this.name + ".name"); } - @Override - public TextureRegion getContentIcon(){ - return icon(Icon.large); - } - @Override public String toString(){ return localizedName(); @@ -87,20 +71,6 @@ public class Item extends UnlockableContent implements Comparable{ return ContentType.item; } - public enum Icon{ - small(8 * 2), - medium(8 * 3), - large(8 * 4), - xlarge(8 * 5), - xxlarge(8 * 6); - - public final int size; - - Icon(int size){ - this.size = size; - } - } - /** Allocates a new array containing all items that generate ores. */ public static Array getAllOres(){ return content.blocks().select(b -> b instanceof OreBlock).map(b -> ((Floor)b).itemDrop); diff --git a/core/src/io/anuke/mindustry/type/ItemStack.java b/core/src/io/anuke/mindustry/type/ItemStack.java index 027a30ae36..9e428716dc 100644 --- a/core/src/io/anuke/mindustry/type/ItemStack.java +++ b/core/src/io/anuke/mindustry/type/ItemStack.java @@ -5,7 +5,7 @@ import io.anuke.mindustry.content.Items; public class ItemStack implements Comparable{ public Item item; - public int amount; + public int amount = 1; public ItemStack(Item item, int amount){ if(item == null) item = Items.copper; diff --git a/core/src/io/anuke/mindustry/type/Liquid.java b/core/src/io/anuke/mindustry/type/Liquid.java index bb3a0f363a..816e430c9c 100644 --- a/core/src/io/anuke/mindustry/type/Liquid.java +++ b/core/src/io/anuke/mindustry/type/Liquid.java @@ -1,12 +1,11 @@ package io.anuke.mindustry.type; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.content.StatusEffects; -import io.anuke.mindustry.game.UnlockableContent; -import io.anuke.mindustry.ui.ContentDisplay; +import io.anuke.arc.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.ui.*; public class Liquid extends UnlockableContent{ public final Color color; @@ -25,8 +24,6 @@ public class Liquid extends UnlockableContent{ public Color flameColor = Color.valueOf("ffb763"); /** The associated status effect. */ public StatusEffect effect = StatusEffects.none; - /** Displayed icon. TODO fix it by removing autogen, draw icons manually */ - public TextureRegion iconRegion; public Liquid(String name, Color color){ super(name); @@ -34,13 +31,13 @@ public class Liquid extends UnlockableContent{ this.description = Core.bundle.getOrNull("liquid." + name + ".description"); } - public boolean canExtinguish(){ - return flammability < 0.1f && temperature <= 0.5f; + /** For modding only.*/ + public Liquid(String name){ + this(name, new Color(Color.black)); } - @Override - public void load(){ - iconRegion = Core.atlas.find("liquid-" + name); + public boolean canExtinguish(){ + return flammability < 0.1f && temperature <= 0.5f; } @Override @@ -53,11 +50,6 @@ public class Liquid extends UnlockableContent{ return Core.bundle.get("liquid." + this.name + ".name"); } - @Override - public TextureRegion getContentIcon(){ - return iconRegion; - } - @Override public String toString(){ return localizedName(); diff --git a/core/src/io/anuke/mindustry/type/LiquidStack.java b/core/src/io/anuke/mindustry/type/LiquidStack.java index c4dcda7568..a861525778 100644 --- a/core/src/io/anuke/mindustry/type/LiquidStack.java +++ b/core/src/io/anuke/mindustry/type/LiquidStack.java @@ -9,6 +9,11 @@ public class LiquidStack{ this.amount = amount; } + /** serialization only*/ + protected LiquidStack(){ + + } + @Override public String toString(){ return "LiquidStack{" + diff --git a/core/src/io/anuke/mindustry/type/Mech.java b/core/src/io/anuke/mindustry/type/Mech.java index 1acea9eb77..2f9e64a9b4 100644 --- a/core/src/io/anuke/mindustry/type/Mech.java +++ b/core/src/io/anuke/mindustry/type/Mech.java @@ -33,7 +33,7 @@ public class Mech extends UnlockableContent{ public float weaponOffsetX, weaponOffsetY, engineOffset = 5f, engineSize = 2.5f; public Weapon weapon; - public TextureRegion baseRegion, legRegion, region, iconRegion; + public TextureRegion baseRegion, legRegion, region; public Mech(String name, boolean flying){ super(name); @@ -41,6 +41,10 @@ public class Mech extends UnlockableContent{ this.description = Core.bundle.get("mech." + name + ".description"); } + public Mech(String name){ + this(name, false); + } + public String localizedName(){ return Core.bundle.get("mech." + name + ".name"); } @@ -90,11 +94,6 @@ public class Mech extends UnlockableContent{ ContentDisplay.displayMech(table, this); } - @Override - public TextureRegion getContentIcon(){ - return iconRegion; - } - @Override public ContentType getContentType(){ return ContentType.mech; @@ -109,7 +108,6 @@ public class Mech extends UnlockableContent{ } region = Core.atlas.find(name); - iconRegion = Core.atlas.find("mech-icon-" + name); } @Override diff --git a/core/src/io/anuke/mindustry/type/UnitType.java b/core/src/io/anuke/mindustry/type/UnitType.java index a32590c1fd..1c75e27a08 100644 --- a/core/src/io/anuke/mindustry/type/UnitType.java +++ b/core/src/io/anuke/mindustry/type/UnitType.java @@ -6,6 +6,7 @@ import io.anuke.arc.collection.*; import io.anuke.arc.function.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; @@ -13,8 +14,8 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.ui.*; public class UnitType extends UnlockableContent{ - public final TypeID typeID; - public final Supplier constructor; + public @NonNull TypeID typeID; + public @NonNull Supplier constructor; public float health = 60; public float hitsize = 7f; @@ -25,7 +26,7 @@ public class UnitType extends UnlockableContent{ public float baseRotateSpeed = 0.1f; public float shootCone = 15f; public float mass = 1f; - public boolean isFlying; + public boolean flying; public boolean targetAir = true; public boolean rotateWeapon = false; public float drag = 0.1f; @@ -34,15 +35,24 @@ public class UnitType extends UnlockableContent{ public int itemCapacity = 30; public ObjectSet toMine = ObjectSet.with(Items.lead, Items.copper); public float buildPower = 0.3f, minePower = 0.7f; - public Weapon weapon; + public @NonNull Weapon weapon; public float weaponOffsetY, engineOffset = 6f, engineSize = 2f; public ObjectSet immunities = new ObjectSet<>(); public Sound deathSound = Sounds.bang; - public TextureRegion iconRegion, legRegion, baseRegion, region; + public TextureRegion legRegion, baseRegion, region; - public UnitType(String name, Class type, Supplier mainConstructor){ + public UnitType(String name, Supplier mainConstructor){ + this(name); + create(mainConstructor); + } + + public UnitType(String name){ super(name); + this.description = Core.bundle.getOrNull("unit." + name + ".description"); + } + + public void create(Supplier mainConstructor){ this.constructor = mainConstructor; this.description = Core.bundle.getOrNull("unit." + name + ".description"); this.typeID = new TypeID(name, mainConstructor); @@ -58,15 +68,9 @@ public class UnitType extends UnlockableContent{ return Core.bundle.get("unit." + name + ".name"); } - @Override - public TextureRegion getContentIcon(){ - return iconRegion; - } - @Override public void load(){ weapon.load(); - iconRegion = Core.atlas.find("unit-icon-" + name, Core.atlas.find(name)); region = Core.atlas.find(name); legRegion = Core.atlas.find(name + "-leg"); baseRegion = Core.atlas.find(name + "-base"); diff --git a/core/src/io/anuke/mindustry/type/Weapon.java b/core/src/io/anuke/mindustry/type/Weapon.java index 980859c01d..de70c5f3d3 100644 --- a/core/src/io/anuke/mindustry/type/Weapon.java +++ b/core/src/io/anuke/mindustry/type/Weapon.java @@ -6,6 +6,7 @@ import io.anuke.arc.audio.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; @@ -25,7 +26,7 @@ public class Weapon{ protected static float minPlayerDist = 20f; protected static int sequenceNum = 0; /** bullet shot */ - public BulletType bullet; + public @NonNull BulletType bullet; /** shell ejection effect */ public Effect ejectEffect = Fx.none; /** weapon reload in frames */ diff --git a/core/src/io/anuke/mindustry/type/Zone.java b/core/src/io/anuke/mindustry/type/Zone.java index 8bfd5a0ebf..3a499996c4 100644 --- a/core/src/io/anuke/mindustry/type/Zone.java +++ b/core/src/io/anuke/mindustry/type/Zone.java @@ -6,6 +6,7 @@ import io.anuke.arc.function.*; import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; @@ -17,7 +18,7 @@ import java.util.*; import static io.anuke.mindustry.Vars.*; public class Zone extends UnlockableContent{ - public final Generator generator; + public @NonNull Generator generator; public Block[] blockRequirements = {}; public ZoneRequirement[] zoneRequirements = {}; public Item[] resources = {}; @@ -40,9 +41,13 @@ public class Zone extends UnlockableContent{ this.generator = generator; } + public Zone(String name){ + this(name, new MapGenerator(name)); + } + @Override public void load(){ - preview = Core.atlas.find("zone-" + name); + preview = Core.atlas.find("zone-" + name, Core.atlas.find(name + "-zone")); } public Rules getRules(){ @@ -193,11 +198,6 @@ public class Zone extends UnlockableContent{ public void displayInfo(Table table){ } - @Override - public TextureRegion getContentIcon(){ - return null; - } - @Override public String localizedName(){ return Core.bundle.get("zone." + name + ".name"); @@ -209,14 +209,18 @@ public class Zone extends UnlockableContent{ } public static class ZoneRequirement{ - public final Zone zone; - public final int wave; + public @NonNull Zone zone; + public @NonNull int wave; public ZoneRequirement(Zone zone, int wave){ this.zone = zone; this.wave = wave; } + protected ZoneRequirement(){ + + } + public static ZoneRequirement[] with(Object... objects){ ZoneRequirement[] out = new ZoneRequirement[objects.length / 2]; for(int i = 0; i < objects.length; i += 2){ diff --git a/core/src/io/anuke/mindustry/ui/Bar.java b/core/src/io/anuke/mindustry/ui/Bar.java index 3937a950ff..56c17befae 100644 --- a/core/src/io/anuke/mindustry/ui/Bar.java +++ b/core/src/io/anuke/mindustry/ui/Bar.java @@ -41,6 +41,10 @@ public class Bar extends Element{ } + public void reset(float value){ + this.value = lastValue = blink = value; + } + public void set(Supplier name, FloatProvider fraction, Color color){ this.fraction = fraction; this.lastValue = fraction.get(); diff --git a/core/src/io/anuke/mindustry/ui/ContentDisplay.java b/core/src/io/anuke/mindustry/ui/ContentDisplay.java index afab2468c6..8245047e0f 100644 --- a/core/src/io/anuke/mindustry/ui/ContentDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ContentDisplay.java @@ -1,15 +1,14 @@ package io.anuke.mindustry.ui; -import io.anuke.arc.Core; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.OrderedMap; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.arc.util.Strings; -import io.anuke.mindustry.graphics.Pal; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Block.Icon; +import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.meta.*; public class ContentDisplay{ @@ -19,7 +18,7 @@ public class ContentDisplay{ table.table(title -> { int size = 8 * 6; - title.addImage(block.icon(Icon.large)).size(size); + title.addImage(block.icon(Cicon.xlarge)).size(size); title.add("[accent]" + block.localizedName).padLeft(5); }); @@ -67,7 +66,7 @@ public class ContentDisplay{ public static void displayItem(Table table, Item item){ table.table(title -> { - title.addImage(item.getContentIcon()).size(8 * 6); + title.addImage(item.icon(Cicon.xlarge)).size(8 * 6); title.add("[accent]" + item.localizedName()).padLeft(5); }); @@ -98,7 +97,7 @@ public class ContentDisplay{ public static void displayLiquid(Table table, Liquid liquid){ table.table(title -> { - title.addImage(liquid.getContentIcon()).size(8 * 6); + title.addImage(liquid.icon(Cicon.xlarge)).size(8 * 6); title.add("[accent]" + liquid.localizedName()).padLeft(5); }); @@ -132,7 +131,7 @@ public class ContentDisplay{ public static void displayMech(Table table, Mech mech){ table.table(title -> { - title.addImage(mech.getContentIcon()).size(8 * 6); + title.addImage(mech.icon(Cicon.xlarge)).size(8 * 6); title.add("[accent]" + mech.localizedName()).padLeft(5); }); table.left().defaults().left(); @@ -180,7 +179,7 @@ public class ContentDisplay{ public static void displayUnit(Table table, UnitType unit){ table.table(title -> { - title.addImage(unit.getContentIcon()).size(8 * 6); + title.addImage(unit.icon(Cicon.xlarge)).size(8 * 6); title.add("[accent]" + unit.localizedName()).padLeft(5); }); diff --git a/core/src/io/anuke/mindustry/ui/ItemImage.java b/core/src/io/anuke/mindustry/ui/ItemImage.java index b2f790570b..22edaedd75 100644 --- a/core/src/io/anuke/mindustry/ui/ItemImage.java +++ b/core/src/io/anuke/mindustry/ui/ItemImage.java @@ -1,11 +1,10 @@ package io.anuke.mindustry.ui; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.scene.ui.Image; -import io.anuke.arc.scene.ui.layout.Stack; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.type.Item.Icon; -import io.anuke.mindustry.type.ItemStack; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.scene.ui.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.type.*; public class ItemImage extends Stack{ @@ -25,7 +24,7 @@ public class ItemImage extends Stack{ } public ItemImage(ItemStack stack){ - add(new Image(stack.item.icon(Icon.large))); + add(new Image(stack.item.icon(Cicon.medium))); if(stack.amount != 0){ Table t = new Table().left().bottom(); diff --git a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java b/core/src/io/anuke/mindustry/ui/ItemsDisplay.java index 81f0732c81..5e820ba459 100644 --- a/core/src/io/anuke/mindustry/ui/ItemsDisplay.java +++ b/core/src/io/anuke/mindustry/ui/ItemsDisplay.java @@ -1,22 +1,17 @@ package io.anuke.mindustry.ui; -import io.anuke.arc.collection.ObjectIntMap; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.scene.ui.layout.Table; +import io.anuke.arc.graphics.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Item.Icon; -import io.anuke.mindustry.type.ItemType; +import io.anuke.mindustry.type.*; -import java.text.NumberFormat; -import java.util.Locale; - -import static io.anuke.mindustry.Vars.content; -import static io.anuke.mindustry.Vars.data; +import static io.anuke.mindustry.Vars.*; /** Displays a list of items, e.g. launched items.*/ public class ItemsDisplay extends Table{ - private static final NumberFormat format = NumberFormat.getNumberInstance(Locale.getDefault()); + private StringBuilder builder = new StringBuilder(); public ItemsDisplay(){ rebuild(); @@ -29,17 +24,26 @@ public class ItemsDisplay extends Table{ table(Tex.button,t -> { t.margin(10).marginLeft(15).marginTop(15f); - t.add("$launcheditems").colspan(3).left().padBottom(5); + t.label(() -> state.is(State.menu) ? "$launcheditems" : "$launchinfo").colspan(3).padBottom(4).left().colspan(3).width(210f).wrap(); t.row(); - ObjectIntMap items = data.items(); for(Item item : content.items()){ if(item.type == ItemType.material && data.isUnlocked(item)){ - t.label(() -> format.format(items.get(item, 0))).left(); - t.addImage(item.icon(Icon.medium)).size(8 * 3).padLeft(4).padRight(4); + t.label(() -> format(item)).left(); + t.addImage(item.icon(Cicon.small)).size(8 * 3).padLeft(4).padRight(4); t.add(item.localizedName()).color(Color.lightGray).left(); t.row(); } } }); } + + private String format(Item item){ + builder.setLength(0); + builder.append(ui.formatAmount(data.items().get(item, 0))); + if(!state.is(State.menu) && !state.teams.get(player.getTeam()).cores.isEmpty() && state.teams.get(player.getTeam()).cores.first().entity != null && state.teams.get(player.getTeam()).cores.first().entity.items.get(item) > 0){ + builder.append(" [unlaunched]+ "); + builder.append(ui.formatAmount(state.teams.get(player.getTeam()).cores.first().entity.items.get(item))); + } + return builder.toString(); + } } diff --git a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java index 993cf48863..160ab843c7 100644 --- a/core/src/io/anuke/mindustry/ui/LiquidDisplay.java +++ b/core/src/io/anuke/mindustry/ui/LiquidDisplay.java @@ -5,6 +5,7 @@ import io.anuke.arc.scene.ui.Image; import io.anuke.arc.scene.ui.layout.Stack; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.util.Strings; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.world.meta.StatUnit; @@ -20,7 +21,7 @@ public class LiquidDisplay extends Table{ this.perSecond = perSecond; add(new Stack(){{ - add(new Image(liquid.getContentIcon())); + add(new Image(liquid.icon(Cicon.medium))); if(amount != 0){ Table t = new Table().left().bottom(); diff --git a/core/src/io/anuke/mindustry/ui/Minimap.java b/core/src/io/anuke/mindustry/ui/Minimap.java index 16acc67a57..d4cba3bc33 100644 --- a/core/src/io/anuke/mindustry/ui/Minimap.java +++ b/core/src/io/anuke/mindustry/ui/Minimap.java @@ -91,8 +91,8 @@ public class Minimap extends Table{ Element e = Core.scene.hit(Core.input.mouseX(), Core.input.mouseY(), true); if(e != null && e.isDescendantOf(this)){ - Core.scene.setScrollFocus(this); - }else if(Core.scene.getScrollFocus() == this){ + requestScroll(); + }else if(hasScroll()){ Core.scene.setScrollFocus(null); } }); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java index 58cf4cb4eb..10f418c1de 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/CustomRulesDialog.java @@ -42,6 +42,8 @@ public class CustomRulesDialog extends FloatingDialog{ main.addButton("$settings.reset", () -> { rules = resetter.get(); setup(); + requestKeyboard(); + requestScroll(); }).size(300f, 50f); main.left().defaults().fillX().left().pad(5); main.row(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java index 3381b029f2..4c25761cb4 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DatabaseDialog.java @@ -10,8 +10,7 @@ import io.anuke.arc.scene.ui.layout.Table; import io.anuke.arc.util.Time; import io.anuke.mindustry.Vars; import io.anuke.mindustry.core.GameState.State; -import io.anuke.mindustry.game.Content; -import io.anuke.mindustry.game.UnlockableContent; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.Pal; import io.anuke.mindustry.type.ContentType; @@ -56,7 +55,7 @@ public class DatabaseDialog extends FloatingDialog{ for(int i = 0; i < array.size; i++){ UnlockableContent unlock = (UnlockableContent)array.get(i); - Image image = unlocked(unlock) ? new Image(unlock.getContentIcon()) : new Image(Icon.lockedSmall, Pal.gray); + Image image = unlocked(unlock) ? new Image(unlock.icon(Cicon.medium)) : new Image(Icon.lockedSmall, Pal.gray); list.add(image).size(8*4).pad(3); ClickListener listener = new ClickListener(); image.addListener(listener); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java index 1ba3c9ca82..86841152e8 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/DeployDialog.java @@ -103,19 +103,21 @@ public class DeployDialog extends FloatingDialog{ } TextButton button = Elements.newButton(Core.bundle.format("resume", slot.getZone().localizedName()), Styles.squaret, () -> { - hide(); - ui.loadAnd(() -> { - logic.reset(); - net.reset(); - try{ - control.saves.getZoneSlot().load(); - state.set(State.playing); - }catch(SaveException e){ //make sure to handle any save load errors! - e.printStackTrace(); - if(control.saves.getZoneSlot() != null) control.saves.getZoneSlot().delete(); - Core.app.post(() -> ui.showInfo("$save.corrupted")); - show(); - } + control.saves.getZoneSlot().cautiousLoad(() -> { + hide(); + ui.loadAnd(() -> { + logic.reset(); + net.reset(); + try{ + slot.load(); + state.set(State.playing); + }catch(SaveException e){ //make sure to handle any save load errors! + e.printStackTrace(); + if(control.saves.getZoneSlot() != null) control.saves.getZoneSlot().delete(); + Core.app.post(() -> ui.showInfo("$save.corrupted")); + show(); + } + }); }); }); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java index b7faca0abe..75b260594b 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/FileChooser.java @@ -216,7 +216,9 @@ public class FileChooser extends FloatingDialog{ String filename = file.name(); - TextButton button = new TextButton(shorten(filename), Styles.clearTogglet); + TextButton button = new TextButton(filename, Styles.clearTogglet); + button.getLabel().setWrap(false); + button.getLabel().setEllipsis(true); group.add(button); button.clicked(() -> { diff --git a/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java index 02d967ac26..1e8bcfad87 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/GameOverDialog.java @@ -2,11 +2,10 @@ package io.anuke.mindustry.ui.dialogs; import io.anuke.arc.*; import io.anuke.mindustry.core.GameState.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Stats.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.type.Item.*; import static io.anuke.mindustry.Vars.*; @@ -69,7 +68,7 @@ public class GameOverDialog extends FloatingDialog{ if(state.stats.itemsDelivered.get(item, 0) > 0){ t.table(items -> { items.add(" [LIGHT_GRAY]" + state.stats.itemsDelivered.get(item, 0)); - items.addImage(item.icon(Icon.medium)).size(8 * 3).pad(4); + items.addImage(item.icon(Cicon.small)).size(8 * 3).pad(4); }).left(); t.row(); } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java index 8391135c22..ffa0ee3eb4 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/HostDialog.java @@ -70,7 +70,7 @@ public class HostDialog extends FloatingDialog{ if(steam){ Core.app.post(() -> Core.settings.getBoolOnce("steampublic", () -> { - ui.showConfirm("$setting.publichost.name", "$public.confirm", () -> { + ui.showCustomConfirm("$setting.publichost.name", "$public.confirm", "$yes", "$no", () -> { Core.settings.putSave("publichost", true); platform.updateLobby(); }); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java index 1570f5bcbb..d6d579a787 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/JoinDialog.java @@ -38,7 +38,9 @@ public class JoinDialog extends FloatingDialog{ addCloseButton(); buttons.add().growX(); - buttons.addButton("?", () -> ui.showInfo("$join.info")).size(60f, 64f); + if(!steam){ + buttons.addButton("?", () -> ui.showInfo("$join.info")).size(60f, 64f); + } add = new FloatingDialog("$joingame.title"); add.cont.add("$joingame.ip").padRight(5f).left(); @@ -87,7 +89,9 @@ public class JoinDialog extends FloatingDialog{ refreshLocal(); refreshRemote(); - Core.app.post(() -> Core.settings.getBoolOnce("joininfo", () -> ui.showInfo("$join.info"))); + if(!steam){ + Core.app.post(() -> Core.settings.getBoolOnce("joininfo", () -> ui.showInfo("$join.info"))); + } }); onResize(this::setup); @@ -198,11 +202,13 @@ public class JoinDialog extends FloatingDialog{ }else if(host.version > Version.build && Version.build != -1){ versionString = Core.bundle.get("server.outdated.client") + "\n" + Core.bundle.format("server.version", host.version, ""); + }else if(host.version == Version.build && Version.type.equals(host.versionType)){ + //not important + versionString = ""; }else{ versionString = Core.bundle.format("server.version", host.version, host.versionType); } - content.table(t -> { t.add("[lightgray]" + host.name + " " + versionString).width(targetWidth() - 10f).left().get().setEllipsis(true); t.row(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java index 279731417e..815a5b6516 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadDialog.java @@ -168,8 +168,6 @@ public class LoadDialog extends FloatingDialog{ slots.row(); - if(ios) return; - slots.addImageTextButton("$save.import", Icon.add, () -> { platform.showFileChooser(true, saveExtension, file -> { if(SaveIO.isSaveValid(file)){ @@ -188,22 +186,23 @@ public class LoadDialog extends FloatingDialog{ } public void runLoadSave(SaveSlot slot){ - hide(); - ui.paused.hide(); - - ui.loadAnd(() -> { - try{ - net.reset(); - slot.load(); - state.rules.editor = false; - state.rules.zone = null; - state.set(State.playing); - }catch(SaveException e){ - Log.err(e); - state.set(State.menu); - logic.reset(); - ui.showErrorMessage("$save.corrupted"); - } + slot.cautiousLoad(() -> { + ui.loadAnd(() -> { + hide(); + ui.paused.hide(); + try{ + net.reset(); + slot.load(); + state.rules.editor = false; + state.rules.zone = null; + state.set(State.playing); + }catch(SaveException e){ + Log.err(e); + state.set(State.menu); + logic.reset(); + ui.showErrorMessage("$save.corrupted"); + } + }); }); } diff --git a/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java index ca5302f4f5..9e541990e6 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/LoadoutDialog.java @@ -7,6 +7,7 @@ import io.anuke.arc.input.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; @@ -55,7 +56,7 @@ public class LoadoutDialog extends FloatingDialog{ }).size(300f, 36f).get(); button.clearChildren(); button.left(); - button.addImage(item.icon(Item.Icon.medium)).size(8 * 3).pad(4); + button.addImage(item.icon(Cicon.small)).size(8 * 3).pad(4); button.add(item.localizedName); dialog.cont.row(); } @@ -118,7 +119,7 @@ public class LoadoutDialog extends FloatingDialog{ ui.showInfo(Core.bundle.format("configure.invalid", capacity)); })).size(bsize); - items.addImage(stack.item.icon(Item.Icon.medium)).size(8 * 3).padRight(4).padLeft(4); + items.addImage(stack.item.icon(Cicon.small)).size(8 * 3).padRight(4).padLeft(4); items.label(() -> stack.amount + "").left(); items.row(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapPlayDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/MapPlayDialog.java index b3da2b2f3f..de6dccaefe 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapPlayDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/MapPlayDialog.java @@ -1,10 +1,10 @@ package io.anuke.mindustry.ui.dialogs; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.maps.*; @@ -15,7 +15,8 @@ import static io.anuke.mindustry.Vars.*; public class MapPlayDialog extends FloatingDialog{ CustomRulesDialog dialog = new CustomRulesDialog(); Rules rules; - @NonNull Gamemode selectedGamemode = Gamemode.survival; + @NonNull + Gamemode selectedGamemode = Gamemode.survival; Map lastMap; public MapPlayDialog(){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java index f8a7e36a97..968cb0983f 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/MapsDialog.java @@ -43,7 +43,7 @@ public class MapsDialog extends FloatingDialog{ void setup(){ buttons.clearChildren(); - if(Core.graphics.isPortrait() && !ios){ + if(Core.graphics.isPortrait()){ buttons.addImageTextButton("$back", Icon.arrowLeft, this::hide).size(210f*2f, 64f).colspan(2); buttons.row(); }else{ @@ -67,55 +67,54 @@ public class MapsDialog extends FloatingDialog{ }); }).size(210f, 64f); - if(!ios){ - buttons.addImageTextButton("$editor.importmap", Icon.load, () -> { - platform.showFileChooser(true, mapExtension, file -> { - ui.loadAnd(() -> { - maps.tryCatchMapError(() -> { - if(MapIO.isImage(file)){ - ui.showErrorMessage("$editor.errorimage"); - return; - } + buttons.addImageTextButton("$editor.importmap", Icon.load, () -> { + platform.showFileChooser(true, mapExtension, file -> { + ui.loadAnd(() -> { + maps.tryCatchMapError(() -> { + if(MapIO.isImage(file)){ + ui.showErrorMessage("$editor.errorimage"); + return; + } - Map map = MapIO.createMap(file, true); + Map map = MapIO.createMap(file, true); - //when you attempt to import a save, it will have no name, so generate one - String name = map.tags.getOr("name", () -> { - String result = "unknown"; - int number = 0; - while(maps.byName(result + number++) != null); - return result + number; - }); - - //this will never actually get called, but it remains just in case - if(name == null){ - ui.showErrorMessage("$editor.errorname"); - return; - } - - Map conflict = maps.all().find(m -> m.name().equals(name)); - - if(conflict != null && !conflict.custom){ - ui.showInfo(Core.bundle.format("editor.import.exists", name)); - }else if(conflict != null){ - ui.showConfirm("$confirm", "$editor.overwrite.confirm", () -> { - maps.tryCatchMapError(() -> { - maps.removeMap(conflict); - maps.importMap(map.file); - setup(); - }); - }); - }else{ - maps.importMap(map.file); - setup(); - } - + //when you attempt to import a save, it will have no name, so generate one + String name = map.tags.getOr("name", () -> { + String result = "unknown"; + int number = 0; + while(maps.byName(result + number++) != null); + return result + number; }); + + //this will never actually get called, but it remains just in case + if(name == null){ + ui.showErrorMessage("$editor.errorname"); + return; + } + + Map conflict = maps.all().find(m -> m.name().equals(name)); + + if(conflict != null && !conflict.custom){ + ui.showInfo(Core.bundle.format("editor.import.exists", name)); + }else if(conflict != null){ + ui.showConfirm("$confirm", "$editor.overwrite.confirm", () -> { + maps.tryCatchMapError(() -> { + maps.removeMap(conflict); + maps.importMap(map.file); + setup(); + }); + }); + }else{ + maps.importMap(map.file); + setup(); + } + }); }); - }).size(210f, 64f); - } + }); + }).size(210f, 64f); + cont.clear(); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java new file mode 100644 index 0000000000..183a542af4 --- /dev/null +++ b/core/src/io/anuke/mindustry/ui/dialogs/ModsDialog.java @@ -0,0 +1,140 @@ +package io.anuke.mindustry.ui.dialogs; + +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.util.*; +import io.anuke.arc.util.io.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.graphics.*; +import io.anuke.mindustry.mod.Mods.*; +import io.anuke.mindustry.ui.*; + +import java.io.*; + +import static io.anuke.mindustry.Vars.*; + +public class ModsDialog extends FloatingDialog{ + + public ModsDialog(){ + super("$mods"); + addCloseButton(); + + buttons.addImageTextButton("$mods.report", Icon.link, + () -> Core.net.openURI(reportIssueURL)) + .size(250f, 64f); + + buttons.addImageTextButton("$mods.guide", Icon.wiki, + () -> Core.net.openURI(modGuideURL)) + .size(280f, 64f); + + shown(this::setup); + + hidden(() -> { + if(mods.requiresReload()){ + ui.loadAnd("$reloading", () -> { + mods.reloadContent(); + }); + } + }); + + shown(() -> Core.app.post(() -> { + Core.settings.getBoolOnce("modsalpha", () -> { + ui.showText("$mods", "$mods.alphainfo"); + }); + })); + } + + void setup(){ + cont.clear(); + cont.defaults().width(520f).pad(4); + cont.add("$mod.reloadrequired").visible(mods::requiresReload).center().get().setAlignment(Align.center); + cont.row(); + if(!(mods.all().isEmpty() && mods.disabled().isEmpty())){ + cont.pane(table -> { + table.margin(10f).top(); + Array all = Array.withArrays(mods.all(), mods.disabled()); + + boolean anyDisabled = false; + for(LoadedMod mod : all){ + if(!mod.enabled() && !anyDisabled && mods.all().size > 0){ + anyDisabled = true; + table.row(); + table.addImage().growX().height(4f).pad(6f).color(Pal.gray); + } + + table.table(Styles.black6, t -> { + t.defaults().pad(2).left().top(); + t.margin(14f).left(); + t.table(title -> { + title.left(); + title.add("[accent]" + mod.meta.name + "[lightgray] v" + mod.meta.version + (" | " + Core.bundle.get(mod.enabled() ? "mod.enabled" : "mod.disabled"))); + title.add().growX(); + + title.addImageTextButton(mod.enabled() ? "$mod.disable" : "$mod.enable", mod.enabled() ? Icon.arrowDownSmall : Icon.arrowUpSmall, Styles.cleart, () -> { + mods.setEnabled(mod, !mod.enabled()); + setup(); + }).height(50f).margin(8f).width(130f); + + title.addImageButton(Icon.trash16Small, Styles.cleari, () -> ui.showConfirm("$confirm", "$mod.remove.confirm", () -> { + mods.removeMod(mod); + setup(); + })).size(50f); + }).growX().left().padTop(-14f).padRight(-14f); + + t.row(); + if(mod.meta.author != null){ + t.add(Core.bundle.format("mod.author", mod.meta.author)); + t.row(); + } + if(mod.meta.description != null){ + t.labelWrap("[lightgray]" + mod.meta.description).growX(); + t.row(); + } + + }).width(500f); + table.row(); + } + }); + + }else{ + cont.table(Styles.black6, t -> t.add("$mods.none")).height(80f); + } + + cont.row(); + + cont.addImageTextButton("$mod.import", Icon.add, () -> { + platform.showFileChooser(true, "zip", file -> { + try{ + mods.importMod(file); + setup(); + }catch(IOException e){ + ui.showException(e); + e.printStackTrace(); + } + }); + }).margin(12f).width(500f); + + //not well tested currently + if(Version.build == -1){ + cont.row(); + + cont.addImageTextButton("$mod.import.github", Icon.github, () -> { + ui.showTextInput("$mod.import.github", "", "Anuken/ExampleMod", text -> { + Core.net.httpGet("http://api.github.com/repos/" + text + "/zipball/master", loc -> { + Core.net.httpGet(loc.getHeader("Location"), result -> { + try{ + Streams.copyStream(result.getResultAsStream(), modDirectory.child(text.replace("/", "") + ".zip").write(false)); + ui.loadAnd(() -> { + mods.reloadContent(); + }); + }catch(Exception e){ + ui.showException(e); + } + }, ui::showException); + }, ui::showException); + }); + }).margin(12f).width(500f); + } + } +} \ No newline at end of file diff --git a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java index 58139cd3ed..cc89bd8c47 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/SettingsMenuDialog.java @@ -250,7 +250,7 @@ public class SettingsMenuDialog extends SettingsDialog{ } return s + "%"; }); - graphics.sliderPref("fpscap", 240, 5, 245, 5, s -> (s > 240 ? Core.bundle.get("setting.fpscap.none") : Core.bundle.format("setting.fpscap.text", s))); + graphics.sliderPref("fpscap", 240, 15, 245, 5, s -> (s > 240 ? Core.bundle.get("setting.fpscap.none") : Core.bundle.format("setting.fpscap.text", s))); graphics.sliderPref("chatopacity", 100, 0, 100, 5, s -> s + "%"); if(!mobile){ @@ -317,6 +317,10 @@ public class SettingsMenuDialog extends SettingsDialog{ tex.setFilter(filter, filter); } } + + if(!mobile){ + Core.settings.put("swapdiagonal", false); + } } private void back(){ diff --git a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java index 21e5f76ce2..f583251295 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/TechTreeDialog.java @@ -15,14 +15,13 @@ import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.content.TechTree.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.ui.Styles; import io.anuke.mindustry.ui.TreeLayout.*; -import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -144,7 +143,7 @@ public class TechTreeDialog extends FloatingDialog{ infoTable.touchable(Touchable.enabled); for(TechTreeNode node : nodes){ - ImageButton button = new ImageButton(node.node.block.icon(Block.Icon.medium), Styles.nodei); + ImageButton button = new ImageButton(node.node.block.icon(Cicon.medium), Styles.nodei); button.visible(() -> node.visible); button.clicked(() -> { if(mobile){ @@ -190,7 +189,7 @@ public class TechTreeDialog extends FloatingDialog{ 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; ((TextureRegionDrawable)button.getStyle().imageUp) - .setRegion(node.visible ? node.node.block.icon(Block.Icon.medium) : Core.atlas.find("icon-locked")); + .setRegion(node.visible ? node.node.block.icon(Cicon.medium) : Core.atlas.find("icon-locked")); button.getImage().setColor(!locked(node.node) ? Color.white : Color.gray); }); addChild(button); @@ -277,7 +276,7 @@ public class TechTreeDialog extends FloatingDialog{ for(ItemStack req : node.requirements){ t.table(list -> { list.left(); - list.addImage(req.item.icon(Item.Icon.medium)).size(8 * 3).padRight(3); + list.addImage(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)); diff --git a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java index 910f4516af..ab943f8f5b 100644 --- a/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java +++ b/core/src/io/anuke/mindustry/ui/dialogs/ZoneInfoDialog.java @@ -45,7 +45,7 @@ public class ZoneInfoDialog extends FloatingDialog{ if(i++ % 2 == 0){ iteminfo.row(); } - iteminfo.addImage(stack.item.icon(Item.Icon.medium)).size(8 * 3).padRight(1); + iteminfo.addImage(stack.item.icon(Cicon.small)).size(8 * 3).padRight(1); iteminfo.add(stack.amount + "").color(Color.lightGray).padRight(5); } }; @@ -82,7 +82,7 @@ public class ZoneInfoDialog extends FloatingDialog{ r.add("$research.list").colspan(2).left(); r.row(); for(Block block : zone.blockRequirements){ - r.addImage(block.icon(Block.Icon.small)).size(8 * 3).padRight(4); + r.addImage(block.icon(Cicon.small)).size(8 * 3).padRight(4); r.add(block.localizedName).color(Color.lightGray); r.addImage(data.isUnlocked(block) ? Icon.checkSmall : Icon.cancelSmall, data.isUnlocked(block) ? Color.lightGray : Color.scarlet).padLeft(3); r.row(); @@ -111,7 +111,7 @@ public class ZoneInfoDialog extends FloatingDialog{ t.left(); int i = 0; for(Item item : zone.resources){ - r.addImage(item.icon(Item.Icon.medium)).size(8 * 3); + r.addImage(item.icon(Cicon.small)).size(8 * 3); if(++i % 4 == 0){ r.row(); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java index 44f063b6e4..316990d8bf 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/BlockInventoryFragment.java @@ -1,32 +1,27 @@ package io.anuke.mindustry.ui.fragments; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; +import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; -import io.anuke.arc.collection.IntSet; -import io.anuke.arc.function.BooleanProvider; -import io.anuke.arc.function.Supplier; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.input.KeyCode; -import io.anuke.arc.math.Interpolation; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.scene.Element; -import io.anuke.arc.scene.Group; -import io.anuke.arc.scene.actions.Actions; +import io.anuke.arc.collection.*; +import io.anuke.arc.function.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.input.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; +import io.anuke.arc.scene.*; +import io.anuke.arc.scene.actions.*; import io.anuke.arc.scene.event.*; -import io.anuke.arc.scene.ui.Image; -import io.anuke.arc.scene.ui.layout.Stack; -import io.anuke.arc.scene.ui.layout.Table; +import io.anuke.arc.scene.ui.*; +import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.core.GameState.State; +import io.anuke.mindustry.core.GameState.*; import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.Player; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Item.Icon; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.*; @@ -140,7 +135,7 @@ public class BlockInventoryFragment extends Fragment{ HandCursorListener l = new HandCursorListener(); l.setEnabled(canPick); - Element image = itemImage(item.icon(Icon.xlarge), () -> { + Element image = itemImage(item.icon(Cicon.xlarge), () -> { if(tile == null || tile.entity == null){ return ""; } diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java index 5196a97119..e80ef059ac 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java @@ -187,10 +187,10 @@ public class HudFragment extends Fragment{ FloatingDialog dialog = new FloatingDialog("$editor.spawn"); int i = 0; for(UnitType type : content.getBy(ContentType.unit)){ - dialog.cont.addImageButton(Tex.whiteui, 48, () -> { + dialog.cont.addImageButton(Tex.whiteui, 8 * 6f, () -> { Call.spawnUnitEditor(player, type); dialog.hide(); - }).get().getStyle().imageUp = new TextureRegionDrawable(type.iconRegion); + }).get().getStyle().imageUp = new TextureRegionDrawable(type.icon(Cicon.xlarge)); if(++i % 4 == 0) dialog.cont.row(); } dialog.addCloseButton(); @@ -421,7 +421,7 @@ public class HudFragment extends Fragment{ public void showUnlock(UnlockableContent content){ //some content may not have icons... yet //also don't play in the tutorial to prevent confusion - if(content.getContentIcon() == null || state.is(State.menu) || state.rules.tutorial) return; + if(state.is(State.menu) || state.rules.tutorial) return; Sounds.message.play(); @@ -441,10 +441,10 @@ public class HudFragment extends Fragment{ Table in = new Table(); //create texture stack for displaying - Image image = new Image(content.getContentIcon()); + Image image = new Image(content.icon(Cicon.xlarge)); image.setScaling(Scaling.fit); - in.add(image).size(48f).pad(2); + in.add(image).size(8 * 6).pad(2); //add to table table.add(in).padRight(8); @@ -495,7 +495,7 @@ public class HudFragment extends Fragment{ //if there's space, add it if(esize < cap){ - Image image = new Image(content.getContentIcon()); + Image image = new Image(content.icon(Cicon.medium)); image.setScaling(Scaling.fit); lastUnlockLayout.add(image); diff --git a/core/src/io/anuke/mindustry/ui/fragments/LoadingFragment.java b/core/src/io/anuke/mindustry/ui/fragments/LoadingFragment.java index ad29b50afa..12fbccc5a7 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/LoadingFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/LoadingFragment.java @@ -38,6 +38,7 @@ public class LoadingFragment extends Fragment{ } public void setProgress(FloatProvider progress){ + bar.reset(0f); bar.visible(true); bar.set(() -> ((int)(progress.get() * 100) + "%"), progress, Pal.accent); } diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java index 946723983a..b4a0a2078b 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java @@ -65,7 +65,7 @@ public class MenuFragment extends Fragment{ parent.fill(c -> c.bottom().right().addButton("", Styles.discordt, ui.discord::show).size(84, 45)); } - String versionText = "[#ffffffba]" + ((Version.build == -1) ? "[#fc8140aa]custom build" : (Version.type.equals("official") ? Version.modifier : Version.type) + " build " + Version.build); + String versionText = "[#ffffffba]" + ((Version.build == -1) ? "[#fc8140aa]custom build" : (Version.type.equals("official") ? Version.modifier : Version.type) + " build " + Version.build + (Version.revision == 0 ? "" : "." + Version.revision)); parent.fill((x, y, w, h) -> { Texture logo = Core.assets.get("sprites/logo.png"); @@ -161,8 +161,8 @@ public class MenuFragment extends Fragment{ new Buttoni("$loadgame", Icon.loadSmall, ui.load::show), new Buttoni("$tutorial", Icon.infoSmall, control::playTutorial) ), - new Buttoni("$editor", Icon.editorSmall, ui.maps::show), - steam ? new Buttoni("$workshop", Icon.saveSmall, platform::openWorkshop) : null, + new Buttoni("$editor", Icon.editorSmall, ui.maps::show), steam ? new Buttoni("$workshop", Icon.saveSmall, platform::openWorkshop) : null, + new Buttoni(Core.bundle.get("mods") + "\n" + Core.bundle.get("mods.alpha"), Icon.wikiSmall, ui.mods::show), new Buttoni("$settings", Icon.toolsSmall, ui.settings::show), new Buttoni("$about.button", Icon.infoSmall, ui.about::show), new Buttoni("$quit", Icon.exitSmall, Core.app::exit) diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java index 548ae1aee9..98ce9f2159 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlacementFragment.java @@ -11,6 +11,7 @@ import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; @@ -80,7 +81,7 @@ public class PlacementFragment extends Fragment{ Block tryRecipe = tile.block(); if(tryRecipe.isVisible() && unlocked(tryRecipe)){ input.block = tryRecipe; - currentCategory = input.block.buildCategory; + currentCategory = input.block.category; return true; } } @@ -92,7 +93,7 @@ public class PlacementFragment extends Fragment{ for(KeyCode key : inputCatGrid){ if(Core.input.keyDown(key)){ input.block = getByCategory(Category.all[i]).first(); - currentCategory = input.block.buildCategory; + currentCategory = input.block.category; } i++; } @@ -143,11 +144,11 @@ public class PlacementFragment extends Fragment{ } }).size(46f).group(group).name("block-" + block.name).get(); - button.getStyle().imageUp = new TextureRegionDrawable(block.icon(Block.Icon.medium)); + button.getStyle().imageUp = new TextureRegionDrawable(block.icon(Cicon.medium)); button.update(() -> { //color unplacable things gray TileEntity core = player.getClosestCore(); - Color color = state.rules.infiniteResources || (core != null && (core.items.has(block.buildRequirements, state.rules.buildCostMultiplier) || state.rules.infiniteResources)) ? Color.white : Color.gray; + Color color = state.rules.infiniteResources || (core != null && (core.items.has(block.requirements, state.rules.buildCostMultiplier) || state.rules.infiniteResources)) ? Color.white : Color.gray; button.forEach(elem -> elem.setColor(color)); button.setChecked(control.input.block == block); }); @@ -189,7 +190,7 @@ public class PlacementFragment extends Fragment{ topTable.table(header -> { header.left(); - header.add(new Image(lastDisplay.icon(Block.Icon.medium))).size(8 * 4); + header.add(new Image(lastDisplay.icon(Cicon.medium))).size(8 * 4); header.labelWrap(() -> !unlocked(lastDisplay) ? Core.bundle.get("block.unknown") : lastDisplay.localizedName) .left().width(190f).padLeft(5); header.add().growX(); @@ -205,10 +206,10 @@ public class PlacementFragment extends Fragment{ topTable.table(req -> { req.top().left(); - for(ItemStack stack : lastDisplay.buildRequirements){ + for(ItemStack stack : lastDisplay.requirements){ req.table(line -> { line.left(); - line.addImage(stack.item.icon(Item.Icon.small)).size(8 * 2); + line.addImage(stack.item.icon(Cicon.small)).size(8 * 2); line.add(stack.item.localizedName()).color(Color.lightGray).padLeft(2).left(); line.labelWrap(() -> { TileEntity core = player.getClosestCore(); @@ -296,7 +297,7 @@ public class PlacementFragment extends Fragment{ Array getByCategory(Category cat){ returnArray.clear(); for(Block block : content.blocks()){ - if(block.buildCategory == cat && block.isVisible()){ + if(block.category == cat && block.isVisible()){ returnArray.add(block); } } diff --git a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java index b9fd089a1c..e590b910e7 100644 --- a/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java +++ b/core/src/io/anuke/mindustry/ui/fragments/PlayerListFragment.java @@ -87,7 +87,7 @@ public class PlayerListFragment extends Fragment{ } }; table.margin(8); - table.add(new Image(user.mech.getContentIcon()).setScaling(Scaling.none)).grow(); + table.add(new Image(user.getIconRegion()).setScaling(Scaling.none)).grow(); button.add(table).size(h); button.labelWrap("[#" + user.color.toString().toUpperCase() + "]" + user.name).width(170f).pad(10); diff --git a/core/src/io/anuke/mindustry/world/Block.java b/core/src/io/anuke/mindustry/world/Block.java index 28296cc44a..c8122f0b6e 100644 --- a/core/src/io/anuke/mindustry/world/Block.java +++ b/core/src/io/anuke/mindustry/world/Block.java @@ -15,11 +15,11 @@ import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.scene.ui.layout.*; import io.anuke.arc.util.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.effect.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.entities.type.Bullet; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; @@ -114,9 +114,9 @@ public class Block extends BlockStorage{ public float idleSoundVolume = 0.5f; /** Cost of constructing this block. */ - public ItemStack[] buildRequirements = new ItemStack[]{}; + public ItemStack[] requirements = new ItemStack[]{}; /** Category in place menu. */ - public Category buildCategory = Category.distribution; + public Category category = Category.distribution; /** Cost of building this block; do not modify directly! */ public float buildCost; /** Whether this block is visible and can currently be built. */ @@ -129,7 +129,6 @@ public class Block extends BlockStorage{ protected Array cacheRegionStrings = new Array<>(); protected Array tempTiles = new Array<>(); - protected TextureRegion[] icons = new TextureRegion[Icon.values().length]; protected TextureRegion[] generatedIcons; protected TextureRegion[] variantRegions, editorVariantRegions; protected TextureRegion region, editorIcon; @@ -315,7 +314,10 @@ public class Block extends BlockStorage{ }); tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); if(!tempTiles.isEmpty()){ - Call.linkPowerNodes(null, tempTiles.first(), tile); + Tile toLink = tempTiles.first(); + if(!toLink.entity.power.links.contains(tile.pos())){ + toLink.configure(tile.pos()); + } } } } @@ -359,11 +361,6 @@ public class Block extends BlockStorage{ return localizedName; } - @Override - public TextureRegion getContentIcon(){ - return icon(Icon.medium); - } - @Override public void displayInfo(Table table){ ContentDisplay.displayBlock(table, this); @@ -384,7 +381,7 @@ public class Block extends BlockStorage{ } buildCost = 0f; - for(ItemStack stack : buildRequirements){ + for(ItemStack stack : requirements){ buildCost += stack.amount * stack.item.cost; } @@ -433,6 +430,11 @@ public class Block extends BlockStorage{ } + /** Called when arbitrary configuration is applied to a tile. */ + public void configured(Tile tile, @Nullable Player player, int value){ + + } + /** Returns whether or not a hand cursor should be shown over this block. */ public Cursor getCursor(Tile tile){ return configurable ? SystemCursor.hand : SystemCursor.arrow; @@ -485,7 +487,7 @@ public class Block extends BlockStorage{ stats.add(BlockStat.health, health, StatUnit.none); if(isBuildable()){ stats.add(BlockStat.buildTime, buildCost / 60, StatUnit.seconds); - stats.add(BlockStat.buildCost, new ItemListValue(false, buildRequirements)); + stats.add(BlockStat.buildCost, new ItemListValue(false, requirements)); } consumes.display(stats); @@ -623,7 +625,7 @@ public class Block extends BlockStorage{ } public TextureRegion getDisplayIcon(Tile tile){ - return icon(Icon.medium); + return icon(Cicon.medium); } public void display(Tile tile, Table table){ @@ -659,20 +661,41 @@ public class Block extends BlockStorage{ } } - public TextureRegion icon(Icon icon){ - if(icons[icon.ordinal()] == null){ - icons[icon.ordinal()] = Core.atlas.find(name + "-icon-" + icon.name(), icon == Icon.full ? - getGeneratedIcons()[0] : Core.atlas.find(name + "-icon-full", getGeneratedIcons()[0])); - } - return icons[icon.ordinal()]; - } - public void getPlaceDraw(PlaceDraw draw, int rotation, int prevX, int prevY, int prevRotation){ - draw.region = icon(Icon.full); + draw.region = icon(Cicon.full); draw.scalex = draw.scaley = 1; draw.rotation = rotation; } + @Override + public void createIcons(PixmapPacker out, PixmapPacker editor){ + super.createIcons(out, editor); + + editor.pack(name + "-icon-editor", Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full)).crop()); + + if(!synthetic()){ + PixmapRegion image = Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full)); + + Color average = this.color; + Color color = new Color(); + for(int x = 0; x < image.width; x++){ + for(int y = 0; y < image.height; y++){ + image.getPixel(x, y, color); + average.r += color.r; + average.g += color.g; + average.b += color.b; + } + } + average.mul(1f / (image.width * image.height)); + if(isFloor()){ + average.mul(0.8f); + }else{ + average.mul(1.1f); + } + average.a = 1f; + } + } + /** Never use outside of the editor! */ public TextureRegion editorIcon(){ if(editorIcon == null) editorIcon = Core.atlas.find(name + "-icon-editor"); @@ -705,7 +728,7 @@ public class Block extends BlockStorage{ public TextureRegion[] variantRegions(){ if(variantRegions == null){ - variantRegions = new TextureRegion[]{icon(Icon.full)}; + variantRegions = new TextureRegion[]{icon(Cicon.full)}; } return variantRegions; } @@ -764,25 +787,11 @@ public class Block extends BlockStorage{ /** Sets up requirements. Use only this method to set up requirements. */ protected void requirements(Category cat, BooleanProvider visible, ItemStack[] stacks){ - this.buildCategory = cat; - this.buildRequirements = stacks; + this.category = cat; + this.requirements = stacks; this.buildVisibility = visible; - Arrays.sort(buildRequirements, (a, b) -> Integer.compare(a.item.id, b.item.id)); + Arrays.sort(requirements, (a, b) -> Integer.compare(a.item.id, b.item.id)); } - public enum Icon{ - //these are stored in the UI atlases - small(8 * 3), - medium(8 * 4), - large(8 * 6), - /** uses whatever the size of the block is. this is always stored in the main game atlas! */ - full(0); - - public final int size; - - Icon(int size){ - this.size = size; - } - } } diff --git a/core/src/io/anuke/mindustry/world/BlockStorage.java b/core/src/io/anuke/mindustry/world/BlockStorage.java index 920dba6c3e..984858a5ef 100644 --- a/core/src/io/anuke/mindustry/world/BlockStorage.java +++ b/core/src/io/anuke/mindustry/world/BlockStorage.java @@ -3,7 +3,7 @@ package io.anuke.mindustry.world; import io.anuke.arc.collection.Array; import io.anuke.arc.math.Mathf; import io.anuke.arc.math.geom.Vector2; -import io.anuke.arc.util.Time; +import io.anuke.arc.util.*; import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Effects; @@ -91,11 +91,11 @@ public abstract class BlockStorage extends UnlockableContent{ } public boolean acceptItem(Item item, Tile tile, Tile source){ - return consumes.itemFilters[item.id] && tile.entity.items.get(item) < getMaximumAccepted(tile, item); + return consumes.itemFilters.get(item.id) && tile.entity.items.get(item) < getMaximumAccepted(tile, item); } public boolean acceptLiquid(Tile tile, Tile source, Liquid liquid, float amount){ - return hasLiquids && tile.entity.liquids.get(liquid) + amount < liquidCapacity && consumes.liquidfilters[liquid.id]; + return hasLiquids && tile.entity.liquids.get(liquid) + amount < liquidCapacity && consumes.liquidfilters.get(liquid.id); } public void handleLiquid(Tile tile, Tile source, Liquid liquid, float amount){ diff --git a/core/src/io/anuke/mindustry/world/Tile.java b/core/src/io/anuke/mindustry/world/Tile.java index 2d0583da98..c5526e5c23 100644 --- a/core/src/io/anuke/mindustry/world/Tile.java +++ b/core/src/io/anuke/mindustry/world/Tile.java @@ -8,6 +8,7 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.traits.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.game.*; +import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.modules.*; @@ -87,6 +88,11 @@ public class Tile implements Position, TargetTrait{ return -1; } + /** Configure a tile with the current, local player. */ + public void configure(int value){ + Call.onTileConfig(player, this, value); + } + @SuppressWarnings("unchecked") public T entity(){ return (T)entity; diff --git a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java index a78445b81e..22e649b9c3 100644 --- a/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/BuildBlock.java @@ -1,26 +1,24 @@ package io.anuke.mindustry.world.blocks; import io.anuke.annotations.Annotations.*; -import io.anuke.arc.Core; -import io.anuke.arc.Events; -import io.anuke.arc.Graphics.Cursor; -import io.anuke.arc.Graphics.Cursor.SystemCursor; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; -import io.anuke.mindustry.content.Fx; -import io.anuke.mindustry.entities.Effects; -import io.anuke.mindustry.entities.effect.RubbleDecal; -import io.anuke.mindustry.entities.traits.BuilderTrait.BuildRequest; +import io.anuke.arc.*; +import io.anuke.arc.Graphics.*; +import io.anuke.arc.Graphics.Cursor.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; +import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.mindustry.content.*; +import io.anuke.mindustry.entities.*; +import io.anuke.mindustry.entities.effect.*; +import io.anuke.mindustry.entities.traits.BuilderTrait.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.game.EventType.BlockBuildEndEvent; -import io.anuke.mindustry.game.Team; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; -import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.modules.ItemModule; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.modules.*; import java.io.*; @@ -92,7 +90,7 @@ public class BuildBlock extends Block{ @Override public TextureRegion getDisplayIcon(Tile tile){ BuildEntity entity = tile.entity(); - return (entity.cblock == null ? entity.previous : entity.cblock).icon(Icon.full); + return (entity.cblock == null ? entity.previous : entity.cblock).icon(Cicon.full); } @Override @@ -137,8 +135,8 @@ public class BuildBlock extends Block{ if(entity.previous == null) return; - if(Core.atlas.isFound(entity.previous.icon(Icon.full))){ - Draw.rect(entity.previous.icon(Icon.full), tile.drawx(), tile.drawy(), entity.previous.rotate ? tile.rotation() * 90 : 0); + if(Core.atlas.isFound(entity.previous.icon(Cicon.full))){ + Draw.rect(entity.previous.icon(Cicon.full), tile.drawx(), tile.drawy(), entity.previous.rotate ? tile.rotation() * 90 : 0); } } @@ -172,7 +170,8 @@ public class BuildBlock extends Block{ * The recipe of the block that is being constructed. * If there is no recipe for this block, as is the case with rocks, 'previous' is used. */ - public @Nullable Block cblock; + public @Nullable + Block cblock; public float progress = 0; public float buildCost; @@ -186,16 +185,16 @@ public class BuildBlock extends Block{ private float[] accumulator; private float[] totalAccumulator; - public void construct(Unit builder, @Nullable TileEntity core, float amount){ + public boolean construct(Unit builder, @Nullable TileEntity core, float amount){ if(cblock == null){ kill(); - return; + return false; } float maxProgress = core == null ? amount : checkRequired(core.items, amount, false); - for(int i = 0; i < cblock.buildRequirements.length; i++){ - int reqamount = Math.round(state.rules.buildCostMultiplier * cblock.buildRequirements[i].amount); + for(int i = 0; i < cblock.requirements.length; i++){ + int reqamount = Math.round(state.rules.buildCostMultiplier * cblock.requirements[i].amount); accumulator[i] += Math.min(reqamount * maxProgress, reqamount - totalAccumulator[i] + 0.00001f); //add min amount progressed to the accumulator totalAccumulator[i] = Math.min(totalAccumulator[i] + reqamount * maxProgress, reqamount); } @@ -210,14 +209,16 @@ public class BuildBlock extends Block{ if(progress >= 1f || state.rules.infiniteResources){ Call.onConstructFinish(tile, cblock, builderID, tile.rotation(), builder.getTeam()); + return true; } + return false; } public void deconstruct(Unit builder, @Nullable TileEntity core, float amount){ float deconstructMultiplier = 0.5f; if(cblock != null){ - ItemStack[] requirements = cblock.buildRequirements; + ItemStack[] requirements = cblock.requirements; if(requirements.length != accumulator.length || totalAccumulator.length != requirements.length){ setDeconstruct(previous); } @@ -254,15 +255,15 @@ public class BuildBlock extends Block{ private float checkRequired(ItemModule inventory, float amount, boolean remove){ float maxProgress = amount; - for(int i = 0; i < cblock.buildRequirements.length; i++){ - int sclamount = Math.round(state.rules.buildCostMultiplier * cblock.buildRequirements[i].amount); + for(int i = 0; i < cblock.requirements.length; i++){ + int sclamount = Math.round(state.rules.buildCostMultiplier * cblock.requirements[i].amount); int required = (int)(accumulator[i]); //calculate items that are required now - if(inventory.get(cblock.buildRequirements[i].item) == 0 && sclamount != 0){ + if(inventory.get(cblock.requirements[i].item) == 0 && sclamount != 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, inventory.get(cblock.buildRequirements[i].item)); + int maxUse = Math.min(required, inventory.get(cblock.requirements[i].item)); //get this as a fraction float fraction = maxUse / (float)required; @@ -273,7 +274,7 @@ public class BuildBlock extends Block{ //remove stuff that is actually used if(remove){ - inventory.remove(cblock.buildRequirements[i].item, maxUse); + inventory.remove(cblock.requirements[i].item, maxUse); } } //else, no items are required yet, so just keep going @@ -289,8 +290,8 @@ public class BuildBlock extends Block{ public void setConstruct(Block previous, Block block){ this.cblock = block; this.previous = previous; - this.accumulator = new float[block.buildRequirements.length]; - this.totalAccumulator = new float[block.buildRequirements.length]; + this.accumulator = new float[block.requirements.length]; + this.totalAccumulator = new float[block.requirements.length]; this.buildCost = block.buildCost * state.rules.buildCostMultiplier; } @@ -299,8 +300,8 @@ public class BuildBlock extends Block{ this.progress = 1f; if(previous.buildCost >= 0.01f){ this.cblock = previous; - this.accumulator = new float[previous.buildRequirements.length]; - this.totalAccumulator = new float[previous.buildRequirements.length]; + this.accumulator = new float[previous.requirements.length]; + this.totalAccumulator = new float[previous.requirements.length]; this.buildCost = previous.buildCost * state.rules.buildCostMultiplier; }else{ this.buildCost = 20f; //default no-requirement build cost is 20 diff --git a/core/src/io/anuke/mindustry/world/blocks/Floor.java b/core/src/io/anuke/mindustry/world/blocks/Floor.java index dbd0218a4f..e11a3a63e2 100644 --- a/core/src/io/anuke/mindustry/world/blocks/Floor.java +++ b/core/src/io/anuke/mindustry/world/blocks/Floor.java @@ -1,19 +1,17 @@ package io.anuke.mindustry.world.blocks; -import io.anuke.arc.Core; -import io.anuke.arc.collection.Array; -import io.anuke.arc.collection.IntSet; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.math.geom.Geometry; -import io.anuke.arc.math.geom.Point2; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.graphics.g2d.TextureAtlas.*; +import io.anuke.arc.math.*; +import io.anuke.arc.math.geom.*; import io.anuke.mindustry.content.*; -import io.anuke.mindustry.entities.Effects.Effect; +import io.anuke.mindustry.entities.Effects.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.*; import static io.anuke.mindustry.Vars.tilesize; @@ -57,7 +55,7 @@ public class Floor extends Block{ protected byte eq = 0; protected Array blenders = new Array<>(); protected IntSet blended = new IntSet(); - protected TextureRegion edgeRegion, edgierRegion; + protected TextureRegion edgeRegion; public Floor(String name){ super(name); @@ -85,7 +83,31 @@ public class Floor extends Block{ } region = variantRegions[0]; edgeRegion = Core.atlas.find("edge"); - edgierRegion = Core.atlas.find("edgier"); + } + + @Override + public void createIcons(PixmapPacker out, PixmapPacker editor){ + super.createIcons(out, editor); + editor.pack("editor-" + name, Core.atlas.getPixmap((AtlasRegion)icon(Cicon.full)).crop()); + + if(blendGroup != this){ + return; + } + + Color color = new Color(); + Color color2 = new Color(); + PixmapRegion image = Core.atlas.getPixmap((AtlasRegion)generateIcons()[0]); + PixmapRegion edge = Core.atlas.getPixmap("edge-stencil"); + Pixmap result = new Pixmap(edge.width, edge.height); + + for(int x = 0; x < edge.width; x++){ + for(int y = 0; y < edge.height; y++){ + edge.getPixel(x, y, color); + result.draw(x, y, color.mul(color2.set(image.getPixel(x % image.width, y % image.height)))); + } + } + + out.pack(name + "-edge", result); } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java b/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java index 9c6932eb4a..391638355f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java +++ b/core/src/io/anuke/mindustry/world/blocks/ItemSelection.java @@ -5,9 +5,10 @@ import io.anuke.arc.function.*; import io.anuke.arc.scene.style.*; import io.anuke.arc.scene.ui.*; import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.ui.Styles; +import io.anuke.mindustry.ui.*; import static io.anuke.mindustry.Vars.*; @@ -29,7 +30,7 @@ public class ItemSelection{ ImageButton button = cont.addImageButton(Tex.whiteui, Styles.clearToggleTransi, 24, () -> control.input.frag.config.hideConfig()).group(group).get(); button.changed(() -> consumer.accept(button.isChecked() ? item : null)); - button.getStyle().imageUp = new TextureRegionDrawable(item.icon(Item.Icon.medium)); + button.getStyle().imageUp = new TextureRegionDrawable(item.icon(Cicon.small)); button.update(() -> button.setChecked(holder.get() == item)); if(i++ % 4 == 3){ diff --git a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java index b4ee4078f8..952510035b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/OreBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/OreBlock.java @@ -1,7 +1,13 @@ package io.anuke.mindustry.world.blocks; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Tile; +import io.anuke.annotations.Annotations.*; +import io.anuke.arc.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; + +import static io.anuke.mindustry.Vars.tilesize; /**An overlay ore for a specific item type.*/ public class OreBlock extends OverlayFloor{ @@ -14,9 +20,60 @@ public class OreBlock extends OverlayFloor{ this.color.set(ore.color); } + /** For mod use only!*/ + public OreBlock(String name){ + super(name); + } + + public void setup(Item ore){ + this.localizedName = ore.localizedName(); + this.itemDrop = ore; + this.variants = 3; + this.color.set(ore.color); + } + + @Override + @OverrideCallSuper + public void createIcons(PixmapPacker out, PixmapPacker editor){ + for(int i = 0; i < 3; i++){ + Pixmap image = new Pixmap(32, 32); + PixmapRegion shadow = Core.atlas.getPixmap(itemDrop.name + (i + 1)); + + int offset = image.getWidth() / tilesize - 1; + Color color = new Color(); + + for(int x = 0; x < image.getWidth(); x++){ + for(int y = offset; y < image.getHeight(); y++){ + shadow.getPixel(x, y - offset, color); + + if(color.a > 0.001f){ + color.set(0, 0, 0, 0.3f); + image.draw(x, y, color); + } + } + } + + image.draw(shadow); + + out.pack(name + (i + 1), image); + editor.pack("editor-" + name + (i + 1), image); + + if(i == 0){ + editor.pack("editor-block-" + name + "-full", image); + out.pack("block-" + name + "-full", image); + } + } + } + @Override public void init(){ super.init(); + + if(itemDrop != null){ + setup(itemDrop); + }else{ + throw new IllegalArgumentException(name + " must have an item drop!"); + } } @Override diff --git a/core/src/io/anuke/mindustry/world/blocks/RespawnBlock.java b/core/src/io/anuke/mindustry/world/blocks/RespawnBlock.java index c3813bd66a..8171535184 100644 --- a/core/src/io/anuke/mindustry/world/blocks/RespawnBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/RespawnBlock.java @@ -20,7 +20,7 @@ public class RespawnBlock{ Draw.reset(); if(player != null){ - TextureRegion region = to.iconRegion; + TextureRegion region = player.getIconRegion(); Draw.color(0f, 0f, 0f, 0.4f * progress); Draw.rect("circle-shadow", tile.drawx(), tile.drawy(), region.getWidth() / 3f, region.getWidth() / 3f); diff --git a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java index 5fb442c4d8..b48b36303f 100644 --- a/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java +++ b/core/src/io/anuke/mindustry/world/blocks/defense/turrets/ItemTurret.java @@ -7,6 +7,7 @@ import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; @@ -44,7 +45,7 @@ public class ItemTurret extends CooledTurret{ @Override public void build(Tile tile, Table table){ MultiReqImage image = new MultiReqImage(); - content.items().each(i -> filter.test(i) && (!world.isZone() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(Item.Icon.large)), + content.items().each(i -> filter.test(i) && (!world.isZone() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium)), () -> tile.entity != null && !((ItemTurretEntity)tile.entity).ammo.isEmpty() && ((ItemEntry)tile.entity().ammo.peek()).item == item))); table.add(image).size(8 * 4); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java index 39c7e4d96b..faf6645c6b 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Conveyor.java @@ -7,6 +7,7 @@ import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.input.InputHandler.*; @@ -161,7 +162,7 @@ public class Conveyor extends Block{ tr1.trns(rotation * 90, tilesize, 0); tr2.trns(rotation * 90, -tilesize / 2f, pos.x * tilesize / 2f); - Draw.rect(pos.item.icon(Item.Icon.medium), + Draw.rect(pos.item.icon(Cicon.medium), (tile.x * tilesize + tr1.x * pos.y + tr2.x), (tile.y * tilesize + tr1.y * pos.y + tr2.y), itemSize, itemSize); } diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java index 417e067ecd..46acbc1420 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/ItemBridge.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.collection.IntSet.*; @@ -9,9 +8,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -43,24 +40,20 @@ public class ItemBridge extends Block{ group = BlockGroup.transportation; } - @Remote(targets = Loc.both, called = Loc.both, forward = true) - public static void linkItemBridge(Player player, Tile tile, Tile other){ - if(!Units.canInteract(player, tile)) return; + @Override + public void configured(Tile tile, Player player, int value){ ItemBridgeEntity entity = tile.entity(); - ItemBridgeEntity oe = other.entity(); - entity.link = other.pos(); - oe.incoming.add(tile.pos()); - } - @Remote(targets = Loc.both, called = Loc.server, forward = true) - public static void unlinkItemBridge(Player player, Tile tile, Tile other){ - if(!Units.canInteract(player, tile)) return; - ItemBridgeEntity entity = tile.entity(); - entity.link = -1; - if(other != null){ - ItemBridgeEntity oe = other.entity(); + if(world.tile(entity.link) != null && world.tile(entity.link).entity instanceof ItemBridgeEntity){ + ItemBridgeEntity oe = world.tile(entity.link).entity(); oe.incoming.remove(tile.pos()); } + + entity.link = value; + + if(world.tile(value) != null && world.tile(value).entity instanceof ItemBridgeEntity){ + ((ItemBridgeEntity)world.tile(value).entity).incoming.add(tile.pos()); + } } @Override @@ -76,7 +69,7 @@ public class ItemBridge extends Block{ public void playerPlaced(Tile tile){ Tile link = findLink(tile.x, tile.y); if(linkValid(tile, link)){ - Call.linkItemBridge(null, link, tile); + link.configure(tile.pos()); } lastPlaced = tile.pos(); @@ -148,9 +141,9 @@ public class ItemBridge extends Block{ if(linkValid(tile, other)){ if(entity.link == other.pos()){ - Call.unlinkItemBridge(null, tile, other); + tile.configure(Pos.invalid); }else{ - Call.linkItemBridge(null, tile, other); + tile.configure(other.pos()); } return false; } @@ -175,7 +168,6 @@ public class ItemBridge extends Block{ Tile other = world.tile(entity.link); if(!linkValid(tile, other)){ - entity.link = Pos.invalid; tryDump(tile); entity.uptime = 0f; }else{ @@ -364,6 +356,11 @@ public class ItemBridge extends Block{ public float time2; public float cycleSpeed = 1f; + @Override + public int config(){ + return link; + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java index 060f6562b8..f3020c22ef 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/MassDriver.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.g2d.*; @@ -12,7 +11,6 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; @@ -45,11 +43,17 @@ public class MassDriver extends Block{ outlineIcon = true; } + /* @Remote(targets = Loc.both, called = Loc.server, forward = true) public static void linkMassDriver(Player player, Tile tile, int position){ if(!Units.canInteract(player, tile)) return; MassDriverEntity entity = tile.entity(); entity.link = position; + }*/ + + @Override + public void configured(Tile tile, Player player, int value){ + tile.entity().link = value; } @Override @@ -192,10 +196,10 @@ public class MassDriver extends Block{ MassDriverEntity entity = tile.entity(); if(entity.link == other.pos()){ - Call.linkMassDriver(null, tile, -1); + tile.configure(-1); return false; }else if(other.block() instanceof MassDriver && other.dst(tile) <= range && other.getTeam() == tile.getTeam()){ - Call.linkMassDriver(null, tile, other.pos()); + tile.configure(other.pos()); return false; } @@ -310,6 +314,11 @@ public class MassDriver extends Block{ ((MassDriver)block).handlePayload(this, bullet, data); } + @Override + public int config(){ + return link; + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); diff --git a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java index 962ad03841..42108b75fc 100644 --- a/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java +++ b/core/src/io/anuke/mindustry/world/blocks/distribution/Sorter.java @@ -1,17 +1,15 @@ package io.anuke.mindustry.world.blocks.distribution; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.Core; +import io.anuke.arc.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.*; +import io.anuke.arc.math.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.ItemSelection; -import io.anuke.mindustry.world.meta.BlockGroup; +import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.world.meta.*; import java.io.*; @@ -37,9 +35,12 @@ public class Sorter extends Block{ @Override public void playerPlaced(Tile tile){ - Core.app.post(() -> Call.setSorterItem(null, tile, lastItem)); + if(lastItem != null){ + Core.app.post(() -> tile.configure(lastItem.id)); + } } + /* @Remote(targets = Loc.both, called = Loc.both, forward = true) public static void setSorterItem(Player player, Tile tile, Item item){ if(!Units.canInteract(player, tile)) return; @@ -47,6 +48,11 @@ public class Sorter extends Block{ if(entity != null){ entity.sortItem = item; } + }*/ + + @Override + public void configured(Tile tile, Player player, int value){ + tile.entity().sortItem = content.item(value); } @Override @@ -127,7 +133,7 @@ public class Sorter extends Block{ SorterEntity entity = tile.entity(); ItemSelection.buildItemTable(table, () -> entity.sortItem, item -> { lastItem = item; - Call.setSorterItem(null, tile, item); + tile.configure(item == null ? -1 : item.id); }); } @@ -138,7 +144,12 @@ public class Sorter extends Block{ public class SorterEntity extends TileEntity{ - Item sortItem; + @Nullable Item sortItem; + + @Override + public int config(){ + return sortItem == null ? -1 : sortItem.id; + } @Override public byte version(){ diff --git a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java index 6cf2d7a41e..2896de80fa 100644 --- a/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java +++ b/core/src/io/anuke/mindustry/world/blocks/power/PowerNode.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.power; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.function.*; @@ -9,9 +8,7 @@ import io.anuke.arc.graphics.g2d.*; import io.anuke.arc.math.*; import io.anuke.arc.math.geom.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; @@ -36,7 +33,7 @@ public class PowerNode extends PowerBlock{ consumesPower = false; outputsPower = false; } - +/* @Remote(targets = Loc.both, called = Loc.server, forward = true) public static void linkPowerNodes(Player player, Tile tile, Tile other){ if(tile.entity == null || other == null || tile.entity.power == null || !((PowerNode)tile.block()).linkValid(tile, other) @@ -82,6 +79,47 @@ public class PowerNode extends PowerBlock{ } } + */ + + @Override + public void configured(Tile tile, Player player, int value){ + TileEntity entity = tile.entity; + Tile other = world.tile(value); + boolean contains = entity.power.links.contains(value), valid = other != null && other.entity != null && other.entity.power != null; + + if(contains){ + //unlink + entity.power.links.removeValue(value); + if(valid) other.entity.power.links.removeValue(tile.pos()); + + PowerGraph newgraph = new PowerGraph(); + + //reflow from this point, covering all tiles on this side + newgraph.reflow(tile); + + if(valid && other.entity.power.graph != newgraph){ + //create new graph for other end + PowerGraph og = new PowerGraph(); + //reflow from other end + og.reflow(other); + } + }else if(linkValid(tile, other) && valid && entity.power.links.size < maxNodes){ + + if(!entity.power.links.contains(other.pos())){ + entity.power.links.add(other.pos()); + } + + if(other.getTeamID() == tile.getTeamID()){ + + if(!other.entity.power.links.contains(tile.pos())){ + other.entity.power.links.add(tile.pos()); + } + } + + entity.power.graph.add(other.entity.power.graph); + } + } + @Override public void load(){ super.load(); @@ -122,7 +160,11 @@ public class PowerNode extends PowerBlock{ }); tempTiles.sort(Structs.comparingFloat(t -> t.dst2(tile))); - tempTiles.each(valid, other -> Call.linkPowerNodes(null, tile, other)); + tempTiles.each(valid, other -> { + if(!tile.entity.power.links.contains(other.pos())){ + tile.configure(other.pos()); + } + }); super.placed(tile); } @@ -169,11 +211,7 @@ public class PowerNode extends PowerBlock{ Tile result = other; if(linkValid(tile, other)){ - if(linked(tile, other)){ - Call.unlinkPowerNodes(null, tile, result); - }else if(entity.power.links.size < maxNodes){ - Call.linkPowerNodes(null, tile, result); - } + tile.configure(other.pos()); return false; } return true; diff --git a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java index 0c94887a66..5cf1aca2d0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/production/Drill.java +++ b/core/src/io/anuke/mindustry/world/blocks/production/Drill.java @@ -10,6 +10,7 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.type.*; @@ -143,9 +144,9 @@ public class Drill extends Block{ float width = drawPlaceText(Core.bundle.formatFloat("bar.drillspeed", 60f / (drillTime + hardnessDrillMultiplier * returnItem.hardness) * returnCount, 2), x, y, valid); float dx = x * tilesize + offset() - width/2f - 4f, dy = y * tilesize + offset() + size * tilesize / 2f + 5; Draw.mixcol(Color.darkGray, 1f); - Draw.rect(returnItem.icon(Item.Icon.large), dx, dy - 1); + Draw.rect(returnItem.icon(Cicon.small), dx, dy - 1); Draw.reset(); - Draw.rect(returnItem.icon(Item.Icon.large), dx, dy); + Draw.rect(returnItem.icon(Cicon.small), dx, dy); }else{ Tile to = tile.getLinkedTilesAs(this, tempTiles).find(t -> t.drop() != null && t.drop().hardness > tier); Item item = to == null ? null : to.drop(); @@ -162,9 +163,9 @@ public class Drill extends Block{ if(entity.dominantItem != null){ float dx = tile.drawx() - size * tilesize/2f, dy = tile.drawy() + size * tilesize/2f; Draw.mixcol(Color.darkGray, 1f); - Draw.rect(entity.dominantItem.icon(Item.Icon.large), dx, dy); + Draw.rect(entity.dominantItem.icon(Cicon.small), dx, dy - 1); Draw.reset(); - Draw.rect(entity.dominantItem.icon(Item.Icon.medium), dx, dy); + Draw.rect(entity.dominantItem.icon(Cicon.small), dx, dy); } } diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java b/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java index 793bfb8442..8611eb18b7 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/ItemSource.java @@ -1,19 +1,13 @@ package io.anuke.mindustry.world.blocks.sandbox; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.ItemSelection; -import io.anuke.mindustry.world.meta.BlockGroup; +import io.anuke.arc.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.*; +import io.anuke.mindustry.world.meta.*; import java.io.*; @@ -31,18 +25,16 @@ public class ItemSource extends Block{ configurable = true; } - @Remote(targets = Loc.both, called = Loc.both, forward = true) - public static void setItemSourceItem(Player player, Tile tile, Item item){ - if(!Units.canInteract(player, tile)) return; - ItemSourceEntity entity = tile.entity(); - if(entity != null){ - entity.outputItem = item; - } + @Override + public void configured(Tile tile, Player player, int value){ + tile.entity().outputItem = content.item(value); } @Override public void playerPlaced(Tile tile){ - Core.app.post(() -> Call.setItemSourceItem(null, tile, lastItem)); + if(lastItem != null){ + Core.app.post(() -> tile.configure(lastItem.id)); + } } @Override @@ -83,7 +75,7 @@ public class ItemSource extends Block{ ItemSourceEntity entity = tile.entity(); ItemSelection.buildItemTable(table, () -> entity.outputItem, item -> { lastItem = item; - Call.setItemSourceItem(null, tile, item); + tile.configure(item == null ? -1 : item.id); }); } @@ -100,6 +92,11 @@ public class ItemSource extends Block{ public class ItemSourceEntity extends TileEntity{ Item outputItem; + @Override + public int config(){ + return outputItem == null ? -1 : outputItem.id; + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); diff --git a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java b/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java index f9ea932a90..26177da5a0 100644 --- a/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java +++ b/core/src/io/anuke/mindustry/world/blocks/sandbox/LiquidSource.java @@ -1,27 +1,22 @@ package io.anuke.mindustry.world.blocks.sandbox; -import io.anuke.annotations.Annotations.Loc; -import io.anuke.annotations.Annotations.Remote; -import io.anuke.arc.Core; -import io.anuke.arc.collection.Array; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.scene.style.TextureRegionDrawable; -import io.anuke.arc.scene.ui.ButtonGroup; -import io.anuke.arc.scene.ui.ImageButton; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.*; -import io.anuke.mindustry.entities.type.Player; -import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.arc.*; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.scene.style.*; +import io.anuke.arc.scene.ui.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.arc.util.ArcAnnotate.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.Liquid; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Tile; +import io.anuke.mindustry.world.*; import java.io.*; -import static io.anuke.mindustry.Vars.content; -import static io.anuke.mindustry.Vars.control; +import static io.anuke.mindustry.Vars.*; public class LiquidSource extends Block{ private static Liquid lastLiquid; @@ -38,7 +33,9 @@ public class LiquidSource extends Block{ @Override public void playerPlaced(Tile tile){ - if(lastLiquid != null) Core.app.post(() -> Call.setLiquidSourceLiquid(null, tile, lastLiquid)); + if(lastLiquid != null){ + Core.app.post(() -> tile.configure(lastLiquid.id)); + } } @Override @@ -87,11 +84,11 @@ public class LiquidSource extends Block{ final int f = i; ImageButton button = cont.addImageButton(Tex.clear, Styles.clearToggleTransi, 24, () -> control.input.frag.config.hideConfig()).size(38).group(group).get(); button.changed(() -> { - Call.setLiquidSourceLiquid(null, tile, button.isChecked() ? items.get(f) : null); + tile.configure(button.isChecked() ? items.get(f).id : -1); control.input.frag.config.hideConfig(); lastLiquid = items.get(f); }); - button.getStyle().imageUp = new TextureRegionDrawable(items.get(i).iconRegion); + button.getStyle().imageUp = new TextureRegionDrawable(items.get(i).icon(Cicon.medium)); button.setChecked(entity.source == items.get(i)); if(i % 4 == 3){ @@ -107,15 +104,18 @@ public class LiquidSource extends Block{ return new LiquidSourceEntity(); } - @Remote(targets = Loc.both, called = Loc.both, forward = true) - public static void setLiquidSourceLiquid(Player player, Tile tile, Liquid liquid){ - if(!Units.canInteract(player, tile)) return; - LiquidSourceEntity entity = tile.entity(); - if(entity != null) entity.source = liquid; + @Override + public void configured(Tile tile, Player player, int value){ + tile.entity().source = content.liquid(value); } class LiquidSourceEntity extends TileEntity{ - public Liquid source = null; + public @Nullable Liquid source = null; + + @Override + public int config(){ + return source == null ? -1 : source.id; + } @Override public void write(DataOutput stream) throws IOException{ diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java index 28566f1ca7..aa177b1caf 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/StorageBlock.java @@ -1,6 +1,6 @@ package io.anuke.mindustry.world.blocks.storage; -import io.anuke.annotations.Annotations.*; +import io.anuke.arc.util.ArcAnnotate.*; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.type.Item; import io.anuke.mindustry.world.Block; @@ -75,6 +75,7 @@ public abstract class StorageBlock extends Block{ } public class StorageBlockEntity extends TileEntity{ - protected @Nullable Tile linkedCore; + protected @Nullable + Tile linkedCore; } } diff --git a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java index 0adf1fdc8f..9488337209 100644 --- a/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java +++ b/core/src/io/anuke/mindustry/world/blocks/storage/Unloader.java @@ -1,16 +1,13 @@ package io.anuke.mindustry.world.blocks.storage; -import io.anuke.annotations.Annotations.*; -import io.anuke.arc.Core; -import io.anuke.arc.graphics.Color; +import io.anuke.arc.*; +import io.anuke.arc.graphics.*; import io.anuke.arc.graphics.g2d.*; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.*; +import io.anuke.arc.scene.ui.layout.*; import io.anuke.mindustry.entities.type.*; -import io.anuke.mindustry.gen.Call; -import io.anuke.mindustry.type.Item; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.world.*; -import io.anuke.mindustry.world.blocks.ItemSelection; +import io.anuke.mindustry.world.blocks.*; import java.io.*; @@ -44,20 +41,20 @@ public class Unloader extends Block{ @Override public void playerPlaced(Tile tile){ - Core.app.post(() -> Call.setSortedUnloaderItem(null, tile, lastItem)); + if(lastItem != null){ + Core.app.post(() -> tile.configure(lastItem.id)); + } } - @Remote(targets = Loc.both, called = Loc.both, forward = true) - public static void setSortedUnloaderItem(Player player, Tile tile, Item item){ - if(!Units.canInteract(player, tile)) return; - SortedUnloaderEntity entity = tile.entity(); - entity.items.clear(); - entity.sortItem = item; + @Override + public void configured(Tile tile, Player player, int value){ + tile.entity.items.clear(); + tile.entity().sortItem = content.item(value); } @Override public void update(Tile tile){ - SortedUnloaderEntity entity = tile.entity(); + UnloaderEntity entity = tile.entity(); if(tile.entity.timer.get(timerUnload, speed / entity.timeScale) && tile.entity.items.total() == 0){ for(Tile other : tile.entity.proximity()){ @@ -109,7 +106,7 @@ public class Unloader extends Block{ public void draw(Tile tile){ super.draw(tile); - SortedUnloaderEntity entity = tile.entity(); + UnloaderEntity entity = tile.entity(); Draw.color(entity.sortItem == null ? Color.clear : entity.sortItem.color); Fill.square(tile.worldx(), tile.worldy(), 1f); @@ -118,21 +115,26 @@ public class Unloader extends Block{ @Override public void buildTable(Tile tile, Table table){ - SortedUnloaderEntity entity = tile.entity(); + UnloaderEntity entity = tile.entity(); ItemSelection.buildItemTable(table, () -> entity.sortItem, item -> { lastItem = item; - Call.setSortedUnloaderItem(null, tile, item); + tile.configure(item == null ? -1 : item.id); }); } @Override public TileEntity newEntity(){ - return new SortedUnloaderEntity(); + return new UnloaderEntity(); } - public static class SortedUnloaderEntity extends TileEntity{ + public static class UnloaderEntity extends TileEntity{ public Item sortItem = null; + @Override + public int config(){ + return sortItem == null ? -1 : sortItem.id; + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); diff --git a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java index a748a20a5e..01487f6b44 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/CommandCenter.java @@ -1,6 +1,5 @@ package io.anuke.mindustry.world.blocks.units; -import io.anuke.annotations.Annotations.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.graphics.*; @@ -13,9 +12,8 @@ import io.anuke.mindustry.entities.*; import io.anuke.mindustry.entities.Effects.*; import io.anuke.mindustry.entities.type.*; import io.anuke.mindustry.entities.units.*; -import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; -import io.anuke.mindustry.gen.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.graphics.*; import io.anuke.mindustry.ui.*; import io.anuke.mindustry.world.*; @@ -95,7 +93,7 @@ public class CommandCenter extends Block{ Table buttons = new Table(); for(UnitCommand cmd : UnitCommand.all){ - buttons.addImageButton(Core.atlas.drawable("icon-command-" + cmd.name() + "-small"), Styles.clearToggleTransi, () -> Call.onCommandCenterSet(player, tile, cmd)) + buttons.addImageButton(Core.atlas.drawable("icon-command-" + cmd.name() + "-small"), Styles.clearToggleTransi, () -> tile.configure(cmd.ordinal())) .size(44).group(group).update(b -> b.setChecked(entity.command == cmd)); } table.add(buttons); @@ -103,10 +101,9 @@ public class CommandCenter extends Block{ table.label(() -> entity.command.localized()).style(Styles.outlineLabel).center().growX().get().setAlignment(Align.center); } - @Remote(called = Loc.server, forward = true, targets = Loc.both) - public static void onCommandCenterSet(Player player, Tile tile, UnitCommand command){ - if(player == null || tile == null || !Units.canInteract(player, tile)) return; - + @Override + public void configured(Tile tile, Player player, int value){ + UnitCommand command = UnitCommand.all[value]; Effects.effect(((CommandCenter)tile.block()).effect, tile); for(Tile center : indexer.getAllied(tile.getTeam(), BlockFlag.comandCenter)){ @@ -133,6 +130,11 @@ public class CommandCenter extends Block{ public class CommandCenterEntity extends TileEntity{ public UnitCommand command = UnitCommand.attack; + @Override + public int config(){ + return command.ordinal(); + } + @Override public void write(DataOutput stream) throws IOException{ super.write(stream); diff --git a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java index 07877ccb43..35caf17d9c 100644 --- a/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java +++ b/core/src/io/anuke/mindustry/world/blocks/units/UnitFactory.java @@ -10,6 +10,7 @@ import io.anuke.mindustry.Vars; import io.anuke.mindustry.content.Fx; import io.anuke.mindustry.entities.Effects; import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.gen.Call; import io.anuke.mindustry.graphics.Pal; @@ -121,7 +122,7 @@ public class UnitFactory extends Block{ @Override public void draw(Tile tile){ UnitFactoryEntity entity = tile.entity(); - TextureRegion region = type.iconRegion; + TextureRegion region = type.icon(Cicon.full); Draw.rect(name, tile.drawx(), tile.drawy()); diff --git a/core/src/io/anuke/mindustry/world/consumers/Consume.java b/core/src/io/anuke/mindustry/world/consumers/Consume.java index be5d0d6af8..2e176cc670 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consume.java +++ b/core/src/io/anuke/mindustry/world/consumers/Consume.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.world.consumers; +import io.anuke.arc.collection.*; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.TileEntity; import io.anuke.mindustry.world.Tile; @@ -17,7 +18,7 @@ public abstract class Consume{ * Apply a filter to items accepted. * This should set all item IDs that are present in the filter to true. */ - public void applyItemFilter(boolean[] filter){ + public void applyItemFilter(Bits filter){ } @@ -25,7 +26,7 @@ public abstract class Consume{ * Apply a filter to liquids accepted. * This should set all liquid IDs that are present in the filter to true. */ - public void applyLiquidFilter(boolean[] filter){ + public void applyLiquidFilter(Bits filter){ } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java index 81503037f0..417148dd72 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItemFilter.java @@ -1,15 +1,15 @@ package io.anuke.mindustry.world.consumers; -import io.anuke.arc.function.Predicate; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Item; -import io.anuke.mindustry.type.Item.Icon; +import io.anuke.arc.collection.*; +import io.anuke.arc.function.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.type.*; import io.anuke.mindustry.ui.*; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.BlockStats; -import io.anuke.mindustry.world.meta.values.ItemFilterValue; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.meta.*; +import io.anuke.mindustry.world.meta.values.*; import static io.anuke.mindustry.Vars.*; @@ -21,8 +21,8 @@ public class ConsumeItemFilter extends Consume{ } @Override - public void applyItemFilter(boolean[] arr){ - content.items().each(filter, item -> arr[item.id] = true); + public void applyItemFilter(Bits arr){ + content.items().each(filter, item -> arr.set(item.id)); } @Override @@ -33,7 +33,7 @@ public class ConsumeItemFilter extends Consume{ @Override public void build(Tile tile, Table table){ MultiReqImage image = new MultiReqImage(); - content.items().each(i -> filter.test(i) && (!world.isZone() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(Icon.large), 1), () -> tile.entity != null && tile.entity.items != null && tile.entity.items.has(item)))); + content.items().each(i -> filter.test(i) && (!world.isZone() || data.isUnlocked(i)), item -> image.add(new ReqImage(new ItemImage(item.icon(Cicon.medium), 1), () -> tile.entity != null && tile.entity.items != null && tile.entity.items.has(item)))); table.add(image).size(8 * 4); } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java index 96f38e4aa3..967685e693 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeItems.java @@ -1,15 +1,14 @@ package io.anuke.mindustry.world.consumers; -import io.anuke.arc.scene.ui.layout.Table; -import io.anuke.mindustry.entities.type.TileEntity; -import io.anuke.mindustry.type.Item.Icon; -import io.anuke.mindustry.type.ItemStack; -import io.anuke.mindustry.ui.ItemImage; -import io.anuke.mindustry.ui.ReqImage; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.meta.BlockStat; -import io.anuke.mindustry.world.meta.BlockStats; -import io.anuke.mindustry.world.meta.values.ItemListValue; +import io.anuke.arc.collection.*; +import io.anuke.arc.scene.ui.layout.*; +import io.anuke.mindustry.entities.type.*; +import io.anuke.mindustry.game.*; +import io.anuke.mindustry.type.*; +import io.anuke.mindustry.ui.*; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.meta.*; +import io.anuke.mindustry.world.meta.values.*; public class ConsumeItems extends Consume{ public final ItemStack[] items; @@ -19,9 +18,9 @@ public class ConsumeItems extends Consume{ } @Override - public void applyItemFilter(boolean[] filter){ + public void applyItemFilter(Bits filter){ for(ItemStack stack : items){ - filter[stack.item.id] = true; + filter.set(stack.item.id); } } @@ -33,7 +32,7 @@ public class ConsumeItems extends Consume{ @Override public void build(Tile tile, Table table){ for(ItemStack stack : items){ - table.add(new ReqImage(new ItemImage(stack.item.icon(Icon.large), stack.amount), () -> tile.entity != null && tile.entity.items != null && tile.entity.items.has(stack.item, stack.amount))).size(8 * 4).padRight(5); + table.add(new ReqImage(new ItemImage(stack.item.icon(Cicon.medium), stack.amount), () -> tile.entity != null && tile.entity.items != null && tile.entity.items.has(stack.item, stack.amount))).size(8 * 4).padRight(5); } } diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java index 943e7da6b2..96d9bc9de1 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquid.java @@ -1,7 +1,9 @@ package io.anuke.mindustry.world.consumers; +import io.anuke.arc.collection.*; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.ui.ReqImage; import io.anuke.mindustry.world.Tile; @@ -17,13 +19,13 @@ public class ConsumeLiquid extends ConsumeLiquidBase{ } @Override - public void applyLiquidFilter(boolean[] filter){ - filter[liquid.id] = true; + public void applyLiquidFilter(Bits filter){ + filter.set(liquid.id); } @Override public void build(Tile tile, Table table){ - table.add(new ReqImage(liquid.getContentIcon(), () -> valid(tile.entity))).size(8 * 4); + table.add(new ReqImage(liquid.icon(Cicon.medium), () -> valid(tile.entity))).size(8 * 4); } @Override diff --git a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java index 04c2efd3ae..3f2ff4ced7 100644 --- a/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java +++ b/core/src/io/anuke/mindustry/world/consumers/ConsumeLiquidFilter.java @@ -1,9 +1,10 @@ package io.anuke.mindustry.world.consumers; -import io.anuke.arc.collection.Array; +import io.anuke.arc.collection.*; import io.anuke.arc.function.Predicate; import io.anuke.arc.scene.ui.layout.Table; import io.anuke.mindustry.entities.type.TileEntity; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.Liquid; import io.anuke.mindustry.ui.MultiReqImage; import io.anuke.mindustry.ui.ReqImage; @@ -23,15 +24,15 @@ public class ConsumeLiquidFilter extends ConsumeLiquidBase{ } @Override - public void applyLiquidFilter(boolean[] arr){ - content.liquids().each(filter, item -> arr[item.id] = true); + public void applyLiquidFilter(Bits arr){ + content.liquids().each(filter, item -> arr.set(item.id)); } @Override public void build(Tile tile, Table table){ Array list = content.liquids().select(l -> !l.isHidden() && filter.test(l)); MultiReqImage image = new MultiReqImage(); - list.each(liquid -> image.add(new ReqImage(liquid.getContentIcon(), () -> tile.entity != null && tile.entity.liquids != null && tile.entity.liquids.get(liquid) >= use(tile.entity)))); + list.each(liquid -> image.add(new ReqImage(liquid.icon(Cicon.medium), () -> tile.entity != null && tile.entity.liquids != null && tile.entity.liquids.get(liquid) >= use(tile.entity)))); table.add(image).size(8 * 4); } diff --git a/core/src/io/anuke/mindustry/world/consumers/Consumers.java b/core/src/io/anuke/mindustry/world/consumers/Consumers.java index 6839237d2b..5693b759a5 100644 --- a/core/src/io/anuke/mindustry/world/consumers/Consumers.java +++ b/core/src/io/anuke/mindustry/world/consumers/Consumers.java @@ -1,5 +1,6 @@ package io.anuke.mindustry.world.consumers; +import io.anuke.arc.collection.*; import io.anuke.arc.function.Predicate; import io.anuke.arc.util.Structs; import io.anuke.mindustry.Vars; @@ -12,8 +13,8 @@ public class Consumers{ private Consume[] map = new Consume[ConsumeType.values().length]; private Consume[] results, optionalResults; - public final boolean[] itemFilters = new boolean[Vars.content.items().size]; - public final boolean[] liquidfilters = new boolean[Vars.content.liquids().size]; + public final Bits itemFilters = new Bits(Vars.content.items().size); + public final Bits liquidfilters = new Bits(Vars.content.liquids().size); public void init(){ results = Structs.filter(Consume.class, map, m -> m != null); diff --git a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java b/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java index 772eb96e9a..71e4643866 100644 --- a/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java +++ b/core/src/io/anuke/mindustry/world/meta/values/AmmoListValue.java @@ -10,8 +10,6 @@ import io.anuke.mindustry.content.*; import io.anuke.mindustry.entities.bullet.*; import io.anuke.mindustry.game.*; import io.anuke.mindustry.gen.*; -import io.anuke.mindustry.type.*; -import io.anuke.mindustry.type.Item.Icon; import io.anuke.mindustry.world.meta.*; import static io.anuke.mindustry.Vars.tilesize; @@ -85,9 +83,6 @@ public class AmmoListValue implements StatValue{ } TextureRegion icon(T t){ - if(t instanceof Item){ - return ((Item)t).icon(Icon.medium); - } - return t.getContentIcon(); + return t.icon(Cicon.medium); } } diff --git a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java index 8f671dbc04..2aceda244f 100644 --- a/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java +++ b/desktop/src/io/anuke/mindustry/desktop/DesktopLauncher.java @@ -26,7 +26,9 @@ import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.ui.*; +import java.io.*; import java.net.*; +import java.nio.charset.*; import java.util.*; import static io.anuke.mindustry.Vars.*; @@ -35,7 +37,13 @@ import static io.anuke.mindustry.Vars.*; public class DesktopLauncher extends ClientLauncher{ public final static String discordID = "610508934456934412"; - boolean useDiscord = OS.is64Bit, showConsole = false; + boolean useDiscord = OS.is64Bit, showConsole = OS.getPropertyNotNull("user.name").equals("anuke"); + + static{ + if(!Charset.forName("US-ASCII").newEncoder().canEncode(System.getProperty("user.name", ""))){ + System.setProperty("com.codedisaster.steamworks.SharedLibraryExtractPath", new File("").getAbsolutePath()); + } + } public static void main(String[] arg){ try{ @@ -125,13 +133,13 @@ public class DesktopLauncher extends ClientLauncher{ if(!SteamAPI.init()){ Log.err("Steam client not running."); }else{ - Vars.steam = true; initSteam(args); - + Vars.steam = true; } - }catch(Exception e){ + }catch(Throwable e){ + steam = false; Log.err("Failed to load Steam native libraries."); - e.printStackTrace(); + Log.err(e); } } } @@ -199,9 +207,6 @@ public class DesktopLauncher extends ClientLauncher{ @Override public Array getExternalMaps(){ - if(steam && SVars.workshop == null){ - SVars.workshop = new SWorkshop(); - } return !steam ? super.getExternalMaps() : SVars.workshop.getMapFiles(); } @@ -215,9 +220,13 @@ public class DesktopLauncher extends ClientLauncher{ SVars.net.friends.activateGameOverlayToWebPage("steam://url/CommunityFilePage/" + mapid); } + @Override + public void viewMapListingInfo(Map map){ + SVars.workshop.viewMapListingInfo(map); + } + @Override public NetProvider getNet(){ - if(steam && SVars.net == null) SVars.net = new SNet(new ArcNetImpl()); return steam ? SVars.net : new ArcNetImpl(); } diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java b/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java index c8bf159796..f6f9a6c3bf 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SNet.java @@ -7,14 +7,13 @@ import com.codedisaster.steamworks.SteamNetworking.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.function.*; -import io.anuke.arc.input.*; import io.anuke.arc.util.*; import io.anuke.arc.util.pooling.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.Version; import io.anuke.mindustry.game.*; -import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.ArcNetImpl.*; +import io.anuke.mindustry.net.*; import io.anuke.mindustry.net.Net.*; import io.anuke.mindustry.net.Packets.*; @@ -302,6 +301,7 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, Log.info("found {0} matches {1}", matches, lobbyDoneCallback); if(lobbyDoneCallback != null){ + Array hosts = new Array<>(); for(int i = 0; i < matches; i++){ try{ SteamID lobby = smat.getLobbyByIndex(i); @@ -316,13 +316,15 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, Gamemode.valueOf(smat.getLobbyData(lobby, "gamemode")), smat.getLobbyMemberLimit(lobby) ); - - lobbyCallback.accept(out); + hosts.add(out); }catch(Exception e){ Log.err(e); } } + hosts.sort(Structs.comparingInt(h -> -h.players)); + hosts.each(lobbyCallback); + lobbyDoneCallback.run(); } } @@ -344,7 +346,7 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, currentLobby = steamID; smat.setLobbyData(steamID, "name", player.name); - smat.setLobbyData(steamID, "mapname", world.getMap() == null ? "Unknown" : world.getMap().name()); + smat.setLobbyData(steamID, "mapname", world.getMap() == null ? "Unknown" : state.rules.zone == null ? world.getMap().name() : state.rules.zone.localizedName); smat.setLobbyData(steamID, "version", Version.build + ""); smat.setLobbyData(steamID, "versionType", Version.type); smat.setLobbyData(steamID, "wave", state.wave + ""); diff --git a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java index 6ebf8792c9..578b00de3c 100644 --- a/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java +++ b/desktop/src/io/anuke/mindustry/desktop/steam/SWorkshop.java @@ -6,6 +6,8 @@ import com.codedisaster.steamworks.SteamUGC.*; import io.anuke.arc.*; import io.anuke.arc.collection.*; import io.anuke.arc.files.*; +import io.anuke.arc.function.*; +import io.anuke.arc.scene.ui.*; import io.anuke.arc.util.*; import io.anuke.mindustry.game.EventType.*; import io.anuke.mindustry.game.*; @@ -20,6 +22,7 @@ public class SWorkshop implements SteamUGCCallback{ private Map lastMap; private Array mapFiles; + private ObjectMap> detailHandlers = new ObjectMap<>(); public SWorkshop(){ int items = ugc.getNumSubscribedItems(); @@ -51,6 +54,8 @@ public class SWorkshop implements SteamUGCCallback{ //update author name when publishing map.tags.put("author", SVars.net.friends.getPersonaName()); + ui.editor.editor.getTags().put("author", map.tags.get("author")); + ui.editor.save(); FloatingDialog dialog = new FloatingDialog("$confirm"); dialog.setFillParent(false); @@ -70,9 +75,100 @@ public class SWorkshop implements SteamUGCCallback{ dialog.show(); } + public void viewMapListingInfo(Map map){ + String id = map.tags.get("steamid"); + long handle = Strings.parseLong(id, -1); + SteamPublishedFileID fid = new SteamPublishedFileID(handle); + + Log.info("Requesting map listing view; id = " + id); + + ui.loadfrag.show(); + SteamUGCQuery query = ugc.createQueryUGCDetailsRequest(fid); + Log.info("POST " + query); + + detailHandlers.put(query, (details, result) -> { + ui.loadfrag.hide(); + + Log.info("Map listing result: " + result + " " + details.getResult() + " " + details.getFileName() + " " + details.getTitle()); + + if(result == SteamResult.OK){ + if(details.getResult() == SteamResult.OK){ + if(details.getOwnerID().equals(SVars.user.user.getSteamID())){ + + FloatingDialog dialog = new FloatingDialog("$editor.mapinfo"); + dialog.setFillParent(false); + dialog.cont.add("$map.menu").pad(20f); + dialog.addCloseButton(); + + dialog.buttons.addImageTextButton("$view.workshop", Icon.linkSmall, () -> { + platform.viewMapListing(id); + dialog.hide(); + }).size(210f, 64f); + + dialog.buttons.addImageTextButton("$map.update", Icon.upgradeSmall, () -> { + new FloatingDialog("$map.update"){{ + setFillParent(false); + cont.margin(10).add("$map.changelog").padRight(6f); + cont.row(); + TextArea field = cont.addArea("", t -> {}).size(500f, 160f).get(); + field.setMaxLength(400); + buttons.defaults().size(120, 54).pad(4); + buttons.addButton("$ok", () -> { + ui.loadfrag.show("$map.publishing"); + lastMap = map; + updateMap(map, details.getPublishedFileID(), field.getText().replace("\r", "\n")); + dialog.hide(); + hide(); + + Log.info("Update map " + map.name()); + }); + buttons.addButton("$cancel", this::hide); + }}.show(); + + }).size(210f, 64f); + dialog.show(); + + }else{ + SVars.net.friends.activateGameOverlayToWebPage("steam://url/CommunityFilePage/" + SteamNativeHandle.getNativeHandle(details.getPublishedFileID())); + } + }else if(details.getResult() == SteamResult.FileNotFound){ + //force-remove tags + ui.editor.editor.getTags().remove("steamid"); + map.tags.remove("steamid"); + ui.editor.save(); + + ui.showErrorMessage("$map.missing"); + }else{ + ui.showErrorMessage(Core.bundle.format("map.load.error", result.name())); + } + }else{ + ui.showErrorMessage(Core.bundle.format("map.load.error", result.name())); + } + }); + + ugc.sendQueryUGCRequest(query); + } + + @Override + public void onRequestUGCDetails(SteamUGCDetails details, SteamResult result){ + + } + @Override public void onUGCQueryCompleted(SteamUGCQuery query, int numResultsReturned, int totalMatchingResults, boolean isCachedData, SteamResult result){ + Log.info("GET " + query); + if(detailHandlers.containsKey(query)){ + if(numResultsReturned > 0){ + SteamUGCDetails details = new SteamUGCDetails(); + ugc.getQueryUGCResult(query, 0, details); + detailHandlers.get(query).accept(details, result); + }else{ + detailHandlers.get(query).accept(null, SteamResult.FileNotFound); + } + + detailHandlers.remove(query); + } } @Override @@ -90,11 +186,6 @@ public class SWorkshop implements SteamUGCCallback{ Log.info("Item unsubscribed from {0}", info.getFolder()); } - @Override - public void onRequestUGCDetails(SteamUGCDetails details, SteamResult result){ - - } - @Override public void onCreateItem(SteamPublishedFileID publishedFileID, boolean needsToAcceptWLA, SteamResult result){ if(lastMap == null){ @@ -108,35 +199,7 @@ public class SWorkshop implements SteamUGCCallback{ Log.info("Create item {0} result {1} {2}", SteamNativeHandle.getNativeHandle(publishedFileID), result, needsToAcceptWLA); if(result == SteamResult.OK){ - SteamUGCUpdateHandle h = ugc.startItemUpdate(SVars.steamID, publishedFileID); - - Gamemode mode = Gamemode.attack.valid(map) ? Gamemode.attack : Gamemode.survival; - FileHandle mapFile = tmpDirectory.child("map_" + publishedFileID.toString()).child("map.msav"); - lastMap.file.copyTo(mapFile); - - Log.info(mapFile.parent().absolutePath()); - Log.info(map.previewFile().absolutePath()); - - ugc.setItemTitle(h, map.name()); - ugc.setItemDescription(h, map.description()); - ugc.setItemTags(h, new String[]{"map", mode.name()}); - ugc.setItemVisibility(h, PublishedFileVisibility.Private); - ugc.setItemPreview(h, map.previewFile().absolutePath()); - ugc.setItemContent(h, mapFile.parent().absolutePath()); - ugc.addItemKeyValueTag(h, "mode", mode.name()); - ugc.submitItemUpdate(h, "Map created"); - - ItemUpdateInfo info = new ItemUpdateInfo(); - - ui.loadfrag.setProgress(() -> { - ItemUpdateStatus status = ugc.getItemUpdateProgress(h, info); - ui.loadfrag.setText("$" + status.name().toLowerCase()); - if(status == ItemUpdateStatus.Invalid){ - ui.loadfrag.setText("$done"); - return 1f; - } - return (float)status.ordinal() / (float)ItemUpdateStatus.values().length; - }); + updateMap(map, publishedFileID, ""); }else{ ui.showErrorMessage(Core.bundle.format("map.publish.error ", result.name())); } @@ -144,6 +207,38 @@ public class SWorkshop implements SteamUGCCallback{ lastMap = null; } + void updateMap(Map map, SteamPublishedFileID publishedFileID, String changelog){ + SteamUGCUpdateHandle h = ugc.startItemUpdate(SVars.steamID, publishedFileID); + + Gamemode mode = Gamemode.attack.valid(map) ? Gamemode.attack : Gamemode.survival; + FileHandle mapFile = tmpDirectory.child("map_" + publishedFileID.toString()).child("map.msav"); + lastMap.file.copyTo(mapFile); + + Log.info(mapFile.parent().absolutePath()); + Log.info(map.previewFile().absolutePath()); + + ugc.setItemTitle(h, map.name()); + ugc.setItemDescription(h, map.description()); + ugc.setItemTags(h, new String[]{"map", mode.name()}); + ugc.setItemVisibility(h, PublishedFileVisibility.Private); + ugc.setItemPreview(h, map.previewFile().absolutePath()); + ugc.setItemContent(h, mapFile.parent().absolutePath()); + ugc.addItemKeyValueTag(h, "mode", mode.name()); + ugc.submitItemUpdate(h, changelog); + + ItemUpdateInfo info = new ItemUpdateInfo(); + + ui.loadfrag.setProgress(() -> { + ItemUpdateStatus status = ugc.getItemUpdateProgress(h, info); + ui.loadfrag.setText("$" + status.name().toLowerCase()); + if(status == ItemUpdateStatus.Invalid){ + ui.loadfrag.setText("$done"); + return 1f; + } + return (float)status.ordinal() / (float)ItemUpdateStatus.values().length; + }); + } + @Override public void onSubmitItemUpdate(SteamPublishedFileID publishedFileID, boolean needsToAcceptWLA, SteamResult result){ ui.loadfrag.hide(); diff --git a/fastlane/metadata/android/en-US/changelogs/89.txt b/fastlane/metadata/android/en-US/changelogs/89.txt new file mode 100644 index 0000000000..89827aa74c --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/89.txt @@ -0,0 +1,15 @@ +- Fixed iOS/Android having frozen multiplayer +- Fixed Veins map not having a silicon source +- Fixed inaccurate enemy shoot prediction +- Fixed server crash exploit +- Fixed panes not scrolling with mousewheel [Desktop] +- Fixed incorrect PvP team assignment +- Fixed not being able to tap 'ok' in UI scale changed dialog +- Fixed not being able to play on PvP maps without orange team +- Fixed error message on exiting server after saved map +- Fixed attack map completion displaying low rank +- Possibly fixed Mac version not starting +- Switched to TCP from UDP - experimental +- Added descriptive display when failing to connect due to version mismatch +- Improved smoothness of multiplayer building, rotation and collision +- Improved power node linking diff --git a/fastlane/metadata/android/en-US/changelogs/93.txt b/fastlane/metadata/android/en-US/changelogs/93.txt new file mode 100644 index 0000000000..c0e7d256af --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/93.txt @@ -0,0 +1,11 @@ +- Added new spawn animations w/ progress bar and names +- Added configurable server whitelist based on player UUID +- Added many new events for plugins +- Added core land animation +- Added player limit for servers +- Added gamemode display for server/save lists +- Added new filechooser for Android, fixes file access on Android 10 +- Added core storage space increase via adjacent vaults or containers +- Made unloader be able to take items from any block +- Improved votekick sensitivity +- Fixed many various bugs diff --git a/fastlane/metadata/android/en-US/changelogs/94.txt b/fastlane/metadata/android/en-US/changelogs/94.txt new file mode 100644 index 0000000000..f967815789 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/94.txt @@ -0,0 +1,8 @@ +- Fixed tutorial displaying Desktop text on Android +- Fixed common crash related to status effects +- Fixed launch pads launching entire core contents +- Fixed new maps overwriting old ones without warning +- Fixed phase conveyors operating on near-0 power +- Fixed incorrect message dialog layout +- Fixed some crashes +- Reverted removal of router passback diff --git a/fastlane/metadata/android/en-US/changelogs/95.txt b/fastlane/metadata/android/en-US/changelogs/95.txt new file mode 100755 index 0000000000..ba151cae49 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/95.txt @@ -0,0 +1,12 @@ +- Fixed zone exploit caused by import of zone saves +- Reverted to old file chooser when possible [Android] +- New multithreaded pathfinding implementation +- Made attack command have units move toward enemy spawnpoints in survival +- Made votekick still tempban people after disconnection +- Added 'rally' command to command center, replaces old patrol command +- Added full Android keyboard support, completely removes any touch input, adds desktop keys +- Added ability to rotate lines while placing [Desktop] [Contributed by Synray] +- Added votekick button +- Added display of power capacity in power graphs +- Added armored conveyors - more armor than titanium, don't accept items from sides +- Added message blocks - editable text diff --git a/fastlane/metadata/android/en-US/summary.txt b/fastlane/metadata/android/en-US/summary.txt new file mode 100644 index 0000000000..b6b5a942cd --- /dev/null +++ b/fastlane/metadata/android/en-US/summary.txt @@ -0,0 +1 @@ +A factory-based sandbox tower defense game. \ No newline at end of file diff --git a/fastlane/metadata/steam/italian/description.txt b/fastlane/metadata/steam/italian/description.txt new file mode 100644 index 0000000000..057956f6d4 --- /dev/null +++ b/fastlane/metadata/steam/italian/description.txt @@ -0,0 +1,60 @@ +Crea un'elaborata filera di nastri trasportatori per rifornire di proiettili le tue torrette, produrre materiali per la costruzione e difendere le tue strutture da ondate di nemici. Gioca con i tuoi amici in multigiocatore cross-platform in partite co-op, oppure afrontali in duelli PVP a squadre. + +[img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img] + +[h2]Gameplay[/h2] + +[list] +[*] Crea trivelle e nastri per trasportare le risorse nel tuo nucleo. +[*] Usa i blocchi per la produzione per creare materiali avanzati. +[*] Costruisci droni per raccogliere risorse automaticamente, assisterti nella costruzione e proteggere la tua base. +[*] Distribuisci i liquidi e combatti l'insorgere d'incendi. +[*] Incrementa la produzione rifornendo di refrigerante e lubrificante le tue torrette e i tuoi blocchi per la produzione. +[/list] + +[h2]Campagna[/h2] + +[list] +[*] Avanza attraverso 12 zone rigiocabili già incluse, con punti di generazione casuali +[*] Raccogli e lancia risorse +[*] Ricerca nuovi blocchi per progredire nella campagna +[*] Configura l'equipaggiamento al lancio per portare risorse personalizzate in ogni zona +[*] Varietà di traguardi ed obiettivi +[*] Invita i tuoi amici per completare le missioni insieme +[*] 120+ blocchi tecnologici da padroneggiare +[*] 19 diversi tipi di droni, mech e navi +[*] 50+ achievement da completare +[/list] + +[h2][h2]Modalità di gioco[/h2][/h2] + +[*] [b]Sopravvivenza[/b]: Costruisci torrette per difenderti dai nemici in questa modalità tower-defense. Sopravvivi più a lungo che puoi e possibilmente lancia il tuo nucleo per utilizzare le risorse raccolte per la ricerca. Prepara la tua base per gli attacchi intermittenti di Boss volanti. +[*] [b]Schermaglia[/b]: Costruisci fabbriche di unità per distruggere i nuclei nemici, proteggendo simultanemante la tua base da ondate di unità nemiche. Crea un esercito di unità offensive e di supporto per assisterti in battaglia. +[*] [b]PvP[/b]: Competi con altri giocatori fino a 4 squadre per distruggere i nuclei avversari. Crea unità o colpisci i nuclei nemici direttamente col tuo mech. +[*] [b]Creativa[/b]: Divertiti con risorse infinite e senza una minaccia nemica. Usa oggetti creativi come le sorgenti di liquidi ed oggetti per testare la tua filiera e genera nemici su richiesta. +[/list] + +[h2]Partite personalizzate & Multigiocatore Cross-Platform[/h2] + +[list] +[*] 12 mappe incluse per partite personalizzate, oltre alla campagna +[*] Gioca in Co-op, PvP o in creativa +[*] Unisciti a server pubblici dedicati o invita i tuoi amici nella tua partita +[*] Regole personalizzate: Cambia il costo dei blocchi, le statistiche dei nemici, le risorse iniziali, il tempo tre le ondate ed altro +[*] Combina le modalità: Unisci PvP e PvE in scontri epici +[/list] + +[h2]Editor di mappe[/h2] + +[list] +[*] Crea il tuo scenario con l'editor +[*] Avvia un'anteprima direttamente dall'editor +[*] Configura gli attrezzi: modifica il funzionamento dei singoli strumenti +[*] Potente sistema di generazione delle mappe, con tantissimi tipi di filtri per la generazione procedurale o manipolazione del terreno +[*] Applica disturbo, distorci, fluidifica, erodi, rendi simmetrica la generazione dei minerali ed il terreno casuale nelle tue mappe +[*] Casualizza e configura la generazione dei minerali, così come il posizionamento di fiumi e caselle delle risorse +[*] Configura le ondate nemiche +[*] Condividi le mappe esportate sul Workshop di Steam +[*] Personalizza le regole delle mappe create +[*] Usa 75+ blocchi ambientali differenti +[/list] diff --git a/fastlane/metadata/steam/italian/short-description.txt b/fastlane/metadata/steam/italian/short-description.txt new file mode 100644 index 0000000000..a0a6a3f214 --- /dev/null +++ b/fastlane/metadata/steam/italian/short-description.txt @@ -0,0 +1 @@ +Un tower defense incentrato sulla gestione delle risorse. diff --git a/fastlane/metadata/steam/ukrainian/achievements.vdf b/fastlane/metadata/steam/ukrainian/achievements.vdf new file mode 100644 index 0000000000..65b55d7f73 --- /dev/null +++ b/fastlane/metadata/steam/ukrainian/achievements.vdf @@ -0,0 +1,109 @@ +"lang" +{ + "Language" "ukrainian" + "Tokens" + { + "NEW_ACHIEVEMENT_20_0_NAME" "Перевірено" + "NEW_ACHIEVEMENT_20_0_DESC" "Завершіть навчання." + "NEW_ACHIEVEMENT_20_1_NAME" "Забіяка" + "NEW_ACHIEVEMENT_20_1_DESC" "Знищьте 1000 ворожих одиниць." + "NEW_ACHIEVEMENT_20_2_NAME" "Чистка" + "NEW_ACHIEVEMENT_20_2_DESC" "Знишьте 100 000 ворожих одиниць." + "NEW_ACHIEVEMENT_20_3_NAME" "Атмосферне перевезення" + "NEW_ACHIEVEMENT_20_3_DESC" "Запустіть 10 000 предметів загалом." + "NEW_ACHIEVEMENT_20_5_NAME" "Нескінченні поставки" + "NEW_ACHIEVEMENT_20_5_DESC" "Запустіть 1000 000 предметів загалом." + "NEW_ACHIEVEMENT_20_6_NAME" "Завойовник" + "NEW_ACHIEVEMENT_20_6_DESC" "Виграйте 10 матчів у режимі атаки." + "NEW_ACHIEVEMENT_20_7_NAME" "Чемпіон" + "NEW_ACHIEVEMENT_20_7_DESC" "Виграйте 10 матчів у режимі PvP." + "NEW_ACHIEVEMENT_20_8_NAME" "Бліц" + "NEW_ACHIEVEMENT_20_8_DESC" "Знищіть вороже ядро в зоні атаки за 5 хвиль або менше." + "NEW_ACHIEVEMENT_20_9_NAME" "Ядерний дощ" + "NEW_ACHIEVEMENT_20_9_DESC" "Запустіть своє ядро в зону 30 разів." + "NEW_ACHIEVEMENT_20_10_NAME" "Наполегливий" + "NEW_ACHIEVEMENT_20_10_DESC" "Виживіть 100 хвиль." + "NEW_ACHIEVEMENT_20_11_NAME" "Неперевершений" + "NEW_ACHIEVEMENT_20_11_DESC" "Виживіть 500 хвиль." + "NEW_ACHIEVEMENT_20_12_NAME" "Дослідник" + "NEW_ACHIEVEMENT_20_12_DESC" "Дослідіть все." + "NEW_ACHIEVEMENT_20_13_NAME" "Перевертень" + "NEW_ACHIEVEMENT_20_13_DESC" "Розблокуйте та перетворіться на кожного меха у грі." + "NEW_ACHIEVEMENT_20_14_NAME" "Перевантаження" + "NEW_ACHIEVEMENT_20_14_DESC" "Нанесіть шкоду мокрому ворогу електрикою." + "NEW_ACHIEVEMENT_20_15_NAME" "Рикошет" + "NEW_ACHIEVEMENT_20_15_DESC" "Знищіть ворога його же власною відбитою кулею." + "NEW_ACHIEVEMENT_20_17_NAME" "ВЕЛИЧЕЗНА ПОМИЛКА" + "NEW_ACHIEVEMENT_20_17_DESC" "Дослідіть маршрутизатора." + "NEW_ACHIEVEMENT_20_18_NAME" "Створення" + "NEW_ACHIEVEMENT_20_18_DESC" "Побудуйте 10 000 блоків." + "NEW_ACHIEVEMENT_20_19_NAME" "Зрівняти з землею" + "NEW_ACHIEVEMENT_20_19_DESC" "Знищьте 1000 ворожих блоків." + "NEW_ACHIEVEMENT_20_20_NAME" "Ефектна катастрофа" + "NEW_ACHIEVEMENT_20_20_DESC" "Торієвий реактор повинен перегрітися й вибихнути." + "NEW_ACHIEVEMENT_20_21_NAME" "Картограф" + "NEW_ACHIEVEMENT_20_21_DESC" "Зробіть 10 мап." + "NEW_ACHIEVEMENT_20_22_NAME" "Веб-переглядач" + "NEW_ACHIEVEMENT_20_22_DESC" "Завантажте карту з Майстерні." + "NEW_ACHIEVEMENT_20_23_NAME" "Творець" + "NEW_ACHIEVEMENT_20_23_DESC" "Опублікуйте карту в Майстерні." + "NEW_ACHIEVEMENT_20_24_NAME" "Убивця" + "NEW_ACHIEVEMENT_20_24_DESC" "Переможіть боса." + "NEW_ACHIEVEMENT_20_25_NAME" "Дослідник" + "NEW_ACHIEVEMENT_20_25_DESC" "Розблокуйте всі зони в кампанії." + "NEW_ACHIEVEMENT_20_26_NAME" "Завершувач" + "NEW_ACHIEVEMENT_20_26_DESC" "Досягніть необхідної хвилі для розблокування конфігурації у всіх зонах." + "NEW_ACHIEVEMENT_20_29_NAME" "Матеріал II" + "NEW_ACHIEVEMENT_20_29_DESC" "Розблокуйте торій." + "NEW_ACHIEVEMENT_20_31_NAME" "Матеріал I" + "NEW_ACHIEVEMENT_20_31_DESC" "Розблокуйте титан." + "NEW_ACHIEVEMENT_21_0_NAME" "Камікадзе" + "NEW_ACHIEVEMENT_21_0_DESC" "Заповніть свого меха вибуховими матеріалами і помріть, створивши вибух." + "NEW_ACHIEVEMENT_21_1_NAME" "Це починається" + "NEW_ACHIEVEMENT_21_1_DESC" "Побудуйте завод мехів «Кинджал»." + "NEW_ACHIEVEMENT_21_2_NAME" "Прямий наступ" + "NEW_ACHIEVEMENT_21_2_DESC" "Видайте команду «Атакувати» за допомогою командного центру." + "NEW_ACHIEVEMENT_21_3_NAME" "Рій" + "NEW_ACHIEVEMENT_21_3_DESC" "100 бойових одиниць повинні бути активними одночасно." + "NEW_ACHIEVEMENT_21_4_NAME" "Зграя" + "NEW_ACHIEVEMENT_21_4_DESC" "10 фантомних дронів повинні бути активними одночасно." + "NEW_ACHIEVEMENT_21_5_NAME" "Летуча армія" + "NEW_ACHIEVEMENT_21_5_DESC" "50 Камікадзе повинні бути активними одночасно." + "NEW_ACHIEVEMENT_21_6_NAME" "Легіони" + "NEW_ACHIEVEMENT_21_6_DESC" "Побудуйте 1000 одиниць загалом." + "NEW_ACHIEVEMENT_21_7_NAME" "Супер" + "NEW_ACHIEVEMENT_21_7_DESC" "Досягніть рангу S на будь-якій зоні." + "NEW_ACHIEVEMENT_21_8_NAME" "А ти молодець" + "NEW_ACHIEVEMENT_21_8_DESC" "Досягніть рангу SS на будь-якій зоні." + "NEW_ACHIEVEMENT_21_9_NAME" "Ти не послухався" + "NEW_ACHIEVEMENT_21_9_DESC" "Помріть у зоні анігіляції." + "NEW_ACHIEVEMENT_21_10_NAME" "Просто натисни Shift" + "NEW_ACHIEVEMENT_21_10_DESC" "Потоніть, якось." + "NEW_ACHIEVEMENT_21_11_NAME" "Збирач" + "NEW_ACHIEVEMENT_21_11_DESC" "Наповніть ядро повністю кожним типом матеріалу." + "NEW_ACHIEVEMENT_21_12_NAME" "Натовп" + "NEW_ACHIEVEMENT_21_12_DESC" "Створіть сервер, на якому буде 10 гравців одночасно." + "NEW_ACHIEVEMENT_21_13_NAME" "Невразливий" + "NEW_ACHIEVEMENT_21_13_DESC" "Побудуйте Катастрофу і Випалювач." + "NEW_ACHIEVEMENT_21_14_NAME" "Зліт" + "NEW_ACHIEVEMENT_21_14_DESC" "Запустіть." + "NEW_ACHIEVEMENT_21_15_NAME" "Компенсація" + "NEW_ACHIEVEMENT_21_15_DESC" "Двічі пропустіть запуск і допустіть знищення ядра ворогом." + "NEW_ACHIEVEMENT_21_16_NAME" "Єресь" + "NEW_ACHIEVEMENT_21_16_DESC" "Побудуйте два маршрутизатори поруч." + "NEW_ACHIEVEMENT_21_17_NAME" "Одинокий захисник" + "NEW_ACHIEVEMENT_21_17_DESC" "Виживіть 10 хвиль в першій-ліпшій зоні без будування будування будь-яких блоків." + "NEW_ACHIEVEMENT_21_18_NAME" "Спалити" + "NEW_ACHIEVEMENT_21_18_DESC" "Використайте піротит в будь-якій башті." + "NEW_ACHIEVEMENT_21_19_NAME" "Ефективність" + "NEW_ACHIEVEMENT_21_19_DESC" "Охолодіть башту водою чи кріогенною рідиною." + "NEW_ACHIEVEMENT_21_20_NAME" "Класичний режим" + "NEW_ACHIEVEMENT_21_20_DESC" "Увімкніть пікселізацію." + "NEW_ACHIEVEMENT_21_21_NAME" "Науковець" + "NEW_ACHIEVEMENT_21_21_DESC" "Відкрийти Wiki з гри." + "NEW_ACHIEVEMENT_21_22_NAME" "Впевнений початок" + "NEW_ACHIEVEMENT_21_22_DESC" "Вивантажіть в зону 10 000 або більше предметів." + "NEW_ACHIEVEMENT_21_23_NAME" "Запалювання" + "NEW_ACHIEVEMENT_21_23_DESC" "Підвищте потужність імпульсного реактора." + } +} diff --git a/fastlane/metadata/steam/ukrainian/description.txt b/fastlane/metadata/steam/ukrainian/description.txt new file mode 100644 index 0000000000..e53e92394b --- /dev/null +++ b/fastlane/metadata/steam/ukrainian/description.txt @@ -0,0 +1,60 @@ +Створюйте складні логістичні мережі для перенесення боєприпасів у башти, видобувайте ресурси для будівництва, і захищайте своє ядро від різних хвиль ворогів. Грайте з друзями на різних платформах у кооперативні ігри, або киньте їм виклик у командних PvP-матчах. + +[img]{STEAM_APP_IMAGE}/extras/ezgif-4-0e70c282f775.gif[/img] + +[h2]Ігровий процес[/h2] + +[list] +[*] Створіть бури і конвеєри для переміщення ресурсів в ядро. +[*] Використовуйте виробничі блоки для створення передових матеріалів. +[*] Створюйте дронів для автоматичного видобутку ресурсів, допомоги в будівництві. +[*] Доставляйте рідини й боріться з осередками вогню. +[*] Збільшуйте виробництво, постачаючи необов’язкові теплоносії та мастила до ваших оборонно-виробничих блоків. +[/list] + +[h2]Кампанія[/h2] + +[list] +[*] Просуньтесь через 12 вбудованих зон з випадковим розташуванням точок появи ворогів. +[*] Збирайте і запускайте ресурси. +[*] Дослідження нових блоків для сприяння прогресу. +[*] Налаштовуйте початкові ресурси для кожної зони +[*] Різноманітність цілей та завдань місій. +[*] Запросіть своїх друзів для спільного виконання місій. +[*] Понад 120 технологічних блоків для освоєння. +[*] 19 різних типів дронів, мехів і кораблів. +[*] Понад 50 досягнень для завершення. +[/list] + +[h2][h2]Ігрові режими[/h2][/h2] + +[*] [b]Виживання[/b]: створіть башти для захисту від ворогів в ігровому процесі, заснованому на захисті башт. Виживайте якомога довше, за бажанням можна запустит своє ядро, щоб використовувати зібрані ресурси для досліджень. Підготуйте свою базу для періодичних атак повітряних босів. +[*] [b]Атака[/b]: будуйте заводи бойових одиниць для знищення ворожих ядер, одночасно захищаючи свою базу від хвиль ворожих одиниць. +[*] [b]PvP[/b]: змагайтеся з іншими гравцями, щоб знищити ядра один одного. Створюйте бойові одиниці або нападайте на інші бази безпосередньо зі своїми мехами. Створіть різноманітні типи підтримувальиних та наступальних підрозділів, щоб допоможуть вам у досягненні цілей. +[*] [b]Пісочниця[/b]: грайте з нескінченними ресурсами без загрози з боку ворога. Використовуйте специфічні для пісочниці елементи та блоки рідких джерел для тестування конструкцій та появи ворогів за запитом. +[/list] + +[h2]Користувацькі ігри & багатоплатформовий мультиплеєр[/h2] + +[list] +[*] 12 вбудованих мап на додаток кампанії. +[*] Грайте в кооперативі, PvP чи пісочниці. +[*] Приєднуйтесь до загальнодоступного сервера, або запросіть друзів на свій приватний сеанс. +[*] Користувацькі налаштування гри — ціна блоків, сила ворогів, кількість початкових ресурсів, інтервал між хвилями, тощо. +[*] Змішуйте і поєднуйте ігрові режими — комбінуйте PvP і PvE режими разом. +[/list] + +[h2]Користувацький редактор мап[/h2] + +[list] +[*] Створюйте ландшафт за допомогою візуального редактора. +[*] Змінюйте і переглядайте споруди так само як в грі. +[*] Регульовані режими інструментів — змініть функціонування кожного інструменту. +[*] Потужна система генерації мап, що має безліч різних типів фільтрів для процедурного маніпулювання місцевістю. +[*] Застосуйте на своїх мапах шум, спотворення, згладжування, ерозію, симетрію, генерацію руди та випадкову генерацію місцевості. +[*] Відкрита гра в жанрі «захист башт» з акцентом на керуванні ресурсами. +[*] Розкладки хвиль для мап можна налаштувати. +[*] Поширюйте експортовані мапи в Майстерні Steam. +[*] Правила для мап можна налаштувати. +[*] Використовуйте понад 75 видів блоків навколишнього середовища. +[/list] diff --git a/fastlane/metadata/steam/ukrainian/short-description.txt b/fastlane/metadata/steam/ukrainian/short-description.txt new file mode 100644 index 0000000000..95bce25229 --- /dev/null +++ b/fastlane/metadata/steam/ukrainian/short-description.txt @@ -0,0 +1 @@ +Нескінченна гра у жанрі «захист вежі» з акцентом на керуванні ресурсами. diff --git a/gradle.properties b/gradle.properties index f5a430ccc2..8a43b1cc6a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=5bf89742e927d1951c58cc2743814874c1c9ad25 +archash=e17b152d4f597837640fe4d659ca5a820e8a2b15 diff --git a/ios/src/io/anuke/mindustry/IOSLauncher.java b/ios/src/io/anuke/mindustry/IOSLauncher.java index 6867ff01f7..0b0cf974f5 100644 --- a/ios/src/io/anuke/mindustry/IOSLauncher.java +++ b/ios/src/io/anuke/mindustry/IOSLauncher.java @@ -13,7 +13,6 @@ import io.anuke.mindustry.io.*; import io.anuke.mindustry.ui.*; import org.robovm.apple.foundation.*; import org.robovm.apple.uikit.*; -import org.robovm.apple.uikit.UIBarButtonItem.*; import org.robovm.objc.block.*; import java.io.*; @@ -59,7 +58,7 @@ public class IOSLauncher extends IOSApplication.Delegate{ if(documentURLs.size() < 1) return; cont.dismissViewController(true, () -> {}); - cons.accept(Core.files.absolute(documentURLs.get(0).getPath())); + controller.importDocument(documentURLs.get(0), new NSURL(getDocumentsDirectory() + "/document"), UIDocumentBrowserImportMode.Copy, (url, error) -> cons.accept(Core.files.absolute(url.getPath()))); } @Override diff --git a/server/src/io/anuke/mindustry/server/MindustryServer.java b/server/src/io/anuke/mindustry/server/MindustryServer.java index 92c3303c52..c42e695c1d 100644 --- a/server/src/io/anuke/mindustry/server/MindustryServer.java +++ b/server/src/io/anuke/mindustry/server/MindustryServer.java @@ -1,9 +1,9 @@ package io.anuke.mindustry.server; import io.anuke.arc.*; -import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.core.*; +import io.anuke.mindustry.mod.*; import static io.anuke.mindustry.Vars.*; @@ -28,5 +28,9 @@ public class MindustryServer implements ApplicationListener{ Core.app.addListener(logic = new Logic()); Core.app.addListener(netServer = new NetServer()); Core.app.addListener(new ServerControl(args)); + + mods.each(Mod::init); } + + } diff --git a/server/src/io/anuke/mindustry/server/ServerControl.java b/server/src/io/anuke/mindustry/server/ServerControl.java index fd1c0ca1bd..a78792306a 100644 --- a/server/src/io/anuke/mindustry/server/ServerControl.java +++ b/server/src/io/anuke/mindustry/server/ServerControl.java @@ -18,10 +18,9 @@ import io.anuke.mindustry.gen.*; import io.anuke.mindustry.io.*; import io.anuke.mindustry.maps.Map; import io.anuke.mindustry.maps.*; +import io.anuke.mindustry.mod.Mods.*; import io.anuke.mindustry.net.Administration.*; import io.anuke.mindustry.net.Packets.*; -import io.anuke.mindustry.plugin.*; -import io.anuke.mindustry.plugin.Plugins.*; import io.anuke.mindustry.type.*; import java.io.*; @@ -51,8 +50,6 @@ public class ServerControl implements ApplicationListener{ private PrintWriter socketOutput; public ServerControl(String[] args){ - plugins = new Plugins(); - Core.settings.defaults( "shufflemode", "normal", "bans", "", @@ -110,9 +107,6 @@ public class ServerControl implements ApplicationListener{ Effects.setScreenShakeProvider((a, b) -> {}); Effects.setEffectProvider((a, b, c, d, e, f) -> {}); - //load plugins - plugins.load(); - registerCommands(); Core.app.post(() -> { @@ -134,7 +128,6 @@ public class ServerControl implements ApplicationListener{ }); customMapDirectory.mkdirs(); - pluginDirectory.mkdirs(); Thread thread = new Thread(this::readCommands, "Server Controls"); thread.setDaemon(true); @@ -155,7 +148,7 @@ public class ServerControl implements ApplicationListener{ maps.shuffle(); Map previous = world.getMap(); - Map map = maps.find(m -> m != previous); + Map map = maps.find(m -> m != previous || maps.size == 1); if(map != null){ @@ -168,6 +161,8 @@ public class ServerControl implements ApplicationListener{ info("Selected next map to be {0}.", map.name()); play(true, () -> world.loadMap(map, map.applyRules(lastMode))); + }else{ + Log.err("No suitable map found."); } } }else{ @@ -177,11 +172,8 @@ public class ServerControl implements ApplicationListener{ } }); - //initialize plugins - plugins.each(io.anuke.mindustry.plugin.Plugin::init); - - if(!plugins.all().isEmpty()){ - info("&lc{0} plugins loaded.", plugins.all().size); + if(!mods.all().isEmpty()){ + info("&lc{0} mods loaded.", mods.all().size); } info("&lcServer loaded. Type &ly'help'&lc for help."); @@ -324,28 +316,28 @@ public class ServerControl implements ApplicationListener{ } }); - handler.register("plugins", "Display all loaded plugins.", arg -> { - if(!plugins.all().isEmpty()){ - info("Plugins:"); - for(LoadedPlugin plugin : plugins.all()){ - info(" &ly{0} &lcv{1}", plugin.meta.name, plugin.meta.version); + handler.register("mods", "Display all loaded mods.", arg -> { + if(!mods.all().isEmpty()){ + info("Mods:"); + for(LoadedMod mod : mods.all()){ + info(" &ly{0} &lcv{1}", mod.meta.name, mod.meta.version); } }else{ - info("No plugins found."); + info("No mods found."); } - info("&lyPlugin directory: &lb&fi{0}", pluginDirectory.file().getAbsoluteFile().toString()); + info("&lyMod directory: &lb&fi{0}", modDirectory.file().getAbsoluteFile().toString()); }); - handler.register("plugin", "", "Display information about a loaded plugin.", arg -> { - LoadedPlugin plugin = plugins.all().find(p -> p.meta.name.equalsIgnoreCase(arg[0])); - if(plugin != null){ - info("Name: &ly{0}", plugin.meta.name); - info("Version: &ly{0}", plugin.meta.version); - info("Author: &ly{0}", plugin.meta.author); - info("Path: &ly{0}", plugin.jarFile.path()); - info("Description: &ly{0}", plugin.meta.description); + handler.register("mod", "", "Display information about a loaded plugin.", arg -> { + LoadedMod mod = mods.all().find(p -> p.meta.name.equalsIgnoreCase(arg[0])); + if(mod != null){ + info("Name: &ly{0}", mod.meta.name); + info("Version: &ly{0}", mod.meta.version); + info("Author: &ly{0}", mod.meta.author); + info("Path: &ly{0}", mod.file.path()); + info("Description: &ly{0}", mod.meta.description); }else{ - info("No plugin with name &ly'{0}'&lg found."); + info("No mod with name &ly'{0}'&lg found."); } }); @@ -757,8 +749,9 @@ public class ServerControl implements ApplicationListener{ info("&ly{0}&lg MB collected. Memory usage now at &ly{1}&lg MB.", pre - post, post); }); - plugins.each(p -> p.registerServerCommands(handler)); - plugins.each(p -> p.registerClientCommands(netServer.clientCommands)); + mods.each(p -> p.registerServerCommands(handler)); + //TODO + //plugins.each(p -> p.registerClientCommands(netServer.clientCommands)); } private void readCommands(){ diff --git a/tests/src/test/java/ApplicationTests.java b/tests/src/test/java/ApplicationTests.java index a632849dcc..23f5f876b0 100644 --- a/tests/src/test/java/ApplicationTests.java +++ b/tests/src/test/java/ApplicationTests.java @@ -45,6 +45,7 @@ public class ApplicationTests{ public void setup(){ headless = true; net = new Net(null); + tree = new FileTree(); Vars.init(); content.createContent(); diff --git a/tests/src/test/java/power/PowerTestFixture.java b/tests/src/test/java/power/PowerTestFixture.java index 8afe8115e2..e7b26c3447 100644 --- a/tests/src/test/java/power/PowerTestFixture.java +++ b/tests/src/test/java/power/PowerTestFixture.java @@ -5,6 +5,7 @@ import io.anuke.arc.util.*; import io.anuke.mindustry.*; import io.anuke.mindustry.content.*; import io.anuke.mindustry.core.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; import io.anuke.mindustry.world.blocks.power.*; @@ -26,7 +27,12 @@ public class PowerTestFixture{ @BeforeAll static void initializeDependencies(){ Core.graphics = new FakeGraphics(); - Vars.content = new ContentLoader(); + Vars.content = new ContentLoader(){ + @Override + public void handleMappableContent(MappableContent content){ + + } + }; content.createContent(); Log.setUseColors(false); Time.setDeltaProvider(() -> 0.5f); diff --git a/tests/src/test/java/power/PowerTests.java b/tests/src/test/java/power/PowerTests.java index e9da0784ba..3c6e20e288 100644 --- a/tests/src/test/java/power/PowerTests.java +++ b/tests/src/test/java/power/PowerTests.java @@ -1,16 +1,14 @@ package power; -import io.anuke.arc.Core; -import io.anuke.arc.math.Mathf; +import io.anuke.arc.*; +import io.anuke.arc.math.*; import io.anuke.arc.util.*; -import io.anuke.mindustry.world.Tile; -import io.anuke.mindustry.world.blocks.power.PowerGenerator; -import io.anuke.mindustry.world.blocks.power.PowerGraph; -import io.anuke.mindustry.world.consumers.ConsumePower; +import io.anuke.mindustry.world.*; +import io.anuke.mindustry.world.blocks.power.*; +import io.anuke.mindustry.world.consumers.*; import org.junit.jupiter.api.*; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.DynamicTest.dynamicTest; /** diff --git a/tools/src/io/anuke/mindustry/Generators.java b/tools/src/io/anuke/mindustry/Generators.java index e604f4ca3a..38c4a9cf15 100644 --- a/tools/src/io/anuke/mindustry/Generators.java +++ b/tools/src/io/anuke/mindustry/Generators.java @@ -1,23 +1,21 @@ package io.anuke.mindustry; -import io.anuke.arc.graphics.Color; -import io.anuke.arc.graphics.g2d.Draw; -import io.anuke.arc.graphics.g2d.TextureRegion; -import io.anuke.arc.math.Mathf; -import io.anuke.arc.util.Log; -import io.anuke.arc.util.noise.RidgedPerlin; -import io.anuke.mindustry.ImagePacker.GenRegion; +import io.anuke.arc.collection.*; +import io.anuke.arc.graphics.*; +import io.anuke.arc.graphics.g2d.*; +import io.anuke.arc.math.*; +import io.anuke.arc.util.*; +import io.anuke.arc.util.noise.*; +import io.anuke.mindustry.ImagePacker.*; +import io.anuke.mindustry.game.*; import io.anuke.mindustry.type.*; -import io.anuke.mindustry.world.Block; -import io.anuke.mindustry.world.Block.Icon; +import io.anuke.mindustry.world.*; import io.anuke.mindustry.world.blocks.*; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; +import java.io.*; +import java.nio.file.*; -import static io.anuke.mindustry.Vars.content; -import static io.anuke.mindustry.Vars.tilesize; +import static io.anuke.mindustry.Vars.*; public class Generators{ @@ -143,15 +141,14 @@ public class Generators{ } } - image.save(block.name + "-icon-full"); + image.save("block-" + block.name + "-full"); image.save("../editor/" + block.name + "-icon-editor"); - for(Icon icon : Icon.values()){ - if(icon.size == 0) continue; + for(Cicon icon : Cicon.scaled){ Image scaled = new Image(icon.size, icon.size); scaled.drawScaled(image); - scaled.save("../ui/" + block.name + "-icon-" + icon.name()); + scaled.save("../ui/block-" + block.name + "-" + icon.name()); } Color average = new Color(); @@ -182,13 +179,13 @@ public class Generators{ }); ImagePacker.generate("item-icons", () -> { - for(Item item : content.items()){ - Image base = ImagePacker.get("item-" + item.name); - for(Item.Icon icon : Item.Icon.values()){ - if(icon.size == base.width) continue; + for(UnlockableContent item : (Array)(Array)Array.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; Image image = new Image(icon.size, icon.size); image.drawScaled(base); - image.save("item-" + item.name + "-" + icon.name(), false); + image.save(item.getContentType().name() + "-" + item.name + "-" + icon.name(), false); } } }); @@ -213,12 +210,12 @@ public class Generators{ image.draw(mech.weapon.region, i * (int)mech.weaponOffsetX*4 + off, -(int)mech.weaponOffsetY*4 + off, i > 0, false); } - image.save("mech-icon-" + mech.name); + image.save("mech-" + mech.name + "-full"); } }); ImagePacker.generate("unit-icons", () -> { - content.getBy(ContentType.unit).each(type -> !type.isFlying, type -> { + content.getBy(ContentType.unit).each(type -> !type.flying, type -> { type.load(); type.weapon.load(); @@ -236,7 +233,7 @@ public class Generators{ b, false); } - image.save("unit-icon-" + type.name); + image.save("unit-" + type.name + "-full"); }); }); @@ -268,12 +265,11 @@ public class Generators{ image.save("../editor/editor-ore-" + item.name + (i + 1)); //save icons - image.save(ore.name + "-icon-full"); - for(Icon icon : Icon.values()){ - if(icon.size == 0) continue; + image.save("block-" + ore.name + "-full"); + for(Cicon icon : Cicon.scaled){ Image scaled = new Image(icon.size, icon.size); scaled.drawScaled(image); - scaled.save(ore.name + "-icon-" + icon.name()); + scaled.save("block-" + ore.name + "-" + icon.name()); } } });